Sim's blog

電子工作はじめてみました

AVRのUSARTを使ってみる

2008-09-23 16:12:13 | AVR
AVRでUSARTを使ってみました。
MAX232のようなレベル変換のICでなくて、秋月で売っているFT232RL USBシリアル変換を使っています(通販番号K-01977)。
FT232RLは3.3VのLDOを内蔵していて、外部に3.3Vを給電することができます。データシートを見ると(4.2)最大50mAを供給できるそうです。入出力の電圧はVCCIOというpinにいれる電圧で決まります。秋月モジュールではJ1を1-2ショートで5V、2-3ショートで3.3Vを選べます。VCCIOはCN2の4pinに出ているので、ジャンパを取り去って、外部から電圧を決めてやることもできます。

秋月のモジュールにはリセット用抵抗端子PU1, PU2というのがあります。PU2の電圧を10kΩ2個で分圧してPU1に出ています(PU2-10kΩ-PU1-10kΩ-GND)。PU1がPU2の半分の電圧になる回路になっています。ついてきた紙には、この回路の使い方が書いてありませんでした。FT232RLのデータシートを見ると、RESET#の説明に
Active low reset pin. This can be used by an external device to reset the FT232R. If not required can be left unconnected, or pulled up to VCC.
と書かれています。resetはオープンにするかプルアップでいいので、秋月のモジュールにあるリセット用回路は使う必要がないみたいです。何のためについている回路なんでしょうね?

秋月のモジュールは次の4本を接続するだけで使えるようになります。

1pin TXD PC→マイコンへのデータ伝送
5pin RXD マイコン→PCへのデータ伝送
7pin GND (24pin GND、内部でつながっている)
4pin VIO I/Oの電圧を外部から給電する(J1のジャンパは取り外す)

秋月モジュールから給電するときは、VIOのかわりに5VならVCC(15pin, 21pin)、3.3Vなら3V3(19pin)をつなぎます。

ATMega88側はRXD(2pin)を秋月モジュールのTXDに、TXD(3pin)を秋月モジュールのRXDにつなぎます。あべこべにつなぎます。お約束通り、最初はTXD同士、RXD同士つないで動かない理由が分かりませんでした。

AVRの初期設定は次の3つです。
(1) UBRR0でボーレートの設定(必要ならUCSR0AのU2X0も設定)
(2) UCSR0Cでパリティ、データビット長、ストップビットの設定
(3) UCSR0Bで送受信の許可

ソースです。
#include <avr/io.h>

typedef unsigned char byte;

byte getch(void)
{
    while(!(UCSR0A & _BV(RXC0))) ;
    return UDR0;
}

void putch(byte c)
{
    while(!(UCSR0A & _BV(UDRE0))) ;
    UDR0 = c;   
}

void usart_init(void)
{
#if 0
    UBRR0 = 51; // 9600bps @ 8MHz
#else
    UBRR0 = 25; // 38400bps @ 8MHz
    UCSR0A = _BV(U2X0);
#endif

    // 19.10.4 USART制御/状態レジスタC
    //         ++------ UMSEL01:UMSEL00 00 非同期動作
    //         ||++---- UPM01:UPM00     00 パリなし
    //         ||||+--- USBS0            0 ストップビット 1ビット
    //         |||||++- UCSZ01:UCSZ00   11 データビット 8ビット 
    //         |||||||+ UCPOL0           0 クロック極性立ち上がり
    UCSR0C = 0b00000110;

    // 19.10.3 USART制御/状態レジスタB
    //         +------- RXCIE0 0
    //         |+------ TXCIE0 0
    //         ||+----- UDRIE0 0
    //         |||+---- RXEN0  1 受信許可
    //         ||||+--- TXEN0  1 送信許可
    //         |||||+-- UCSZ02 0 データビット長
    //         ||||||+- RXB80  0 受信データビット8
    //         |||||||+ TXB80  0 送信データビット8
    UCSR0B = 0b00011000;
}

int main()
{
    // LED設定
    DDRB = 0x01;
    PORTB = 0x01;

    usart_init();

    while(1){
        putch(getch());
        PORTB ^= 0x01;
    }
}

送られてきたデータをエコーバックして、1文字毎にLEDを反転します。
送受信の関数名は最初getcとputcだったのですが、内部モジュールと名前がぶつかっているという警告が出たのでgetchとputchに名前を変えました。

とりあえず、外とお話しできるようになるとデバッグが楽になります。

最新の画像もっと見る

コメントを投稿