@happytar0この広告は、90日以上更新していないブログに表示しています。)を付けたかったので、タクトスイッチの使い方を調べることにした。マイコンを使わずにタクトスイッチを使って、LEDを点灯・消灯させる。苦戦したのだけど、いろいろな人に教えてもらって何とか完成させることができた。タクトスイッチの構造タクトスイッチは押すとカチッと手応えのある押しボタンだ。押している間だけ電流が流れるらしい。足は4本付いていて、押すことで2本の足が接続され電流が流れるという、単純な仕組みのようだ。下記のページを参考にさせてもらった。押している間だけLEDを点灯させる回路を作ってみることにした。回路は下記のページを参考に組んでみた。続いて、マイコンを使ってLEDを点灯させてみることにした。PD3にLEDを接続、PD4にタクトスイッチのアノードを接続した。PD4は入力になるため、DDRDレジスタでビット4を0にし、PD3は出力で使うため、ビット3を1にする。内部プルアップを有効にするために、PORTDレジスタのビット3を1にする必要がある。これは、スイッチがどこにも接続されていない場合、電圧が不安定になり0なのか1なのか分からなくなってしまうためだ。それを防ぐためにスイッチとの間に抵抗をはさむ必要があり、これをプルアップ抵抗という。AVRの場合、プルアップ抵抗を内蔵しているので、上記のようにPORTDレジスタのビットを立てると、内部プルアップ抵抗が有効になる。あとは、bit_is_clear関数でPD4が0になっているかチェックし、LEDの点灯させるだけだ。bit_is_clear関数は、第一引数にチェックするレジスタ(PORTBやPORTD)、第二引数にチェックするビット番号を指定する。0になっているとtrueが返ってくる。同様にbit_is_set関数は、1になっているとtrueが返ってくるようだ。この関数を使えば、簡潔に記述することができる。この回路はそのものズバリのものが、下記ページに書いてあったので参考にさせてもらった。)top長押しを判定するスイッチのオン・オフの他に、長押しを実装してみることにした。モード切り替えはスイッチの短押しを使って、最高温度や最低温度は長押しでリセット出来るようにするためだ。長押しを判定するためにタイマ割り込みを使うことにした。むずかしく長い道のりとなった...。短押しと、長押しを判断するのがこんなにむずかしいとは思わなかった。普段何気なく使うことが多いのだけど、単純な仕組みでも一から作るとなるとむずかしいもんだ。回路図は下記のようになった。タイマ割り込みを使うタイマ割り込みについては説明しているサイトがたくさんあるので割愛する。下記のサイトが詳しく説明されていて参考になった。http://d.hatena.ne.jp/hijouguchi/20100620/1276997802簡単に説明すると、カウンタ用レジスタ(TCNT0)があって、一定周期毎にこのレジスタの値がカウントアップされていく。レジスタがオーバーフローしたり、設定した値に到達すると割り込みハンドラが呼び出されるというものだ。大事なのは、クロック数と分周比から何秒ごとに割り込みハンドラが呼び出されるのかを考えることだと思う。今回は、ATTINY2313を8MHzで動かしていて、分周比を1024に設定した。(他にも256や8など設定できる)分周比は、「TCCR0B」レジスタで設定する。分周比1024なので、0b00000101となった。7812.5Hzとなるので、1秒間に7812回動作するとうことだ。0.128ms(ミリ秒)0.128ms毎にカウントアップされていくことになる。今回はカウンタ用レジスタがオーバーフローしたときに割り込みハンドラを呼び出すようにした。カウンタ用レジスタは8ビットなので、256になるとオーバーフローすることになる。32.768ms約32ms毎に割り込みハンドラが呼び出されるようだ。タイマ割り込みの実行タイマ割り込みを使うためには、「interrupt.h」をインクルードする。TCCR0Bレジスタ、TIMSKレジスタを設定した後、sei関数を呼び出すことで実行される。sei関数は、全割り込みを有効にさせる関数だ。逆にcei関数は、全割り込みを無効にさせる関数になる。割り込みハンドラは、ISRマクロを使って設定する。最初ISRは関数だと思ったのだけど、よくよく見てみるとマクロになっていた。引数に使うハンドラ名を入れる。今回は、TIMER0のオーバーフローということで以下のようになった。{}長押しをどのように判断するか短押しと長押しを区別させるのに苦労した。32ms毎にスイッチが押されているか判断し、3秒以上押されてい場合に、長押しと判断させることにした。3秒未満でスイッチを離した場合は、短押しとなるようにした。押した場合に判定させてしまうと、短押しと長押しのイベントが同時に起きてしまい、動作がおかしくなってしまう。長押しと区別させるために、短押しの場合、リリース時(スイッチを離した時)に判定させることで上手くいった。長押しされている時間を調べるために変数にハンドラ呼び出された回数を保存することにしたのだけど、ずっと長押ししているとカウンタ変数がオーバーフローしてしまい誤動作するということがあった。カウンタ変数を大きいものして一時しのぎすることも出来るのだけど、今回は「長押し判定時間の3秒を越えた場合、カウントアップさせない」ことで対応した。今回のコードもGitHubにアップした。00:42タクトスイッチを使うTweet広告を非表示にする関連記事2013-09-16PHPからCOMを使うWindowsでIEを制御するためにCOMを使ってみた。PHPからCOMを使...2013-07-23トランジスタアレイを使うトランジスタや抵抗の数を減らすためにトランジスタアレイを使...2013-07-17USBシリアル変換モジュールを使うまたもや電子工作をサボってしまった...。後編ということで、前回の続きをだらだらと書きたいと思う。その1激ニコぷんぷん丸のソースコード公開iOS7対応PHPからCOMを使うタクトスイッチを使う月別アーカイブはてなブログをはじめよう!happytar0さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。