software'owy UART a Timer0 w ATMega32



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
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

Poprzedni Następny
Wiadomość
Spis treści
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

Poprzedni Następny
Wiadomość
Spis treści
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

Poprzedni Następny
Wiadomość
Spis treści
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

Poprzedni Następny
Wiadomość
Spis treści
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

Poprzedni Następny
Wiadomość
Spis treści
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

Poprzedni Następny
Wiadomość
Spis treści
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