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で送受信の許可
ソースです。
送られてきたデータをエコーバックして、1文字毎にLEDを反転します。
送受信の関数名は最初getcとputcだったのですが、内部モジュールと名前がぶつかっているという警告が出たのでgetchとputchに名前を変えました。
とりあえず、外とお話しできるようになるとデバッグが楽になります。
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に名前を変えました。
とりあえず、外とお話しできるようになるとデバッグが楽になります。