2012-09-10 32 views
3

我正在與GSM sim900D接口與Atmega16接口。最初我在麪包板上使用MAX232製作電路。然後我用串口將它連接到我的電腦上。我測試了AT命令,這些命令在超級終端上完美運行,並且我能夠使用超級終端發送SMS。然後我在Proteus上測試了它,並且它在那裏工作也很完美。與atmega16 GSM接口

我使用codevision avr作爲編譯器。 GSM工作在9600波特,但問題是,在編譯器中,我必須保持波特率4800(時鐘= 1MHz)和proteus COMPIM(物理波特= 9600 &虛擬波特= 4800)只有當它在硬件上運行時)它不起作用,因爲我已將波特率設置爲4800.我不知道如何設置硬件的波特率。我在編譯器中嘗試了9600baud的硬件,但它根本不發送SMS。請告訴我該怎麼辦?

回答

0

在ATmega16的(和其他ATmegas),串行波特率經由UBRRHUBRRL寄存器加上在UCSRA寄存器中的U2X位置。有關如何工作的詳細說明從ATmega16 datasheet的第146頁開始。基本上,UBRR是一個16位寄存器,因此必須通過8位部分UBRRH(高位字節)和UBRRL(低位字節)分別訪問。要投入這些寄存器(和U2XUCSRA寄存器)的值取決於

  • 時鐘速率
  • 所需的波特率。

頻率爲1MHz時鐘和9600有兩種選擇(見表68 168頁上的數據表中):清除U2X位和UBRR設置爲6或設置U2XUBRR集到12.後一種選擇導致波特率的產生更接近所需的波特率(0.2%)誤差,因此建議採用後者的選項。因此,你想要的代碼是:

UBRRH = 0; 
UBRRL = 12; 
UCSRA |= 1<<(U2X); 

有一個討厭的疑難雜症在這裏潛伏:如數據表狀態,UBRRHUCSRC是相同的寄存器。 UCSRC控制奇偶校驗,停止位和其他重要設置。因此,如果你需要寫UCSRC,請確保您設置在同一時間URSEL位:

UCSRC = (1<<URSEL) | (...other bits...) 

UCSRC |= (1<<URSEL) | (...other bits...) 

否則你會揍你UBRRH註冊並想知道爲什麼你的波特率不符合你的預期。

但你也可以使用AVR libc的代碼,這對於設置在AVR波特率提供讀讓路,請參閱util/setbaud.html

0

您檢查數據表中的錯誤率太高。當你在1MHZ上使用9600波特率時,這是主要問題。儘可能採取8,12,16 MHZ並檢查數據表。並且不要忘記刻錄與XTAL頻率相關的熔絲位,如果您沒有正確刻錄這些與晶體無法正常工作有關的位。

如果你需要更多的幫助請問..