2014年6月5日木曜日

AVRマイコン事始め(UART編)

さて、UARTを扱うことになる。
ここで一気に難易度が上がることになるが
これが扱えればマイコンの全貌が見えてくるようになる

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 件のコメント:

コメントを投稿