ULを付ける理由

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;  
}