software'owy UART a Timer0 w ATMega32

Jun 20, 2004 6 Replies

witam



zrobilem sobie software'owego uarta na ATMega32 na kwarcu 11059200 WinAVR



i w zasadzie transmisja mi dziala ale wykrylem cos dziwnego co mnie troche zainstrygowalo dlatego pytam moze ktos bedzie wiedzial co sie dzieje a mianowicie mam linie TxD na linii PORTD4



i jak ustawie dla Timera0 dzielnik czestotliwosci rowny 64:



TCCR0 &= ~_BV(CS02); //ustawienie dzielnika dla Timera 0 TCCR0 |= _BV(CS01); //dzielnik: 64 TCCR0 |= _BV(CS00);



oraz wpisze do rejestru: TCNT0 = 256 - 3; a wiec przerwanie od timera bedzie mi sie wykonywalo 57600 razy na sekunde przy takich ustawieniach wsyzstko dziala dobrze



ale jak zrobie cos takiego: ustawie dla Timera0 dzielnik czestotliwosci rowny 8:



TCCR0 &= ~_BV(CS02); //ustawienie dzielnika dla Timera 0 TCCR0 |= _BV(CS01); //dzielnik: 8 TCCR0 &= ~_BV(CS00);



oraz wpisze do rejestru: TCNT0 = 256 - 24; a wiec przerwanie od timera bedzie mi sie wykonywalo takze 57600 razy na sekunde to przy takich ustawieniach transmisja sie rozjezdza oczywiscie wszystko jest dla takiego samego kodu transmisji ramki co moze byc nie tak przeciez z punktu widzenia AVR'a nie ma to znaczenia jaki dzielnik wpisze oraz ile bede wpisywac do rejestru TCNT0



pozdrawiam Krzysztof



ja tylko zgadujê ale mo¿e procedura obs³ugi przerwania od timera obci±za procesor. jakby nie patrzeæ dla dzielnika 8 wykonuje siê 8 razy czê¶ciej.

PC

U¿ytkownik "Pablo_C" <pch[ciach]@poczta.onet.pl> napisa³ w wiadomo¶ci news:cb4n5f$4vi$ snipped-for-privacy@nemesis.news.tpi.pl...

ale procedura obslugi przerwania wykonuje sie w obydwu przypadkach tak samo czesto tam jest tylko kwestia dobrania wartosci do rejestrow sa dwa podejscia:

1) dzielnik czestotliwosci rowny 64: TCNT0 = 256 - 3 2) dzielnik czestotliwosci rowny 8: TCNT0 = 256 - 24

one powoduja ze procedura obslugi przerwania wywolywana jest tak samo czesto dlatego nie rozumiem dlaczego w pierwszym przypadu transmisja dziala dobrze a w drugim nie:-)

Krzysztof

Witam Wydaje mi siê, ¿e nic nie piszesz o trybie pracy timera. A skoro nie piszesz, to czy przypadkiem nie dzia³a on w trybie 0 i wtedy jest ma³a ró¿nica czy licznik pracuje do 256-3 czy do 256 i UART dzia³a. Natomiast je¶li powinno byæ 256-24 a jest 256, to ju¿ nie bêdzie dzia³a³o. Nie wdawa³em siê w szczegó³y, ale chyba licznik powinien pracowaæ w trybie CTC wiêc WGM01=1, WGM00=0. Poza tym ustawianie bitów w sposób przez ciebie opisany jest na moje oko ma³o czytelny. Czy nie lepiej co¶ w stylu: TCCR2 = (1 << WGM21) | (1 << CS22) | (1 << CS21) | (1 << CS20);

U¿ytkownik "Krzysztof Skoroniak" snipped-for-privacy@NospaM.polsl.gliwice.pl> napisa³ w wiadomo¶ci news:cb4hl2$hsf$ snipped-for-privacy@nemesis.news.tpi.pl...

Nie wiem na pewno, ale strzelam, ¿e kluczowy jest czas wykonania procedury obs³ugi przerwania.

Je¶li masz dzielnik 64, to mo¿esz ustawiæ Timer w przeci±gu 1/ (57600 * 3) sek. = 5 us i wszystko bêdzie dzia³aæ OK. Przy dzielniku 8 masz tylko 1/(57600 * 24) sek = ok 0.7us. Je¶li ustawisz Timer pó¼niej, to "stracisz" kilka taktów zegara i rzeczywista prêdko¶æ transmisji bêdzie mniejsza.

Ustawianie Timer'a na samym pocz±tku obs³ugi mo¿e pomóc.

Andrzej

U¿ytkownik "andrzej_wilk" snipped-for-privacy@sielanka.gda.pl.com> napisa³ w wiadomo¶ci news:cb6ii5$2svk$ snipped-for-privacy@news2.ipartners.pl...

witam ustawienie timera bylo na samym poczatku procedury ale teraz zrobilem cos innego: wczesniej timer pracowal w trybie normal ustawilem go teraz w trybie CTC co powoduje ze nie musze sie przejmowac kiedy i gdzie ustawiac wartosc timera, w ten sposob otrzymuje wieksza stabilnosc probkowania bitow w tym rozwiazaniu wszystko dziala idealnie, dopisalem takze odbieranie ramek i tez wszystko dziala do predkosci 57600 a wieksza predkosc i tak nie jest mi potrzebna wiec juz wszystko dziala

dzieki wszystkim za pomoc pozdrawiam Krzysztof

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required