; define variables adtable EQU 0x39 ; adc result table 8 bytes chan EQU 0x41 ; channel no val EQU 0x42 ; word size adc result variable oldb EQU 0x44 ; last portb value char EQU 0x45 ; single character command command EQU 0x46 ; upper 4 bits of command n EQU 0x47 ; lower 4 bits of command m EQU 0x48 ; byte size temporary variable wrd EQU 0x49 ; word size temporary variable ; start up ORG 0x0000 BCF PCLATH,3 BCF PCLATH,4 GOTO start ; Interrupt always at address 0004 ORG 0x0004 MOVWF W_TEMP ; save registers SWAPF STATUS,W CLRF STATUS MOVWF STATUS_TEMP CALL ISR ; call interrupt service routine SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W ; restore registers RETFIE start: ; setup PIC BSF STATUS,RP0 ; select page 1 MOVLW 0x72 MOVWF 0x0F ; set internal RC select to 8MHz MOVLW 0xC0 MOVWF 0x06 ; set PORTB 0-5 pins as outputs, 6 & 7 inputs ; initialise adc MOVLW 0xFF MOVWF 0x05 ; set portA as input MOVLW 0x0F MOVWF 0x1B ; set PORTA pins 0-3 as analog inputs MOVLW 0x80 MOVWF 0x1F ; set 10 bit A/D result format right justify ADRESH/L BCF STATUS,RP0 ; select page 0 MOVLW 0xC1 MOVWF 0x1F ; set A/D conversion clock to internal source, turn on adc BSF STATUS,RP0 ; select page 1 MOVLW 0x7F MOVWF 0x01 ; enable PORTB weak pullups for inputs 6 & 7 ; setup UART BSF STATUS,RP0 ; select page 1 BSF 0x0C,5 ; enable UART RX interrupt MOVLW 0x08 MOVWF SPBRG ; set UART BAUD rate 57600 BSF TRISB,2 BSF TRISB,5 ; set PORTB bits 2 and 5 as outputs for UART MOVLW 0x24 MOVWF TXSTA ; enable Transmitter set High BAUD rate select bit BCF STATUS,RP0 MOVLW 0x90 MOVWF RCSTA ; enable Serial port, continuous enable receiver MOVLW 0xC8 MOVWF 0x0B ; enable GIE, PEIE and RBIE for UART ; initialise variables BCF STATUS,RP0 ; select page 0 CLRF 0x06 ; clear PORTB MOVLW 0xC0 ANDWF 0x06,W MOVWF oldb ; last value of PORTB bits 6 & 7 for change of state ; Send "OK" ; start up ok MOVLW "O" CALL TXD MOVLW "K" CALL TXD