; Memory used = 1023 bytes out of 2048 #picaxe 08m2 #no_data ;Do not download(clear) EEPROM data. symbol ADCin = C.4 ;SW symbol PWMo = C.2 ;TR symbol BRTness = b0 ;Brightness symbol WRadd = b1 ;eeprom write address symbol WORK_b0 = b2 ;task0 work byte symbol WORK_b1 = b3 ;task0 work byte symbol WORK_w0 = w2 ;task0 work word symbol WORK_b2 = b6 ;task2 work byte ;symbol ST = 20 ;task0 ADC sampling times. 50ms symbol ST = 22 ;task0 ADC sampling times. 55ms ;symbol ST = 34 ;task0 ADC sampling times. 82ms ; ***** Task0 main routine ***** start0: ;initialize disablebod ;Disable brown out reset detect. adcconfig %000 ;ADC VRef- = 0V, VRef+ = V+ (power supply) ; eeprom data read 127,WORK_b0 ; read pointer SELECT CASE WORK_b0 CASE 126 read 126, BRTness WRadd = 0 CASE 0 to 125 read WORK_b0, BRTness inc WORK_b0 WRadd = WORK_b0 ELSE BRTness = 9 WRadd = 0 ENDSELECT write 127, WRadd ; new pointer write WRadd, BRTness ; initial data ; Brightness pwmout pwmdiv64, PWMo, 249, 0 ; set PWM 250Hz, 0% @CPU16MHz gosub BRTtoDUTY main0: gosub RDadc SELECT CASE WORK_b0 CASE = 3 ; + if BRTness =15 then goto main0 endif inc BRTness gosub BRTtoDUTY gosub CHKmidLV ;pause 50 ; for main1,2 goto main0 CASE = 2 ; - if BRTness =2 then goto main0 endif dec BRTness gosub BRTtoDUTY gosub CHKmidLV ;pause 50 goto main0 ENDSELECT goto main0 ; subroutines BRTtoDUTY: ; Brightness to PWM duty branch BRTness,(BRT0,BRT1,BRT2,BRT3,BRT4,BRT5,BRT6,BRT7,BRT8,BRT9,BRT10,BRT11,BRT12,BRT13,BRT14,BRT15) BRT0: pwmduty PWMo,0 ; Brightness 0% return BRT1: pwmduty PWMo,16 ; Brightness 1.6% return BRT2: pwmduty PWMo,22 ; Brightness 2.2% return BRT3: pwmduty PWMo,31 return BRT4: pwmduty PWMo,44 return BRT5: pwmduty PWMo,63 return BRT6: pwmduty PWMo,88 return BRT7: pwmduty PWMo,125 return BRT8: pwmduty PWMo,177 return BRT9: pwmduty PWMo,250 return BRT10: pwmduty PWMo,354 return BRT11: pwmduty PWMo,500 return BRT12: pwmduty PWMo,707 ; Brightness 70.7% return BRT13: pwmduty PWMo,1000 ; Brightness 100.0% return BRT14: ;pwmduty PWMo,1000 return BRT15: ;pwmduty PWMo,250 return RDadc: ;read ADC WORK_w0=0 for WORK_b1 = 1 to ST readadc ADCin,WORK_b0 WORK_w0 = WORK_w0 + WORK_b0 next WORK_b1 WORK_w0 = ST/2 + WORK_w0 / ST SELECT CASE WORK_w0 CASE 107 to 124 ; MID WORK_b0 = 1 return CASE >= 204 ; HI WORK_b0 = 3 return CASE <= 12 ; LOW WORK_b0 = 2 return ELSE WORK_b0 = 0 ; NON ENDSELECT return CHKmidLV: ;Check middle level gosub RDadc if WORK_b0 = 1 then return endif goto CHKmidLV ; ***** Task1 for FLASH ***** start1: main1: IF BRTness <= 13 THEN goto main1 ENDIF SELECT CASE BRTness CASE 14 pwmduty PWMo,1000 ; Brightness 100.0% gosub flash14 gosub flash14 gosub flash14 pwmduty PWMo,0 ; Brightness 0% gosub flash14 gosub flash14 gosub flash14 gosub flash14 gosub flash14 gosub flash14 goto main1 CASE 15 pwmduty PWMo,250 ; Brightness 25.0% gosub flash15 gosub flash15 gosub flash15 pwmduty PWMo,0 ; Brightness 0% gosub flash15 gosub flash15 gosub flash15 gosub flash15 gosub flash15 gosub flash15 goto main1 ENDSELECT ; subroutines flash14: pause 60 ; 56ms IF BRTness = 14 THEN return ENDIF goto main1 flash15: pause 60 IF BRTness = 15 THEN return ENDIF goto main1 ; ***** Task2 for EEPRON ***** start2: ;initialize pause 500 WORK_b2 = BRTness main2: IF BRTness = WORK_b2 THEN goto main2 ENDIF WORK_b2 = BRTness pause 750 IF BRTness != WORK_b2 THEN WORK_b2 = BRTness goto main2 ENDIF write WRadd, WORK_b2 ;write EEPROM goto main2