ここで一気に難易度が上がることになるが
これが扱えればマイコンの全貌が見えてくるようになる
UARTを扱うには
マイコンの特殊レジスタだとか
動作クロックだとか、割り込みベクタだとか
どうしても避けられないからね
…まずは、マイコンの動作クロックであるが
AVRは一瞬おや?と思うものがある。
他のAVR関連サイトでも散々触れられているけれど
AVRにはFUSEビットというものがあって
これが動作クロックと大いに関係があるのだ。
マニュアルによると下図のとおり
デフォルトでは内蔵クロックが8MHzだというのはわかる。
問題はCKDIV8というフラグだけど
「0」だと8分周されて、「1」だとされない。
これがちょっとわかりづらいですねw
「1」をセットすると8分周されるのに、どうして
動作クロックが上がるんだ?と真剣に悩んだw
「1」=Enableという固定観念は良くないですな┐(´д`)┌
マニュアルの方もビット名の上にバーを置くとか…しないですか?
___
CKDIV8 ←こんな感じ?w
・次に特殊レジスタである。
tiny2313でUARTを扱う際に使用するレジスタは次のとおり。
UDR :読み込み時はRxDに、書き込み時はTxDになる優れものw
UCSRA:殆ど通信ステータスですね。
UCSRB:送受信イネーブラー
UCSRC:通信コントローラー。個人ユースであればデフォルト値で問題なさそう
UBRR :設定ボーレート係数。
代表的なボーレートと動作クロックであればマニュアルに設定値が書いてある。
変なところで親切すぎて笑ったw
他にもI/Oコントローラだとか
いろいろと設定することは多いのだろうな…と意気込んで
マニュアルのUSART Initializationのところを見たら
void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<USBS)|(3<<UCSZ0);
}
え?このコード簡単すぎません?ホンマかいな・・・と
コーディングを開始。
とりあえず8data stopビット1パリティやらはなし、4800bps
データ受信だけEnable。
割込みは使わないでUCSRAのRXCビットを見て
そのデータをそのままキャラクターLCDに
表示させるようなプログラムということで…
プログラムを書き込んだら、
送信ラインを別の端子に差し替えて、
FT-232Lの作る仮想ポートにTeraTermからデータを送信してやる。
ね?簡単でしょ?
・・・いや、本当に簡単すぎてなんだか拍子抜けw
次は割込みに挑戦してみよう・・・
0 件のコメント:
コメントを投稿