ATtiny13Aでシリアル通信をする
お久しぶりです。
特に書くことがなかったわけでもないんですけど、書かなくていっかみたいな流れで書いてませんでした。
ATtiny13Aとは
ATtiny13Aとは、Atmel社が製造しているAVRマイコンの中の一つで、低性能ではあるが小さくて安い(50円!)のが特徴です。
安く遊べるものを探しているときにたまたま見かけて興味本位で手をだしてみました。
むずかしそう
と僕も思っていて素のAVRマイコンから少し逃げ腰だったのですが、ほぼArduinoと同じように開発することもできることを知り、以下の記事を参考にさせて頂きながら、ウキウキでライタまで準備してしまいました(ライタ作成には家に転がっていたDavinci32Uを利用しました)
マイコンボード「Da Vinci 32U」でAVRISP mkII クローンを作る | Make | kosakalab
また、Arduino環境でATtiny13Aを利用する手順については、以下の記事を参考にさせて頂きました。
Arduino IDE に ATtiny10/13 の開発環境を組み込む | Make | kosakalab
シリアル通信を行う
シリアル通信の確認は、以下の環境で行いました。
USB<->Serial | Aitendoで購入したUSB-TTL変換(PL2303HX搭載品) |
書き込み装置 | AVRISPmkII化済Davinci32U |
表示確認 | TeraTerm |
セットアップは、こちら
ATtiny13Aでシリアル通信(UART)を行う: 猫にコ・ン・バ・ン・ワ
Nerd Ralph: AVR half-duplex software UART supporting single pin operation
を参考にさせていただきながら行いました。
また、Rx,Txを一つのピンにまとめることはせず、PB3,PB4に別々に割り当てました。
説明通りにセットアップを行ったはずですが、何故か自分の環境では正しく文が表示されませんでした。
以下その試行錯誤の結果です
安定して通信できるようにする
自分の環境では、クロック1.2Mhz、ボーレート19200bpsとすると文字が受け取れるようになりましたが、時折文字が送られてこなかったり、ゴミが混ざった状態でした。
クロックの分周設定を適切に行っていなかったのが原因でした、初期状態では8分周のままであったのでそれを解除することで安定して値を受け取れるようになりました。
こちらの記事
My Blog
AVRの内蔵CRクロックを校正する
から、クロックのズレが原因ではないかと考え、記事内に記載されているコードを用いて校正値を求めました。
校正値が103であることが分かったため、この値をOSCCALレジスタにセットしてやることで、無事安定した文字列の受け取りが可能になりました。
#include <BasicSerial3.h>//ここは半角にしてください void setup() { OSCCAL=103; } void serOut(const char* str) { while (*str) {TxByte (*str++);} } void loop() { serOut("ATtiny13Aかわいいよぅ\n\r"); }
参考にさせていただいたサイト様
make.kosakalab.com
make.kosakalab.com
nuneno.cocolog-nifty.com
www.inoshita.jp
www.chibiegg.net
nerdralph.blogspot.jp