;--------------------------------------------------------------------- ; 暗くなると自動点滅するLチカ ; ; 2016.2.7 naka ; 1. I/Oポート ; ; (1). 出力ポート(アナログ入力にも使用) ; GP0: LED(アノード)に繋ぐ ; (2). 入力ポート ; GP1: 動作モード設定(電源投入時にしか判断しない) ; Open : 暗くなると点滅、GND : 常に点滅 ; ; 2. 光り方 ; 0.5秒ごとに点灯/消灯を繰り返す ; ; 3. 明るさセンサ ; GP0(AN0)に繋いだLEDの起電力をAD変換で測定して明るさを判断。 ; 起電力はLEDによって変わる。 ;--------------------------------------------------------------------- LIST P=PIC10F222 INCLUDE "P10F222.INC" __CONFIG _MCLRE_OFF & _WDT_OFF & _IOFSCS_4MHZ & _MCPU_OFF ;--------------------------------------------------------------------- ; 変数レジスタの定義 ;--------------------------------------------------------------------- CNT1 EQU 09H ; WAIT用カウンタ CNT2 EQU 0AH ; WAIT用カウンタ LEDVLT EQU 0BH ; LED発生電圧 ;--------------------------------------------------------------------- ; リセット ;--------------------------------------------------------------------- ORG 00H ; リセット時の飛び込み先 RESET ;--------------------------------------------------------------------- ; 初期設定 ;--------------------------------------------------------------------- START MOVWF OSCCAL ; 内部OSCのキャリブレーションデータ BCF OSCCAL,0 MOVLW B'01000000' MOVWF ADCON0 ; GP0-1をデジタルI/Oに設定 MOVLW B'00000010' TRIS GPIO ; GP0を出力ピン, GP1を入力に設定 MOVLW B'10000000' ; wakeup off OPTION ; ;--------------------------------------------------------------------- ; メイン ;--------------------------------------------------------------------- MOVF GPIO,W ; 動作モード確認 ANDLW B'00000010' ; GP1チェック、LOWなら常に点滅モード BTFSS STATUS,Z ; HIGHなら暗くなると点滅モード GOTO AUTO_LP ; MOVLW B'11000000' ; weak pullup off(節電になる?) OPTION ALWAYS_LP CALL LEDON CALL WAIT CALL LEDOFF CALL WAIT GOTO ALWAYS_LP ; AUTO_LP CALL CHKBRT ; 明るさ確認 ANDLW H'FF' BTFSS STATUS,Z ; 明るいときはONしない CALL LEDON CALL WAIT CALL LEDOFF CALL WAIT GOTO AUTO_LP ; ;--------------------------------------------------------------------- ; LED ON/OFF ;--------------------------------------------------------------------- LEDON BCF ADCON0,6 ; GP0をデジタルI/O CLRW TRIS GPIO ; I/Oを出力ピンに設定 MOVLW H'01' MOVWF GPIO RETLW D'0' LEDOFF BCF ADCON0,6 ; GP0をデジタルI/O CLRW TRIS GPIO ; I/Oを出力ピンに設定 MOVLW H'00' MOVWF GPIO RETLW D'0' ;--------------------------------------------------------------------- ; CHECK BRITNESS ;--------------------------------------------------------------------- CHKBRT BSF ADCON0,6 ; GP0をアナログI/O BSF ADCON0,0 ; AD変換ON CLRF ADRES CALL W10US ; 10usec ウェイト CALL W10US ; 10usec ウェイト CALL W10US ; 10usec ウェイト BSF ADCON0,1 ; 測定開始 CHK_LP BTFSC ADCON0,1 ; GO/DONE GOTO CHK_LP ; BCF ADCON0,0 ; AD変換OFF MOVF ADRES,W ; result MOVWF LEDVLT MOVLW D'5' ; 5V/255=0.02V ; 0.02*5=0.1V 以下は暗いと判断 SUBWF LEDVLT BTFSC STATUS,C RETLW D'0' ; 明るい RETLW D'1' ; 暗い ;--------------------------------------------------------------------- ; Waitルーチン ;--------------------------------------------------------------------- WAIT1MS ;1ミリ秒(998usec) CALLと合わせて1.000ms MOVLW D'248' ;1cycle MOVWF CNT1 ;1cycle W1MSLP NOP ;1cycle*248 DECFSZ CNT1,F ;1cycle*247+2cycle GOTO W1MSLP ;2cycle*247 GOTO $+1 ;2cycle NOP ;1cycle RETLW D'0' ;2cycle ; WAIT ; 約0.5秒 MOVLW D'250' ;1cycle MOVWF CNT2 ;1cycle WAITLP CALL WAIT1MS CALL WAIT1MS DECFSZ CNT2,F GOTO WAITLP RETLW D'0' ; W10US ; CALL とあわせて10usec GOTO $+1 GOTO $+1 GOTO $+1 RETLW D'0' ;--------------------------------------------------------------------- END ;--------------------------------------------------------------------- ; 終わり ;---------------------------------------------------------------------