8PinのAVR(ATtiny13A)でプチはまり

秋月電子で120円で売っていたTiny13Aでちくちく工作。電源/GNDのピン以外は、ADコンバータやPWMモジュール等の既存の機能は一切オンにせず、6本全部I/Oに使おうと思っていました。
ところが、まずI/Oの設定だけしてブレッドボードで動かしてみたときに、スイッチ用(入力)に割り当てたピン3本のうち1本の挙動がおかしい!ちゃんとプルアップはされているんだけど、押しても変な挙動をします。ためしにプルアップしない設定で書き込んでみても、依然プルアップされるし動作も変わりません。


何の機能と被ってるんだ!?とデータシートを確認すると、このポート(PORTBの5番=PB5)はReset Pinと書いてありました。リセット機能が有効な状態では、内部でプルアップされたLow Activeのピン。既存機能は基本的には明示的にレジスタ設定しないと有効にならないものが多いはずですが、このリセット機能はISP modeでの書き込みにも使用するため、デフォルトで有効になっていたようです。そして、もちろん書き込みに必須なピンなので潰すわけにいきません。つまり、ISP mode以外の方式で書き込みができるライターを使わない限りは、8PinのAVRは5つまでしか汎用I/Oとして使えない、ということなんですよね?たぶん。

ついでにもうひとつ

うっかり制御変数をintと書いたら、256で一周してくれなくて最初はすごいことになっていましたw 8bitの変数を直感的に使いたければ、長いのがいやだけど unsigned char と書かないといけませんね。uint_8tは定義されてたっけ。次使うときに確認しよう…

工作内容

やろうとしていたのは、フルカラーLED制御+スイッチで色制御程度。試作一号ということで、大きめの電流を引っ張り出すようには組まず、無難にI/Oポートで食える分だけの電流を使っています。20mAくらいかな?
LEDの明るさ制御なんてPWMモジュール使えばいいんですが、3色なのにPWMとして使えるのは2系統しかなくて、どのみち1色は自前で動かさないといけない。それなら3色とも制御を統一しようと思ってタイマー割り込みを使っています。


スイッチを3つにして、よく使う色の直接指定ボタン+使用頻度低い色を順々に切り替えるボタン、とするつもりでした。前述のようにI/Oに使えるピンが5本、つまり3色分の制御を除くとスイッチは2つしか使えないことがわかりましたが、所詮LEDが点けばよいので、あまり影響がありませんでした。よく使う青を初期色にしておけば、リセットボタン押せばすぐ青になるので、目的は達成できた、とw
残りの2つのボタンは結局両方とも順ぐりに色を切り替えるボタンにしています。


スイッチ1:青(実はリセットボタン)
スイッチ2:赤→ピンク→紫
スイッチ3:オレンジ→黄→白→緑


テストが甘くて、赤色用の抵抗値がちょっと大きいまま組んでしまいました。ピンクオレンジ黄色あたりが弱いです。ちゃんと調整したとしても、この出力ではUOみたいな激しいモノにするのは無理でしょうが。