マイコンを使った工作
vmeter.asm
最終更新:
匿名ユーザー
-
view
vmeter.asm
; ; PIC12F675 LED Voltmeter ; ; Apr., 29, 2005 Chuck (http://ecrafts.g.hatena.ne.jp/Chuck/) ; list p=12f675 ; list directive to define processor #include ; processor specific variable definitions __CONFIG _CP_OFF & _CPD_OFF & _BODEN_ON & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT PWM_FRAME equ d'41' bRED equ 0 ; GPIO bit 0 bGREEN equ 1 ; GPIO bit 1 bBLUE equ 2 ; GPIO bit 2 bADFLG equ 0 ; AD_FLAG bLOGIC equ 1 ; LED 0:source/1:sink from GP3 ; variables CBLOCK H'20' ; WTEMP STATUSTEMP frame_cnt color_out red green blue red_tmp green_tmp blue_tmp ad_tmp flag ENDC ; objects org 0x000 goto INIT org 0x004 ; goto ISR ISR PUSHD movwf WTEMP ;SAVE CONTEXT swapf STATUS, W clrf STATUS movwf STATUSTEMP ; T0ISR nop bcf INTCON,T0IF ; clear timer0 interrupt movlw d'256' - d'64' + d'12' ; 64d cnt, ovhead 15 movwf TMR0 decfsz frame_cnt,f goto LED_PROC movlw PWM_FRAME ; reset frame counter movwf frame_cnt bsf flag, bADFLG movf red, W ; reset RED_tmp movwf red_tmp movf green, W ; reset GREEN_tmp movwf green_tmp movf blue, W ; reset BLUE_tmp movwf blue_tmp LED_PROC PROC_RED movf red_tmp, F btfss STATUS, Z goto PROC_RED_ON bcf color_out, bRED goto PROC_GREEN PROC_RED_ON decfsz red_tmp, F bsf color_out, bRED PROC_GREEN movf green_tmp, F btfss STATUS, Z goto PROC_GREEN_ON bcf color_out, bGREEN goto PROC_BLUE PROC_GREEN_ON decfsz green_tmp, F bsf color_out, bGREEN PROC_BLUE movf blue_tmp, F btfss STATUS, Z goto PROC_BLUE_ON bcf color_out, bBLUE goto PROC_COLOR PROC_BLUE_ON decfsz blue_tmp, F bsf color_out, bBLUE PROC_COLOR movf color_out, W btfsc flag, bLOGIC comf color_out, W andlw b'00000111' movwf GPIO POPD swapf STATUSTEMP, W ;RESTORE CONTEXT movwf STATUS swapf WTEMP, F swapf WTEMP, W retfie INIT bsf STATUS,RP0 ; Select Bank 1 call 3FFh ; Internal RC calibration movwf OSCCAL movlw b'10001000' ; T0CS, PreScaler for WDT movwf OPTION_REG movlw b'10100000' ; GIE/T0IE movwf INTCON bcf STATUS,RP0 clrf TMR0 clrf GPIO ; GPIO cleared movlw h'07' ; comparator dsabled movwf CMCON bsf STATUS,RP0 movlw b'00011000' ; Fosc/8, AN3 enabled movwf ANSEL ; movlw b'00100000' ; GP5 pull-up movwf WPU movlw b'00111000' ; GP5, GP3 input, GP2-0 output movwf TRISIO bcf STATUS,RP0 ; Select Bank 0 clrf flag movlw b'00001101' ; A/D left, Vdd ref, AN3 movwf ADCON0 movlw PWM_FRAME ; PWM frame counter set movwf frame_cnt clrf flag movf red, W ; reset RED movwf red_tmp movf green, W ; reset GREEN movwf green_tmp movf blue, W ; reset BLUE movwf blue_tmp btfsc GPIO, GP3 ; if GP3, sink LED current bsf flag, bLOGIC ; (if bLOGIC, sink) clrf TMR0 MAIN_LOOP btfss flag, bADFLG ; test A/D asserted? goto MAIN_LOOP ; bsf ADCON0, ADON bsf ADCON0, GO AD_WAIT_LOOP btfsc ADCON0, GO_DONE goto AD_WAIT_LOOP bcf flag, bADFLG movf ADRESH, W btfss GPIO, GP5 ; if GP5, default pattern sublw d'255' movwf ad_tmp ; bcf ADCON0, ADON REGION6 movlw d'214' subwf ad_tmp, W btfss STATUS, C goto REGION5 movwf blue movlw PWM_FRAME movwf red movwf green goto MAIN_LOOP REGION5 movlw d'172' subwf ad_tmp, W btfss STATUS, C goto REGION4 movwf green movlw PWM_FRAME movwf red clrf blue goto MAIN_LOOP REGION4 movlw d'130' subwf ad_tmp, W btfss STATUS, C goto REGION3 movwf red clrf green clrf blue goto MAIN_LOOP REGION3 movlw d'126' subwf ad_tmp, W btfss STATUS, C goto REGION2 clrf red clrf green clrf blue goto MAIN_LOOP REGION2 movlw d'84' subwf ad_tmp, W btfss STATUS, C goto REGION1 sublw PWM_FRAME movwf blue clrf red clrf green goto MAIN_LOOP REGION1 movlw d'42' subwf ad_tmp, W btfss STATUS, C goto REGION0 sublw PWM_FRAME movwf red movlw PWM_FRAME movwf blue clrf green goto MAIN_LOOP REGION0 movf ad_tmp, W movwf red sublw PWM_FRAME movwf green movlw PWM_FRAME movwf blue goto MAIN_LOOP REGION_END goto MAIN_LOOP END