list p=16f876A ; list directive to define processor #include ; processor specific variable definitions __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF ; '__CONFIG' directive is used to embed configuration data within .asm file. ; The lables following the directive are located in the respective .inc file. ; See respective data sheet for additional information on configuration word. ;***** VARIABLE DEFINITIONS w_temp EQU 0x71 ; variable used for context saving status_temp EQU 0x72 ; variable used for context saving pclath_temp EQU 0x73 ; variable used for context saving indications EQU 0x74 WAIT EQU 0x20 ;********************************************************************** ORG 0x000 ; processor reset vector nop ; nop required for icd goto main ; go to beginning of program ORG 0x004 ; interrupt vector location int movwf w_temp ; save off current W register contents movf STATUS,w ; move status register into W register movwf status_temp ; save off contents of STATUS register movf PCLATH,w ; move pclath register into w register movwf pclath_temp ; save off contents of PCLATH register ; isr code can go here or be located as a call subroutine elsewhere ;RS232-Empfaenger-Interupt? btfss PIR1, RCIF goto intEnde ; Interrupt came of where differently movfw RCREG ; RS232-Register select movwf indications ; and into the memory after 'indications' write write movwf PORTB ; Indications at the PortB indicate bcf PIR1, RCIF ; interrupt flag delete RS232out btfss PIR1, TXIF ; is transmitter empty? goto RS232out ; no, not yet empty movfw indications ; next byte get movwf TXREG ; and into the RS232-Sender write intEnde movf pclath_temp,w ; retrieve copy of PCLATH register movwf PCLATH ; restore pre-isr PCLATH register contents movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f swapf w_temp,w ; restore pre-isr W register contents retfie ; return from interrupt main ; remaining code goes here bcf STATUS, RP0 bcf STATUS, RP1 clrf PORTB bsf STATUS,RP0 movlw 0x00 movwf TRISB bcf STATUS,RP0 clrf PORTB call USART_initialize call USART_Baud_rate_adjust CALL prepare_Interrupts CALL ADC_initialize core_loop change;Eingangsspannung BSF ADCON0, 2 ; ADC start loop BTFSC ADCON0, 2 ; is the ADC finished? GOTO loop ; no, continue to wait ; Worth after PortB write movfw ADRESH ; upper 8 bits pick out movwf PORTB ; upper 8-bits after PortB ; Control rooms, so that the ADC can recover clrf WAIT wait DECFSZ WAIT, f goto wait goto core_loop ADC_initialize bcf STATUS, RP0 ; Bank0 ; ADC switch on BSF ADCON0, 0 ; ADON=1 ; ADC entrance AN0 select BCF ADCON0, 5 ; ADCHS2=0 BCF ADCON0, 4 ; ADCHS1=0 BCF ADCON0, 3 ; ADCHS0=0 ; ADC speed for 20 MHz adjust BSF ADCON0, 7 ; ADCS1=1 BCF ADCON0, 6 ; ADCS0=0 ; Data left justified BSF STATUS, RP0 ; Bank1 BCF ADCON1, 7 ; ADFM=0 BCF STATUS, RP0 ; Bank0 RETURN prepare_Interrupts ;Interrupts BSF STATUS, RP0 ; Bank1 BSF PIE1, RCIE ; Enable receive interrupts BCF STATUS, RP0 ; Bank 0 clrf PIR1 ; all interrupt flags delete clrf PIR2 BSF INTCON, GIE ; generally permit interrupts BSF INTCON, PEIE ; Interrupts of peripheral devices permit RETURN USART_initialize BSF STATUS, RP0 ; Bank1 MOVLW 0x24 ; Transmitter:RS232 , BRGH bit is set MOVWF TXSTA ; BCF STATUS, RP0 ; Bank 0 MOVLW 0x90 ; Enable serial port, 8bit reception , MOVWF RCSTA ; continuous receive RETURN USART_Baud_rate_adjust BSF STATUS, RP0 ; Bank1 MOVLW 0x81 ; Set Baud guesses 9,6 KB with Fosc=20MHz MOVWF SPBRG RETURN END ; directive 'end of program'