software'owy UART a Timer0 w ATMega32
Masz problem? Zapytaj na forum elektroda.pl
From: "Krzysztof Skoroniak" <ananas_at_nospam_NospaM.polsl.gliwice.pl>
Subject: software'owy UART a Timer0 w ATMega32
Date: Sun, 20 Jun 2004 19:28:30 +0200
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
========
Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.internetia.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Pablo_C" <pch[ciach]_at_nospam_poczta.onet.pl>
Subject: Re: software'owy UART a Timer0 w ATMega32
Date: Sun, 20 Jun 2004 21:08:42 +0200
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
========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Krzysztof Skoroniak" <ananas_at_nospam_NospaM.polsl.gliwice.pl>
Subject: Re: software'owy UART a Timer0 w ATMega32
Date: Sun, 20 Jun 2004 21:33:06 +0200
Użytkownik "Pablo_C" <pch[ciach]_at_nospam_poczta.onet.pl> napisał w wiadomości
news:cb4n5f$4vi$1_at_nospam_nemesis.news.tpi.pl...
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.
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
========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Pablo C" <pch[ciach]_at_nospam_poczta.onet.pl>
Subject: Re: software'owy UART a Timer0 w ATMega32
Date: Mon, 21 Jun 2004 07:39:52 +0200
masz rację. coś mi sie pokręciło.
PC
========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!news.onet.pl!not-for-mai
From: "EM" <edim123_at_nospam_poczta.onet.pl>
Subject: Re: software'owy UART a Timer0 w ATMega32
Date: Mon, 21 Jun 2004 10:10:10 +0200
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);
--
Pozdrawiam
EM
========
Path: news-archive.icm.edu.pl!news.rmf.pl!news.ipartners.pl!not-for-mai
From: "andrzej_wilk" <pisz.do.andrzej_at_nospam_sielanka.gda.pl.com>
Subject: Re: software'owy UART a Timer0 w ATMega32
Date: Mon, 21 Jun 2004 13:59:02 +0200
Użytkownik "Krzysztof Skoroniak" <ananas_at_nospam_NospaM.polsl.gliwice.pl> napisał w
wiadomości news:cb4hl2$hsf$1_at_nospam_nemesis.news.tpi.pl...
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
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
========
Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.internetia.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Krzysztof Skoroniak" <ananas_at_nospam_NospaM.polsl.gliwice.pl>
Subject: Re: software'owy UART a Timer0 w ATMega32
Date: Mon, 21 Jun 2004 16:30:58 +0200
Użytkownik "andrzej_wilk" <pisz.do.andrzej_at_nospam_sielanka.gda.pl.com> napisał w
wiadomości news:cb6ii5$2svk$1_at_nospam_news2.ipartners.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.
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
========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!news.task.gda.pl!news.ds.pg.gda.pl!not-for-mai