; internal RC osc and 300 baud
LIST P=18F4550, F=INHX32 ; directive to define processor
#include <P18F4550.INC> ; processor specific variable definitions
;**************************************************************************
; Oscillator Selection:
CONFIG WDT=OFF ; disable watchdog timer
CONFIG MCLRE = ON ; MCLEAR Pin on
CONFIG LVP = OFF ; disable low voltage programming
CONFIG FOSC = INTOSCIO_EC ; internal oscillator
CONFIG PBADEN = OFF ; PORTB all digital
;**************************************************************************
; Reset vector
; This code will start executing when a reset occurs.
RESET_VECTOR CODE 0x0000
goto Start ; go to start of main code
;**************************************************************************
; Start of main program
Start:
; Initial clearing of all registers involved
CLRF WREG
CLRF PORTD
CLRF TRISD
CLRF PORTB
CLRF TRISB
CLRF TXSTA
; BAUD RATE GENERATION
MOVLW D'12'
MOVWF SPBRG
; ENABLING SERIAL PORT
MOVLW B'10000000'
MOVWF RCSTA
; ASYNCHRONOUS TRANSMIT MODE SELECTION
MOVLW B'00100000'
MOVWF TXSTA
; ADC programming begins here.
; VSS,VDD ref. AN0 analog only
MOVLW B'00001110'
MOVWF ADCON1
; clear ADCON0 to select channel 0 (AN0)
CLRF ADCON0
; ADCON2 setup: Left justified, Tacq=2Tad, Tad=1/FRC (Internal RC Oscillator)
MOVLW B'10001011'
MOVWF ADCON2
; Enable A/D Conversion Module
BSF ADCON0,ADON
MainLoop:
CLRF ADRESH
CLRF ADRESL
BSF ADCON0,GO_DONE ; Start A/D Conversion
adc:
BTFSC ADCON0,GO_DONE ; Loop here until A/D conversion completes
GOTO adc
MOVFF ADRESH, PORTB ; ADC result high register transferred to Port D
MOVFF ADRESL, PORTD ; ADC result low register transferred to Port B
Transmission:
MOVF ADRESL, W ; get low byte of analogue value
CALL TRANSMIT ; send unformatted to serial
CALL DELAY
GOTO MainLoop ; Sampling of next value initiated
TRANSMIT:
LABEL:
BTFSS PIR1, TXIF ; wait for transmit buffer empty
GOTO LABEL
MOVWF TXREG ; send the byte in W reg
RETURN
DELAY:
MOVLW 0Xff
DCFSNZ WREG
GOTO DELAY
RETURN
END