PIC第2弾!
今回 SONY NEX のインターバルタイマを作ったので、アセンブラ言語の記憶があるうちにと思って作成しました。たった53ステップでインターバルタイマをバージョンダウンさせたようなものです。
しかし、A/DC(アナログ・デジタル・コンバータ) を使ったところが新規。
A/DC というのは外部のアナログな電圧値を測定して8ビットの値にして使ってしまう、というもの。
たとえばPICを5Vで動かしていたとして、外部に1.5Vのものがあると1.5÷5.0×256=77という値を返してくれます。0~5Vの範囲を約0.02V刻みで0~255の値に割り当ててくれるといってもいいでしょう。
ポテンショメータという可変抵抗に5V電圧をかけておいて、ツマミを回すことによって0V~5Vの値を取り出します。
それをPICのA/DCで約0.6秒おきに読み取り、LED点灯と消灯の比率を変えます。
適当に作ったので、
周波数は1.28kHz (ここまで周波数が高いとちらつきません)
DUTYは
0Vのときは、点灯 0.77%
5Vのときは、点灯 98.97%
となりました。
ツマミ(ポテンショメータ)を回すと最大0.6秒遅れて明るさが変わります(もちろん平均は0.3秒)。
PICのマニュアルA/DC部分を読むと電圧測定に必要なコンデンサが十分充電できる時間を考慮して測定対象は10kΩ上限、との記述があります。手持ちのポテンショメータが100kΩしかなかったので正確な測定ができていない可能性はあります。
ただ、見た目は割りときちんと測定できているようです。
参考:回路図
ツマミを左いっぱい(=0V)のとき
1/4くらい(=1.2V)のとき
右いっぱい(=5V)のとき
部品点数は、PIC10F222、抵抗100Ω、ポテンショメータ100KΩ、LED、の4つのみ。
こんなに簡単にできてしまうのがPICの面白さです。
プログラムも参考につけておきます
今回 SONY NEX のインターバルタイマを作ったので、アセンブラ言語の記憶があるうちにと思って作成しました。たった53ステップでインターバルタイマをバージョンダウンさせたようなものです。
しかし、A/DC(アナログ・デジタル・コンバータ) を使ったところが新規。
A/DC というのは外部のアナログな電圧値を測定して8ビットの値にして使ってしまう、というもの。
たとえばPICを5Vで動かしていたとして、外部に1.5Vのものがあると1.5÷5.0×256=77という値を返してくれます。0~5Vの範囲を約0.02V刻みで0~255の値に割り当ててくれるといってもいいでしょう。
ポテンショメータという可変抵抗に5V電圧をかけておいて、ツマミを回すことによって0V~5Vの値を取り出します。
それをPICのA/DCで約0.6秒おきに読み取り、LED点灯と消灯の比率を変えます。
適当に作ったので、
周波数は1.28kHz (ここまで周波数が高いとちらつきません)
DUTYは
0Vのときは、点灯 0.77%
5Vのときは、点灯 98.97%
となりました。
ツマミ(ポテンショメータ)を回すと最大0.6秒遅れて明るさが変わります(もちろん平均は0.3秒)。
PICのマニュアルA/DC部分を読むと電圧測定に必要なコンデンサが十分充電できる時間を考慮して測定対象は10kΩ上限、との記述があります。手持ちのポテンショメータが100kΩしかなかったので正確な測定ができていない可能性はあります。
ただ、見た目は割りときちんと測定できているようです。
参考:回路図
ツマミを左いっぱい(=0V)のとき
1/4くらい(=1.2V)のとき
右いっぱい(=5V)のとき
部品点数は、PIC10F222、抵抗100Ω、ポテンショメータ100KΩ、LED、の4つのみ。
こんなに簡単にできてしまうのがPICの面白さです。
プログラムも参考につけておきます
;********************************
; PIC10F222
; 2013-1-7
; Author: HoyoHoyo
;********************************
LIST P=pic10f222
#include <p10f222.inc>
__CONFIG _IOSCFS_4MHZ & _MCPU_ON & _WDT_OFF & _CP_OFF & _MCLRE_OFF
;*********** Variables **********
CBLOCK 09h
wC0
wC1
Isave
WCnt
TCnt
ENDC
;*********** Initial ************
ORG H'0000'
MOVWF OSCCAL ;OSCCAL Set
MOVLW B'11000000' ;Option Register Set
OPTION ;
MOVLW B'01000000' ;AN0 Enable,CH0 Selected
MOVWF ADCON0 ;
MOVLW B'00001011' ;only GP2 out
TRIS GPIO ;
CLRF GPIO
;********* Main Routine *********
main
CALL readAN0
CALL BlinkLED
GOTO main
;********* Read Analog Channel **
readAN0
BCF ADCON0,GO ;ADC Done bit clear
CLRF ADRES ;ADC result clear
BSF ADCON0,ADON ;ADC On
MOVLW 0x06 ;wait 20uSec
MOVWF wC0 ;
DECFSZ wC0,F ;
GOTO $-1 ;
BSF ADCON0,GO ;start A/D Converter
NotDone
BTFSC ADCON0,GO ;wait for ADC
GOTO NotDone
MOVF ADRES,W ;read ADC result
MOVWF Isave ;save result
MOVLW 0xFF ;
XORWF Isave,W ;
MOVWF WCnt ;save XORed result
INCF Isave,F ;Isave++
INCF WCnt,F ;WCnt++
BCF ADCON0,ADON ;ADC Off
RETURN
;********* BlinkLED Routine ******
BlinkLED
MOVLW 0x04
MOVWF wC0
loop_0
MOVLW 0xFF
MOVWF wC1
loop_1
MOVFW Isave
MOVWF TCnt
BSF GPIO,GP2
DECFSZ TCnt,F
GOTO $-1
MOVFW WCnt
MOVWF TCnt
BCF GPIO,GP2
DECFSZ TCnt,F
GOTO $-1
DECFSZ wC1,F
GOTO loop_1
DECFSZ wC0,F
GOTO loop_0
RETURN
;********* OSCCAL Set ***********
ORG H'1FF'
MOVLW 0x1A
END