リフロー炉の現在温度をパソコンなどに送信するために,シリアル通信のみをテストするプログラムを書きました.
基本的にデータシートに記載されているソースコードを使用していますが,うまく動かなかったのでいちぶへんこうしています.
変更点
- クロックを16MHzに変更
- ストップビットを1bitに変更
- ディレイ機能の追加(デバッグ用)
- 外部クロックの使用(書き込み時にFuseビットで変更している)
配線
マイコンの3番ポートから,MAX232経由でパソコンのRS-232Cにいれている.
パソコン上ではTeraTermを起動して,ターミナル上にaがたくさん表示されている.
USART_Initの引数を103と直接指定することでうまく通信するようになりました.
データシートどおりFOSC/16/BAUNDrate-1を計算すると,小数点が入るのでその影響があるのかも
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> void init(void){ // initialize USART_Init(103); // FOSC/16/BAUNDrate-1 = 16M/16/9600-1 =103.17... -> 103 } void USART_Init( unsigned int ubrr) { /* Set baud rate */ UBRRH = (unsigned char)(ubrr>>8); UBRRL = (unsigned char)ubrr; /* Enable receiver and transmitter */ UCSRB = (1<<RXEN)|(1<<TXEN); /* Set frame format: 8data, 0stop bit */ UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0); } void USART_Transmit( unsigned char data ) { /* Wait for empty transmit buffer */ while ( !( UCSRA & (1<<UDRE)) ); /* Put data into buffer, sends the data */ UDR = data; } int main(void){ init(); char data = 'a'; while(1){ USART_Transmit(data); _delay_ms(10); } return 0; } |