; Candle Simulation ; 6/04 Luhan Monat ; ; Simulate flicker of candle using incandescent lamp ; device PIC12F675,intrc_osc,pwrte_on,wdt_off org 20h del1 ds 1 del2 ds 1 pcnt ds 1 temp ds 1 lev1 ds 1 lev2 ds 1 level ds 1 rbuf ds 5 LAMP = gp.5 org 0 goto start org 4 reti start bsf RP0 movlw 0 movwf GP movlw 127 movwf OSCCAL bcf RP0 bsf rbuf,0 ;seed random number movlw 127 movwf lev1 ;initial light level movwf lev2 ; Main Loop ; Create hi and low power levels ; Switch between levels candle movf lev1,w movwf level call power ;do lev1 power call rando andlw 7 btfss z goto :run ;skip 7 out of 8 call rmid ;generate new hi and low levels movwf lev1 sublw 0 movwf lev2 :run movf lev2,w ;do lev2 power movwf level call power goto candle ; PWM power control power movlw 100 ;set flicker rate: higher=slower movwf pcnt ;set loop count :p1 movf level,w ;get target level movwf del1 ;set 1st delay sublw 0 movwf del2 ;set 2nd delay bsf LAMP ;power on :p3 nop decfsz del1 ;do 1st delay goto :p3 bcf LAMP ;power off :p4 nop decfsz del2 ;second delay goto :p4 decfsz pcnt goto :p1 ; find sum of 4 random numbers ; skews results around 127 rmid call rando andlw 3fh movwf temp call rando andlw 3fh addwf temp call rando andlw 3fh addwf temp call rando andlw 3fh addwf temp,w ret ; Pseudo Rando Number ; "Chop Suey Machine" rando movf rbuf,w addwf rbuf+1,w movwf rbuf+1 addwf rbuf+2,w movwf rbuf+2 addwf rbuf+3,w movwf rbuf+3 addwf rbuf+4,w movwf rbuf+4 bcf c rlf rbuf+4 btfsc c bsf rbuf+4,0 movf rbuf+4,w addwf rbuf ret end QED