Arduino UNOでUSARTのテスト。
以下のコードで、FOSCを16000000、16ULを16にしてたら動かなかった。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1130998931
基本的だけど、AVRのunsigned intは16bit、2バイトなので65535までしか表現できない。
(ホストPCで使ってるgccのunsigned shortに相当)
160MHz、16000000を使うときはULをつけないといけない。
割り算するときも、intで割るとintにそろえられるので、分母の16に16ULを指定して
unsigned long同士の割り算であることを明示している。
http://www.clarestudio.org/elec/avr/gcc-2.html
#include <avr/io.h> #include <util/delay.h> #define FOSC 16000000UL #define BAUD 9600 #define MYUBRR ((FOSC/(16UL*BAUD))-1) void Blink(int cycle,int del){ int i; for(i=0;i<cycle;i++){ PORTB ^= _BV(PORTB5); _delay_ms(del); } } void USART_init(unsigned int ubrr){ UBRR0H = (ubrr>>8); UBRR0L = ubrr; UCSR0B = _BV(RXEN0)|_BV(TXEN0); //RX-TX enable //UCSR0C = _BV(USBS0)|(3<<UCSZ00);//define data frame UCSR0C = (3<<UCSZ00);//define data frame } void USART_Transmit(unsigned char data){ //while(!bit_is_set(UCSR0A,UDRE0)); while(!(UCSR0A & (1<<UDRE0))); UDR0 = data; Blink(3,500); PORTB = 0x00; } int main(void){ DDRB |= _BV(PORTB5); USART_init(MYUBRR); // USART_Transmit('b'); // USART_Transmit('c'); while(1){ USART_Transmit('a'); _delay_ms(1000); } return 0; }