Translate

2017年6月16日 星期五

Arduino Timer as a Counter

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個

接線圖



























實驗結果


























沒有留言:

張貼留言