avr usart

May 24, 2006 1 Replies

Witam.



Mam pytanie odno¶nie wysy³ania ci±gu znaków w avr przez usart.



Mam przygotowanie dwadzie¶cia znaków do wys³ania w tablicy unsigned char tx_tab[20]; i zmienn± okre¶laj±c± aktualnie wysy³any znak unsigned char curr_tx; Dane wysy³am z u¿yciem przerwañ na pusty bufor wyj¶ciowy i koniec wysy³ania znaku. Nie jestem pewien co do poprawno¶ci kodu.



//start SIG_USART0_UDRE_ENABLE; //odblokuj przerwanie UDR Pusty



SIGNAL(SIG_USART0_UDRE) { UDR = tx_tab[curr_tx]; } SIGNAL(SIG_USART0_TX) { if(curr_tx == 19) //Je¶li wys³ano ostatni znak ci±gu { SIG_USART0_UDRE_DISABLE; //zablokuj przerwanie UDR Pusty return; } curr_tx++; }



Czy jest mo¿liwe ¿e przerwanie SIG_USART0_UDRE zostanie wywo³ane dwukrotnie bez przerwania SIG_USART0_TX i zwiêkszenia zmiennej curr_tx ? Tzn. ¿e do UDR zostanie zapisany dwukrotnie ten sam znak? Je¶li tak to czy powinienem w przerwaniu SIG_USART0_UDRE blokowaæ to przerwanie, a po zakoñczeniu transmisji znaku tzn. w SIG_USART0_TX odblowkowaæ je? Czy robi siê to jeszcze inaczej?



Dziêki za pomoc. Pozdrawiam Pawe³



Wyglada to tak - wpisujesz do UDR, sprzetowo jest to przepisywane do rejestru przesuwnego (ktory to sobie powolutku wypycha na TXD), a tu sie juz generuje przerwanie UDRE... dalej sie dzieje to co opisales. Poza tym pamietaj ze niektore avr maja 2 poziomy bufora UDR (atmegi), niektore 1 (AT90Sxxxx)..

Mozesz inkrementowac index w przerwaniu UDRE, albo zrealizowac wszystko w samym przerwaniu TX.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required