list p=16F84A ; list directive to define processor
#include <p16F84A.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF& _PWRTE_OFF & _HS_OSC
;***** HARDWARE CONNECTIONS:
RA0 = DataOut (input) - RA1 = I/O clock (output) - RA2 = CS\ (output)
PORTB = ADC output monitor (8 LED, active low)
;***** VARIABLE DEFINITIONS:
COUNT EQU 0x0C ; variable used for delay
RESULT EQU 0x0D ; conversion result byte
;***** PROGRAM:
ORG 0x000 ; (01) processor reset vector
goto INIT ; (02) go to beginning of program
INIT bsf STATUS,5 ; (03) go to bank1
movlw 00h ; (04) 00h -> W
movwf TRISB ; (05) PORTB = output
movlw 01h ; (06) 01h -> W
movwf TRISA ; (07) RA0 = input, other PORTA pins are output
bcf STATUS,5 ; (08) back to bank0
MAIN bcf PORTA,2 ; (09) CS\ low -> MSB available @ DataOut
call SHIFTIN ; (10) get DB7 (MSB)
call IOCLOCK ; (11)
call SHIFTIN ; (12) get DB6
call IOCLOCK ; (13)
call SHIFTIN ; (14) get DB5
call IOCLOCK ; (15)
call SHIFTIN ; (16) get DB4
call IOCLOCK ; (17)
call SHIFTIN ; (18) get DB3
call IOCLOCK ; (19)
call SHIFTIN ; (20) get DB2
call IOCLOCK ; (21)
call SHIFTIN ; (22) get DB1
call IOCLOCK ; (23)
call SHIFTIN ; (24) get DB0 (LSB)
call IOCLOCK ; (25)
bsf PORTA,2 ; (26) CS\ high -> TLC549 starts next conversion
comf RESULT,W ; (27) complement result & result -> W (see text)
movwf PORTB ; (28) result -> PORTB (see text)
call DELAY ; (29) wait at least 17us (TLC549 datasheet)
goto MAIN ; (30) endless loop
SHIFTIN rrf PORTA,f ; (31) DataOut -> Carry
rlf RESULT,f ; (32) shift carry (= DataOut) into result byte
return ; (33)
IOCLOCK bsf PORTA,1 ; (34) I/O clock high
call DELAY ; (35)
bcf PORTA,1 ; (36) I/O clock low
call DELAY ; (37)
return ; (38)
DELAY decfsz COUNT,f ; (39)
goto DELAY ; (40)
return ; (41)
end ; (42)