void uart9600_setup();
void serial_put(char *string);
void num2str(int i,char *a);
char nu2ch[3];
TCCRxA – Timer/Counter Control Register A (x 代表 0, 1 或 2):
TCCRxA 暫存器主要是用來設定 Timer 的模式,例如 PWM 輸出等進階的功能。一般來說,如果沒用到 PWM,只是要單純的 Timer/Counter 功能的話,
那麼把 TCCR0A 暫存器設定成 0x00 就行了。
TCCRxB – Timer/Counter Control Register B:
TCCR1B 暫存器主要是用來設定 clock source。比較重要的是 CS12、CS11 和 CS10 這三個位元,這三個元位就是用來選擇 clock 的
TCNTx – Timer/Counter Register:
TCNTx 暫存器比較簡單,它就是 Timer 的計數器。
void setup() {
// put your setup code here, to run once:
//Serial.begin(9600);
uart9600_setup();
TCCR1A=0x00;
TCCR1B |=_BV(CS12);
TCCR1B |=_BV(CS11);
TCCR1B |=_BV(CS10);
TCNT1=0;
}
void loop() {
serial_put("TCNT1:");
num2str(TCNT1,nu2ch);
serial_put(nu2ch);
serial_put("\n");
delay(1000);
}
void num2str(int i,char *a)
{
unsigned char t,h,z;
if (i>999)
{
i=0;
}
else
{
t=(i/100);
h=(i-t*100)/10;
z=(i-t*100-h*10);
a[2]=z+48;
a[3]='\0';
if (t==0)
{
*a=' ';
if(h==0)
{
a[1]=' ';
}
else
{
a[1]=h+48;
}
}
else
{
*a=t+48;
a[1]=h+48;
}
}
}
UCSR0A – USART Control and Status Register A:
在 UCSR0A 這個暫存器中,比較重要的是 RXC0, TXC0, UDRE0 這三個旗號:
bit7 RXC0: USART Receive Complete,當 receiver buffer 中有未讀取的資料時,這個旗標會變1,當資料被讀走時,旗標會變0。
bit6 TXC0: USART Transmit Complete,當 Shift Register 的資料被傳送出去,而且 transmit buffer (UDR0) 中也沒有資料時,這個旗標會變1。
bit5 UDRE0: USART Data Register Empty,當 transmit buffer (UDR0) 準備好放下一個要傳送的資料時,這個旗標變1。
UDR0 – USART I/O Data Register 0:
UDR0 暫存器比較簡單,它是用來放資料的暫存器。比較特別的是,transmitter 跟 receiver 共用 UDR0 暫存器。不過,對 UDR0 寫資料其實是放到 TXB 暫存器,而讀取 UDR0 時資料則是從 RXB 暫存器中取出。
void serial_put(char *string)//傳送字串
{
while(*string)
{
while(!(UCSR0A & 0b00100000)) //判斷UDRE0是否已經準備好要傳送下一個char
{ }
UDR0=*string++;//UDR0=*string;*string=*string+1;
}
}
UBRR0L 和 UBRR0H – USART Baud Rate Registers:
UBRR0H[11:8]
UBRR0L[7:0]
這兩個暫存器是用來設定 Baud Rate 的,公式是:
設定值 = (F_CPU/16/baud rate) – 1
其中 F_CPU 代表時脈頻率,以 Arduino UNO 而言是 16000000,baud rate 是想要的速率,例如 9600, 19200, 38400, 57600… 等。
UCSR0B – USART Control and Status Register B:
RXCIE0, TXCIE0, UDRIE0 則是用來決定要不要啟用中斷的位元:
bit7 RXCIE0: USART Receive Complete Interrupt Enable 0
bit6 TXCIE0: USART Transmit Complete Interrupt Enable 0
bit5 UDRIE0: USART Data Register Empty Interrupt Enable 0
bit4 RXEN0 接收器旗標 0:關閉 1:啟用
bit3 TXEN0 發射器旗標 0:關閉 1:啟用
UCSR0C – USART Control and Status Register C:
UCSR0C 是用來設定通訊所用的 Frame format (訊框格式),比如同步/非同步傳輸, Parity, Stop bit 及 Data bits 等設定:
相關設定可以參考
http://coopermaa2nd.blogspot.tw/2011/07/5-usart.html
void uart9600_setup()
{
//UART初始設定9600 n,8,1
//ubrr 設定值 = (F_CPU/16/baud rate) – 1
//ubrr=16000000/16/9600-1=103
UBRR0H=(unsigned char)0;
UBRR0L=(unsigned char)103;
UCSR0B=0B00011000;//啟動接收中斷、啟動傳送接收
UCSR0C=0B00000110;//usart control and status register c n,8,1
}
參考:
http://coopermaa2nd.blogspot.tw/2011/07/42-timer-as-counter.html
材料:
開關 1個
電阻10K 1個
接線圖
實驗結果