Menu
Komunikácia s ATMega8 cez USART
Po odladení prvej komunikujúcej aplikácie som už konečne pochopil, aké jednoduché je niečo podobné postaviť a oživiť.
Budeme k tomu potrebovať :
- ATMega8 procesor
- kryštál 7,372 MHz
- prevodník RS232 na USB (FT232RL)
- a samozrejme počítač s nainštalovaným klientompre telnet, prípadne iný software komunikujúci cez COM porty
Schéma zapojenia:
Podstatu a podrobné fungovanie rozhrania USART ponechám na katalógový list obvodu. Prejdeme rovno k podstate celého článku a to nastaveniu a oživeniu rozhrania na obvode. V prvom rade bude treba v kóde nastaviť prenosovú rýchlosť rozhrania a aktivovať vysielač a priímač. Ako prenosovú rýchlosť si zvolímenapríklad 9600 baud, data bitov je 8, parita žiadna a stop bit je jeden.
To dosiahneme nasledujúcim kódom.
Kód:
//############## INICIALIZACIA KOMUNIK. ROZHRANIA #############// void USARTInit(uint16_t ubrr_value) { UBRRL = ubrr_value; UBRRH = (ubrr_value>>8); UCSRB =(1<<RXEN)|(1<<TXEN); //odblokovanie vysielaca a priimaca UCSRC =(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); UCSRA = (1<<U2X); }
Ako vstupný parameter procedúry je požadovaná hodnota registra UBRR. Je to hodnota udávajúca rýchlosť komunikácie, ktorá sa vypočíta zaokrúhlením výsledku nasledujúceho výpočtu: UBRR = (CPU_FREQ/16/BAUD_RATE)-1. Pre náš kryštál a nastavenú prenosovú rýchlosť zodpovedá vstupu hodnota UBRR = (7372800/16/9600)-1. Pretože je zapnutý U2X, je hodnota dvojnásobná: 95. Bit U2X udáva dvojnásobnú rýchlosť z daného UBRR.
Príklad dalších hodnôt parametra:
95 pre 7,3728 MHz external crystal ak U2X=1
103 pre 8 MHz external crystal ak U2X=1
Ďalšie prehľadové tabuľky: http://www.wormfood.net/avrbaudcalc.php
Ďalej pri komunikácii budeme potrebovať funkcie pre odoslanie a prijatie dát z rozhrania. Na to poslúži nasledujúci kód.
Kód:
//############## PRIJATIE ZNAKU ZO ZBERNICE #############// char USARTReadChar() { //pokial neprisiel nejaky znak tak stoj a cakaj na prikazy while(!(UCSRA & (1<<RXC))) { } return UDR; //navratova hodnota je prijaty byte } //############## ZAPIS ZNAKU DO ZBERNICE #############// void USARTWriteChar(char data) { //pokial nedokonci predchadzajuce cinnosti tak caka, inak posle while(!(UCSRA & (1<<UDRE))) { } UDR=data; //vysle data na zbernicu }
Teraz už len stačí nastaviť také isté parametre na rozhraní príslušného komunikačného portu v PC a v programe, ktorý budeme na komunikáciu používať.
Pre nás platí nasledovné:
- prenosovú rýchlosť si zvolíme napríklad 9600 baud
- data bitov bude 8
- parita žiadna
- stop bit jeden
Pre správne fungovanie je potrebné mať nastavené všetko ako je uvedené.
Potrebujeme už len program dostať do procesora a prepáliť poistky (fuses) pre externý kryštál do 8MHz. To spravíme nasledovne. Zaškrtneme CKOPT poistku a CKSEL nastavíme na EXT Crystal/Resonator High Freq.
Komunikácia bude fungovať určite bez problémov, ak je všetko nastavené v poriadku.
Obrázok hotového zapojenia:
Doplňujúce info