Cの文字列リテラルがchar型配列の最後にヌルターミネータ'\0'を挿入してくれてるおかげで
putStringの実装が楽だった。(配列ループの終了条件にarray[i]を入れられるので)
#include <avr/io.h> #include <util/delay.h> #define FOSC 16000000UL #define BAUD 9600 #define MYUBRR ((FOSC/(16UL*BAUD))-1) void USART_init(unsigned int ubrr){ UBRR0H = (ubrr>>8); UBRR0L = ubrr; UCSR0B = _BV(RXEN0)|_BV(TXEN0); //RX-TX enable UCSR0C = (3<<UCSZ00);//define data frame: CSZ = CharacterSiZe } void USART_Transmit(unsigned char data){ loop_until_bit_is_set(UCSR0A,UDRE0); UDR0 = data; } char USART_recv(void) { while(!(UCSR0A & (1<<RXC0))); return UDR0; } char *putString(char msg[]) { int i; for(i=0;msg[i];i++){ USART_Transmit(msg[i]); } } int main(void){ DDRB |= _BV(PORTB5); USART_init(MYUBRR); char data; putString("Hello\n"); while(1){ data = USART_recv(); USART_Transmit(data); } return 0; }