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個
接線圖
實驗結果
沒有留言:
張貼留言