;------------------------------------------------------------------------------ ; Eyes.asm ; - fun with LED's and a photodiode ; - react to light with light and sound ; - trigger upon detecting light with a photodiode ; - trigger after a delay to create activity on a regular basis ; ; Andrew Cooper ; Silicon Owl ; www.DarkerView.com ; Copyright 2009 all rights reserved ; ; r0.1 22 Sep 2009 A. Cooper ; - initial version ; r0.2 19 Oct 2009 A. Cooper ; - initial publication ; ; To Do: ; - get LED routines running ; - check out burn and erase infrastructure ; - check out target board operation ; - add photodiode routines ; - get interrupt and timer operating ; - add integrated control to photodiode w/AtoD ; - make some sound ; - tune for realistic operation ; - writeup results for Darker View by 15Oct ; - deploy on Oct 31st ; ;------------------------------------------------------------------------------ list p=12c672 ;define processor #include ;processor specific stuff errorlevel -302 ;suppress message 302 __CONFIG _CP_OFF&_WDT_OFF&_MCLRE_OFF&_PWRTE_ON&_INTRC_OSC ;- RC Osc Calibration --------------------------------------------------------- org 0x7FF retlw 0x80 ;RC oscillator calibration constant ;- Definitions ---------------------------------------------------------------- timeCal equ 0x85 ;timer calibration for 0.05 sec actDel equ 0xF0 ;activity delay actTrig equ 0x0A ;triggered duration actTest equ 0x0A ;test duration at startup chirpTime equ 0x04 ;chirp duration in 1/10 sec ltThresh equ 0x10 ;illumination change threshold ;cross bank registers at 0x70 cblock 0x70 mode ;70 mode control sBits ;71 status bits min ;72 minute counter sec ;73 second counter fTime ;74 fast 1kHz timer mTime ;75 master timer lTime ;76 LED timer sTime ;77 sound timer (chirp duration) cTime ;78 chirp timer (modulator) pTime ;79 pulse clock (chirp freq) wTemp ;7A interrupt context saving of W sTemp ;7B interrupt context saving of STATUS adPtr ;7C pointer into the A/D result table adLast ;7D last A/D averaged result temp1 ;7E scratch temp2 ;7F scratch endc ;aliases temp equ temp1 count equ temp1 ptr equ temp1 resh equ temp1 resl equ temp2 ;analog results table adTbl equ 0x20 ;illumination intensity results table ;bits in mode mdTrig equ 0x1 ;photodiode triggered mdDel equ 0x2 ;delayed trigger mode mdTest equ 0x3 ;test mode ;bits within sBits sLED1 equ 0x0 ;state of LED1 sLED2 equ 0x1 ;state of LED2 sPD equ 0x2 ;result of Diode Check sChirp equ 0x3 ;active sound sChMod equ 0x4 ;modulate sound sAD equ 0x5 ;sample A/D flag (10Hz) ;GPIO register PDin equ 0x0 ;photodiode input LED1 equ 0x1 ;LED1 drive (high=on) LED2 equ 0x2 ;LED2 drive (high=on) cBit equ 0x4 ;sounder drive ;- Reset ---------------------------------------------------------------------- Reset org 0x000 ; processor reset vector goto Init ; go to beginning of program ;- Interrupt Routine ---------------------------------------------------------- Interrupt org 0x004 movwf wTemp ;save context during interrupt movf STATUS,w movwf sTemp incf fTime,f ;increment fast 1kHz timer banksel TMR0 movlw timeCal movwf TMR0 banksel INTCON ;clear interrupt overflow bit bcf INTCON,T0IF movf sTemp,w ;restore context before return from int movwf STATUS swapf wTemp,f swapf wTemp,w retfie ;return from interrupt ;- Main Code ------------------------------------------------------------------ Init call 0x7FF ;retrieve osc cal value banksel OSCCAL movwf OSCCAL clrwdt ;clear WDT before prescaler assignment banksel OPTION_REG ;setup TMR0 movlw b'11000010' ;prescaler to TMR0 ;prescaler set to 1:8 ;pullups disabled ;TMR0 source internal movwf OPTION_REG banksel TRISIO ;set direction bits for outputs bcf TRISIO,LED1 bcf TRISIO,LED2 bcf TRISIO,cBit banksel ADCON1 ;set for AN0 only movlw b'11111110' movwf ADCON1 banksel ADCON0 ;setup A/D for channel 0 movlw b'10000001' ;A/D is on, Fosc/32, chan 0 movwf ADCON0 bsf ADCON0,GO banksel INTCON ;set interrupts movlw b'11100000' ;TMR0 int enabled, all others disabled movwf INTCON banksel PIE1 ;A/D interrupt disabled bcf PIE1,ADIE banksel PIR1 bcf PIR1,ADIF clrf mode ;clear control variables clrf mTime clrf sec clrf min clrf lTime clrf sBits clrf adPtr clrf adLast bsf mode,mdTest ;set for test mode to start Main call SetLEDs ;insure LED's are set call Chirp call CheckDiode ;check status of photodiode call MakeTime ;update timers call HandleMode ;do the stuff goto Main ;- Mode Control --------------------------------------------------------------- HandleMode btfsc mode,mdTrig ;triggered goto HMTrig btfsc mode,mdDel ;delay goto HMDelay btfsc mode,mdTest ;test goto HMTest clrf mode HMQuiet bcf sBits,sLED1 ;clear LED's bcf sBits,sLED2 btfsc sBits,sPD ;check for photodiode trigger goto HMQTrig movf lTime,w ;check for delay timeout sublw actDel btfsc STATUS,C return HMQStDel bsf mode,mdDel ;start delay action clrf lTime clrf sTime ;start chirp clrf cTime bsf sBits,sChirp bcf sBits,sChMod return HMQTrig bsf mode,mdTrig ;start triggered action clrf lTime clrf sTime ;start chirp clrf cTime bsf sBits,sChirp bcf sBits,sChMod return HMTrig bsf sBits,sLED1 ;set LED's bsf sBits,sLED2 movf lTime,w ;check on duration sublw actTrig btfsc STATUS,C return clrf mode return HMDelay bsf sBits,sLED1 ;set LED's bsf sBits,sLED2 movf lTime,w ;check on duration sublw actTrig btfsc STATUS,C return clrf mode return HMTest bsf sBits,sLED1 ;follow PD status btfss sBits,sPD bcf sBits,sLED1 bsf sBits,sLED2 btfss sBits,sPD bcf sBits,sLED2 movf lTime,w ;check for test duration sublw actTest btfsc STATUS,C return clrf mode clrf lTime return ;- Peripheral Routines -------------------------------------------------------- SetLEDs banksel GPIO btfsc sBits,sLED1 ;set LED control lines without glitches bsf GPIO,LED1 btfss sBits,sLED1 bcf GPIO,LED1 btfsc sBits,sLED2 bsf GPIO,LED2 btfss sBits,sLED2 bcf GPIO,LED2 return Chirp btfss sBits,sChirp ;chirp in progress? goto CHOff movf sTime,w ;time overall chirp sublw chirpTime btfss STATUS,C goto CHOff incf pTime,f ;modulation timer CHOn banksel GPIO btfsc sBits,sChMod ;check modulation bit return btfsc pTime,0 ;pulse output at 1kHz bsf GPIO,cBit btfss pTime,0 bcf GPIO,cBit return CHOff bcf sBits,sChirp ;stop chirp movlw chirpTime+1 movwf sTime return CheckDiode bcf sBits,sPD ;insure no trigger flag btfss sBits,sAD ;check for sample flag return bcf sBits,sAD movf adPtr,w ;setup table pointer addlw adTbl movwf FSR banksel ADRES ;get result movf ADRES,w sublw 0xFF ;reverse scale movwf INDF ;store result banksel ADCON0 ;start new conversion bsf ADCON0,GO clrf resl ;average table clrf resh movlw adTbl ;set pointer movwf FSR cdAvg movf INDF,w ;add data addwf resl,f btfsc STATUS,C incf resh,f incf FSR,f ;repeat x4 btfss FSR,2 goto cdAvg rrf resh,f ;divide x4 rrf resl,f rrf resh,f rrf resl,f movf adLast,w ;check for trigger subwf resl,w ;subtract baseline btfss STATUS,C goto cdNext movwf temp ;check for threshold movlw ltThresh subwf temp,w btfsc STATUS,C bsf sBits,sPD ;trigger! cdNext incf adPtr,f ;increment table pointer btfss adPtr,2 ;restrict range 0-3 return clrf adPtr movf resl,w ;store new baseline value movwf adLast return ;- Utility Routines ----------------------------------------------------------- MakeTime movf fTime,w ;check for 0.1 second interval sublw 0x64 btfsc STATUS,C return clrf fTime incf sTime,f incf mTime,f bsf sBits,sAD movf mTime,w ;check for 1 second interval sublw 0x09 btfsc STATUS,C return clrf mTime incf sec,f ;increment 1 second stuff incf lTime,f movf sec,w ;check for 1 minute sublw 0x3B btfsc STATUS,C return clrf sec incf min,f ;increment 1 minute stuff return ;------------------------------------------------------------------------------ end ;- End of Eyes ----------------------------------------------------------------