体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

Japanino ArduinoISPで ATtiny13 で デジタル入力 (8) (9/5)

基本の入力としてのデジタル入力。タクトスイッチでON/OFFするのだが、意外に難しい。
単にPinのON/OFFだとチャタリングが起こるので。
a0034780_04471520.jpg
回路は内部プルアップ抵抗を使うので外付けの抵抗は必要ない。VCCの線もいらない。従って配線はGNDとPB4の2本。
で、BASCOM-AVRのDebounceを使うのだが、最初うまくいかなかった。
入力待ちをしなければいけないらしく、液晶にAD入力と同時に表示したいのでちょっと合わない。
以下のサイト様を参考に。
BASCOM-AVR 入力スイッチ(その3)
Do-Loopを排しても値がうまく更新しなくて、結線がおかしいのかと思ったが、結局プルアップなので押すとOFFなのと、ピン番号を誤ってPB3にしていたためだった。
a0034780_04384246.jpg

カウンタCに押した回数を格納し、AD入力を100ms毎に直した。

ソース:
'****************************************
' Copyright (c) 2016 k1segawa
' License : free
' Program : Input Control
'****************************************

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 24
$swstack = 4
$framesize = 8
Config Scl = Portb. 1
Config Sda = Portb. 0
Config I2cdelay = 5
Config Clockdiv = 1
Dim A As String * 10 , I As Integer , W As Byte , C As Integer
'--- Instruction Description Command ---
Const Ins_cleardsp = &H01
Const Ins_returnhm = &H02
Const Ins_setddradr = &H80
'--- Analog Input ---
Config Adc = Single , Prescaler = Auto
'--- Digital Input PortB.4 Pullup ---
Config Portb.4 = Input
Set Portb.4
Inppin Alias Pinb.4
Declare Sub G_pinstat

'--- I2C Init ---
I2cinit
'--- LCD Init ---
Waitms 40
I2cstart
I2cwbyte &H7C
I2cwbyte 0
I2cwbyte &H38
I2cwbyte &H39
I2cwbyte &H14
I2cwbyte &H70
I2cwbyte &H52 '56->52
I2cwbyte &H6C
Waitms 201
I2cwbyte &H38
I2cwbyte &H0C
Waitms 2
I2cstop
'--- Clear Display ---
W = 1 : Gosub G_i2cwrite
Waitms 2
'--- A/D Start ---
Start Adc
C = 0

Do
'--- Set DDRAM Address ---
W = Ins_setddradr Or &H00 : Gosub G_i2cwrite
Waitms 100
'--- Analog Input ADC3 ---
I = Getadc(3)
A = Str(i)
A = A + " " : A = Left(a , 4)
A = "@AD=" + A
I2csend &H7C , A , 8
'--- Digital Input ---
W = Ins_setddradr Or &H40 : Gosub G_i2cwrite
W = 0
Debounce Inppin , 0 , G_pinstat , Sub
C = C + W
A = Str(c)
A = A + " " : A = Left(a , 4)
A = "@" + A
I2csend &H7C , A , 5

Loop
End
'--- Subroutine : Digital Input Pin Status ---
Sub G_pinstat
W = 1
End Sub

'--- Sub routine : Output Command ---
G_i2cwrite:
I2cstart
I2cwbyte &H7C
I2cwbyte &H80
I2cwbyte W
I2cstop
Return
' History
' [2016/09/05]
' Input Digital Swich
タクトスイッチを押すと数字がカウントアップ。AD入力も同時に変更される。PB4をInput指定し、プルアップ設定、エイリアスでInppin=PINB.4定義。
スイッチを押すと5V(1)から0V(0)に変化するのでDebounceは0を指定。押されたら0になり飛ぶサブルーチン内ではWを0から1へ変更。押した回数をCへ保存する。外部プルアップ抵抗が10KΩ→1KΩで書いているのは、元々幅があって、プルアップ抵抗は100Ω~数十KΩが適当で(5V/100=50mA~0.数mA)、内部プルアップ抵抗が1KΩくらいだから。
こちらのサイト様にプルアップは1KΩ、プルダウンは10KΩと書かれている。

プルアップ抵抗/プルダウン抵抗について

(RESETは絶対出力に設定しないでね。下手にいじらないように。)
10KΩでプルアップ書いてるサイト様もあるんだけどね。
【Arduino電子工作】タクトスイッチでLEDのON/OFF操作 - いそぷろのブログ
arduinoIDEでもdigitalReadで吸収してくれないのでチャタリングを考慮した方がいい。
チャタリングについてはこちらのサイト様が詳しい。
割り込み処理 -第3回:チャタリング防止: Arduinoで遊ぶブログ
ハードで解決するならこちらのサイト様。
Arduinoチャタリング除去基本回路 | プログラミングテクニック集キヤミー
元々arduinoIDE 0022ぐらいでも[サンプル][Digital][bounce]としてサンプルがある。
こちらのサイト様に色々方法があるが最後がサンプルと同じ方法。
スイッチライブラリ

これで986バイト。あと1つピンが空いているので、SWをやめてI2Cのセンサーをもう一個つないでアナログ入力をCDSをつないで照度・気温・湿度・気圧を表示するのもいい。あ、1KBのFlashがきついなら、全く同じピン配列のATtiny85が応用が効いていいかも。

[PR]
by k1segawa | 2016-09-05 04:39 | arduino, AVR | Comments(0)