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 count EQU 0x78 count_buf EQU 0x79 del1 EQU 0x75 del2 EQU 0x76 del3 EQU 0x77 ;********************************************************************** 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 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 clrf count_buf ;Clear count_buf register movlw 0x40 movwf count ;Load count with 64 call USART_initialize call USART_Baud_rate_adjust CALL ADC_initialize core_loop change;Eingangsspannung bcf STATUS, RP0 bcf STATUS, RP1 BSF ADCON0, 2 ; ADC start loop btfsc ADCON0, 2 ; is the ADC finished? goto loop ; no, continue to wait ; Send ADRESH or ADRES to PORTB ; movfw ADRESH ; upper 8 bits pick out ; movwf PORTB ; upper 8-bits after PortB bsf STATUS, RP0 ; Bank1 movfw ADRESL ; upper 8 bits pick out bcf STATUS, RP0 ; Bank0 movwf PORTB decfsz count ; Decrement count skip if zero goto reload movfw count ; Place count to w register movwf count_buf ; Place w to count_buf register decf count_buf ; Decrease count_buf by one hence when 64->63....1->0 bsf STATUS, RP0 ; Bank1 movfw ADRESL ; Load TO W the lower 2 bits from AD conversion DD00 0000 D->Data bits iorwf count_buf,1 ; DD00 0000 OR ((63) 0011 1111