此例使用 USB 轉TTL 設備與 ATmega16 進行資料傳送與接收測試,如果手中剛好沒有 USB 轉TTL 設備,也可以使用 Arduino uno 來當 USB 轉TTL 設備,但使用時需要先將 RESET 與 GND 短路。

 

電路:

USB 轉TTL 與 ATmega16 接線

RX <-> TX

TX <-> RX

GND <-> GND

Arduino uno 與 ATmega16 接線

1. Arduino uno 板中的 ATmega16U2-MU 已經跳過線,所以直接對接即可。( 請參考 Arduino uno 電路圖 )

2. Arduino uno 當 USB 轉TTL 設備使用時,需要將 RESET 與 GND 短路。

 

VCC <-> VCC

RX <-> RX

TX <-> TX

GND <-> GND

 

以下介紹程式會使用到 UBRR、UCSRA、UCSRB、UCSRC、UDR 這幾個 Register的使用方法。

 

UBRR:

UBRR 由UBRRH 與 UBRRL 組合而成的 16 bit 的Register,UBRRH 代表16bit中的高字元,UBRRL代表16bit中的低字元,存放Baud Rate計算完後的數值,計算方式如下表所示。

Mode

計算式

Asynchronous Normal Mode (U2X = 0)

((F_CPU)/(BAUD*16UL)-1)

Asynchronous Double Speed Mode (U2X = 1)

((F_CPU)/(BAUD*8UL)-1)

Synchronous Master Mode

((F_CPU)/(BAUD*2UL)-1)


 

例子1:

以Asynchronous Normal Mode 為例,當Baud Rate 為 9600,外部振盪器為16MHz,(16000000/(9600*16)-1)=104,104 16進制為0x68,0x68高 8 bit 為 0,低 8 bit 為0x68,則UBRRH=0x0 UBRRL=0x68

 

例子2:

以Asynchronous Normal Mode 為例,當Baud Rate 為 1000,外部振盪器為16MHz,(16000000/(1000*16)-1)=1000,1000 16進制為0x3E8,0x3E8高 8 bit 為 0x3,低 8 bit 為0xE8,則UBRRH=0x3 UBRRL=0xE8。

 

UCSRB:

當我們要使用 USART 時,需要將 UCSRB中的 RXEN (RX Enable) 與 TXEN (TX Enable) 設為 1。

UCSRC:

需要將URSEL設為 1,UCSRC 跟 UBRRH 設定值才會生效。

UCSRC 中的 UCSZ0、UCSZ1與UCSRB 中的UCSZ2,主要用來設定 data bits,此例中使用的 data bits 為8 bits,UCSZ0=1  UCSZ1=1  UCSZ2=0,因為 UCSZ2 預設為 0,所以無需再另外設定,僅須設定 UCSZ0、UCSZ1。

以下介紹的UCSRA、 RXC、UDRE ,主要用來發送與接收 USART 資料。

UCSRA:

RXC:

receive buffer (UDR)被更新時,UCSRA 中的 RXC 數值會被設為 0,此時我們可以讀出UDR 中接收的新資料。

 

UDRE:

當 UDRE 為 0 時,表示 UDR 在接收新資料,當 UDRE 為 1 時,可以寫值到 transmit buffer (UDR) 中,進行資料傳送。

 

 

程式:

#define F_CPU 16000000UL //外接振盪器頻率

#define BAUD 9600 //通訊鮑率                                  

#define BAUDRATE ((F_CPU)/(BAUD*16UL)-1)  

 

#include <stdio.h>

#include <avr/io.h>

#include <util/setbaud.h>

 

static int uart_putchar(char c, FILE *stream);

static char uart_getchar(FILE *stream);

static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,_FDEV_SETUP_WRITE);

static FILE mystdin = FDEV_SETUP_STREAM(NULL, uart_getchar, _FDEV_SETUP_READ);

 

void uart_init(void) {

 

   UBRRH = BAUDRATE>>8;

   UBRRL = BAUDRATE;

 

  

   UCSRC = 1<<URSEL | 3<<UCSZ0; /* 設定為 8-bit data */

   UCSRB = 1<<RXEN | 1<<TXEN;   /* Enable RX and TX */

}

 

static int uart_putchar(char c, FILE *stream)

{

 

 while ( !( UCSRA & (1<<UDRE)) ); /* Wait for empty transmit buffer */

 UDR = c;

 return 0;

}

 

static char uart_getchar(FILE *stream) {

   

while ( !(UCSRA & (1<<RXC)) );/* Wait for data to be received */

   return UDR;

}

 

int main(void)

{

 uart_init();

 stdout = &mystdout;

 stdin = &mystdin;

 char input;

 

 while(1){

  input = getchar();

    printf("%c",input);

 }

 return 0;

}

 

將程式編譯燒錄到 Atmega16 後,可以使用 Access Port 軟體進行測試,或是直接使用 Arduino IDE 中的 Serial Monitor 也是可以進行測試,以下介紹使用 Access Port測試方法。


 

開啟 Access Port 後點選設定按鈕,將Baud Rate 設為 9600,Com Port 設為 COM4(依照電腦裝置管理員抓到的 USB轉TTL 設備 Com Port 進行設定),data bits 設為 8bit。

 

接下來依照以下步驟進行設定與測試即可。

 

  1. 開啟 Com Port

  2. 將接收轉為字元顯示

  3. 選擇發送字串

  4. 勾選即時發送

  5. 輸入資料(輸入資料後,MCU 會收到輸入的資料,並回傳相同資料給 PC )

  6. 顯示接收資料

 

參考資料:

http://www.appelsiini.net/2011/simple-usart-with-avr-libc

http://coopermaa2nd.blogspot.tw/2012/07/arduino-as-usb-to-ttl-adapter.html

 

創作者介紹
創作者 iammic 的頭像
iammic

簡單過生活

iammic 發表在 痞客邦 留言(0) 人氣()