di3441l1.txt ;********************************************************************************* ; ; LISTING 1 - C PROGRAM FOR CONTROLLING THE PHOTOTIMER ; ; "Build a simple one-chip phototimer," EDN, July 8, 2004, pg 86. ; ;********************************************************************************* ***************************************** * PhotoTimer (uC 908QT2) * ***************************************** $list *fosc=12.8 MHz by internal oscillator *908QT2 ADDRESSES prtA equ $0000 ddrA equ $0004 pAipu equ $000b config2 equ $001e config1 equ $001f IRQscr equ $001d TSCR equ $0020 TMODH equ $0023 TMODL equ $0024 ADSCR equ $003c ADR equ $003e RAM equ $0080 ROM equ $f800 *PortA I/O DESIGNATION LED0 equ 0 ;output LED1 equ 1 ;output sw equ 2 ;input IRQ lamp equ 4 ;output phcell equ 5 ;input ADC *EQUATES Vp equ $52 ;>1.6V night photocell threshold dark equ 0 ;Flag for darkness *VARIABLES org RAM Mode rmb 1 ;mode register {0,1,2,3} HR rmb 1 ;register for Hours flag rmb 1 ;flag register cnt01s rmb 1 ;delay 0.1 ses counter cntSEC rmb 1 ;seconds counter cntMIN rmb 1 ;minutes counter cntHR rmb 1 ;hours counter .page *INITIALIZATION org ROM init bset 0,config1; COP disable mov #%01000000,config2;set internal Osc, ;IRQ with pull-up, disable RST lda $ffc0 ;set fosc tolerance < 5% sta $0038 ldx #6T ;clear 7 variables c0 clr RAM,x dbnzx c0 clr RAM clr prtA; set LED0,LED1,Lamp off mov #%00010011,ddrA; set I/O prtA mov #%00100000,pAipu;set pull-up pA5 mov #%01110110,TSCR; TOFInt enable, ;stop&clear Timer,set prescaler=64 mov #$c3,TmodH ;set TOF period=1sec mov #$50,TmodL ; by $c350-->TMOD mov #1T,HR ;set 1hour delay cli ;set Interrupt enable jsr ClrTimCnt ;clear time counters bclr 5,TSCR ;start TIMER .page start lda cntSEC ;delay 3 sec to choose Mode add #3T d3s cmp cntSEC bne d3s Main jsr PhotoChk ;wait for a night brclr dark,flag,main ;It is NOT dark? jsr ClrTimCnt ;clear time counters bset lamp,prtA ;lamp on work lda cntHR ;check time CBEQ HR,done ;is time=HR? bra work done bclr lamp,prtA ;lamp off jsr ClrTimCnt ;clear time counters Dly2h ldx cntHR ;Delay for 2 hours cpx #2T ;cntHR<2? blo Dly2h Dwait jsr PhotoChk ;wait for a dawn brset dark,flag,Dwait ;Is it still dark? bra Main *************************************************** PhotoChk mov #%00000011,ADscr ;start ADC3 pA5 brclr 7,ADscr,* ;wait for ADC3 end lda ADR ;ADC3 data--> Acc mov #%00011111,ADscr ;stop ADC3 bset dark,flag ;1-->dark cmp #Vp ;ADC3 data > Vp ? bhi ph0 ; bclr dark,flag ;0-->dark ph0 rts ************************************************ ClrTimCnt clr cntSEC clr cntMIN clr cntHR rts .page TimInt inc cntSEC; every TOF=1sec lda cntSEC cmp #60T ; 1sec x60=1min blo t0 clr cntSEC inc cntMIN lda cntMIN cmp #60T ; 1min x60=1hour blo t0 clr cntMIN INC cntHR t0 lda TSCR ; reset TOF bclr 7,TSCr; 0-->TOF bit rti ******************************************* TabHR fcb 1,2,4,6 TabLED fcb 0,1,2,3 ******************************************* ExtInt inc Mode ;go to the next mode ldx Mode ;Mode-->X cpx #3 ;if X>3,set mode0 bls e0 clr Mode ;0--> Mode clrx ;0-->X e0 clrH ;0-->H lda TabHR,x ;TabHR,x -->HR sta HR lda prtA ;set LED and #%11111100 ;erase old LED ora TabLED,x ;TabLED,x -->LED sta prtA jsr dly01s ;debouncing delay jsr dly01s jsr dly01s bset 2,IRQscr ;IRQ reset rti ******************************************* dly01s ldx #250T ;delay 0.1 sec loop DBNZ cnt01s,loop DBNZX loop rts ******************************************** org $fff2 ;TOF Vector fdb TimInt org $fffa ;ExtInt Vector fdb ExtInt org $fffe ;Reset Vector fdb init .end $nolist