Re: AVRGCC - TIMER0



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Rafit" <rafit_at_nospam_polbox.com>
Subject: Re: AVRGCC - TIMER0
Date: Mon, 20 Aug 2001 18:05:44 +0200



Użytkownik "Andrzej Zyśk" <azysk_at_nospam_st.com.pl> napisał w wiadomości
news:9lqmgl$pk3$1_at_nospam_news.tpi.pl...
Rafit wrote:
Całość działa poprawnie do czasu uaktywnienia przerwań RSa. Działanie
wygląda tak, jakby przerwania RSa wprowadzaly zmiany w częstotliwości
wywoływania przerwania TIMER0.
Czy może ktoś mi wyjaśnić dlaczego tak się dzieje i jak ewentualnie temu
zapobiec?
Z tego co pamiętam obsługa przerwania poprzez SIGNAL wyłącza przerwania,
natomiast INTERRUPT pozostawia je włączone (to gdzieś jest napisane, ale
nie chce mi się szukać).
Znalazłem tak jest faktycznie. Dzięki.

Myślę, że w twoim przupadku obsługa przerwania od
RS'a trwa dłużej niż okres TIMER0 i gubisz przerwania OVERFLOW0, dodatkowo
licznik po przepełnieniu zostaje załadowany 0x00 a nie 0xAC przez co
następne przerwanie przychodzi po ok. trzykrotnie dłuższym czasie. Moim
skromnym zdaniem masz dwie możliwości:
1. Popracować nad obsługą przerwania od RS'a, żeby nie zajmowało więcej
niż
~80 taktów zegara. (Musi się dać, no chyba że jest tam wymagany spory
kawałek kodu który ciężko przenieść gdzie indziej).
Tam faktycznie jest kawałek kodu który trudno przenieść. Nie jest jednak aż
tak duży, sześć warunków, kilka przypisań, kilka operacji logicznych. Jeżeli
kompilator nie dodaje zbyt dużo ekstra kodu to nie zajmuje to 80 cykli.

2. Przerwania od RS'a obsługiwać poprzez INTERRUPT (chyba najłatwiej to
zrobić, ale możesz chcieć aby część tego przerwania wykonywała się atomowo
i wtedy musisz sam wyłączać i włączać przerwania i zadbać o to żeby czas
wyłączenia przerwań nie był dłuższy od okresu TIMER0).

Probowalem wlasnie realizowac ten pomysl i zamienilem zgodnie z sugestia
SIGNAL na INTERRUPT i procesor utracil mozliwosc komunikacji ?! Nawet jezeli
na wejsciu do zdefiniowanego przes INTERRUPT blokuje przerwania a
odblokowywuje przy wyjsciu. Po zamianie na SIGNAL wraca wszystko do normy.

Jakieś sugestie co można jeszcze zrobic?

Pozdrawiam
Rafit




Poprzedni Następny
Wiadomość
Spis treści
From: Andrzej =?ISO-8859-2?Q?Zy=B6k?= <azysk_at_nospam_st.com.pl>
Subject: Re: AVRGCC - TIMER0
Date: Tue, 21 Aug 2001 12:30:52 +0200


Rafit wrote:

Myślę, że w twoim przupadku obsługa przerwania od
RS'a trwa dłużej niż okres TIMER0 i gubisz przerwania OVERFLOW0,
dodatkowo licznik po przepełnieniu zostaje załadowany 0x00 a nie 0xAC
przez co następne przerwanie przychodzi po ok. trzykrotnie dłuższym
czasie. Moim skromnym zdaniem masz dwie możliwości:
1. Popracować nad obsługą przerwania od RS'a, żeby nie zajmowało więcej
niż
~80 taktów zegara. (Musi się dać, no chyba że jest tam wymagany spory
kawałek kodu który ciężko przenieść gdzie indziej).
Tam faktycznie jest kawałek kodu który trudno przenieść. Nie jest jednak
aż tak duży, sześć warunków, kilka przypisań, kilka operacji logicznych.
Jeżeli kompilator nie dodaje zbyt dużo ekstra kodu to nie zajmuje to 80
cykli.
To zależy na jakich typach danych operujesz, należy unikać typów
całkowitych ze znakiem, nie stosować typów dłuższych niż 8bitów o ile nie
jest to konieczne, przestać lubić zmienne globalne a zacząć lubić lokalne i
wskaźniki, zapomnieć o mnożeniu, dzieleniu itp, typach
zmiennoprzecinkowych. Na stronie Atmela jest nota aplikacyjna o nazwie
"Efficient programming in C" czy jakoś tak, pokazuje jak wycisnąć soki z
AVR'a, wprawdzie przykłady są pod kompilator IAR, ale różnice są
kosmetyczne.
2. Przerwania od RS'a obsługiwać poprzez INTERRUPT (chyba najłatwiej to
zrobić, ale możesz chcieć aby część tego przerwania wykonywała się
atomowo i wtedy musisz sam wyłączać i włączać przerwania i zadbać o to
żeby czas wyłączenia przerwań nie był dłuższy od okresu TIMER0).

Probowalem wlasnie realizowac ten pomysl i zamienilem zgodnie z sugestia
SIGNAL na INTERRUPT i procesor utracil mozliwosc komunikacji ?! Nawet
jezeli na wejsciu do zdefiniowanego przes INTERRUPT blokuje przerwania a
odblokowywuje przy wyjsciu. Po zamianie na SIGNAL wraca wszystko do normy.

Nie wiem dlaczego tak jest.
Jakieś sugestie co można jeszcze zrobic?
Zdefiniwać dwie kolejki FIFO: jedną dla znaków odbieranych, drugą dla
wysyłanych. Procedury obsługi przerwań z RS'a zajmowałyby się tylko
odbieraniem bądź wysyłaniem danych z FIFO, zaś ciężar analizy danych i
sterowania ich przepływem spadłby na główną pętlę programu. To powinno
znacznie zredukować czas obsługi przerwania. Coś w tym rodzaju działa mi z
full-duplexem na 115200 bps i zegarem 3.68MHz.

Pozdrawiam
--
Andrzej Zyśk Tel: +48 22 668 75 50
Security Technologies Sp. z o.o. Fax: +48 22 668 99 67
ul. Joteyki 20 Email: azysk_at_nospam_st.com.pl
02-317 Warszawa, Poland

Poprzedni Następny
Wiadomość
Spis treści
From: "Andrzej" <andk_at_nospam_zeus.polsl.gliwice.pl>
Subject: Re: AVRGCC - TIMER0
Date: Mon, 20 Aug 2001 23:01:35 +0200


Ludzie, ludzie !!! Zeby programować w C mikrokontrolery to trzeba trochę
znać ich wewnętrzną budowę. Stadardowo mikrokontroler AVR gdy wchodzi w
procedurę obsługi przerwania to automatycznie ustawia globalną flagę
blokującą inne przerwania. Jężeli chcecie obsługiwać inne przerwania w
trakcie wykonywania innego to w procedurze obsługi przerwania trzeba zadbać
o zerowanie tej flagi i o ewentualne zblokowanie źródła bieżąco wykonywanego
przerwania. A propos polec kompilator IAR zamiast GCC.

Pozdrawiam
Andrzej



Poprzedni Następny
Wiadomość
Spis treści
From: Andrzej =?ISO-8859-2?Q?Zy=B6k?= <azysk_at_nospam_st.com.pl>
Subject: Re: AVRGCC - TIMER0
Date: Wed, 22 Aug 2001 11:59:58 +0200


Andrzej wrote:

Ludzie, ludzie !!! Zeby programować w C mikrokontrolery to trzeba trochę
znać ich wewnętrzną budowę. Stadardowo mikrokontroler AVR gdy wchodzi w
procedurę obsługi przerwania to automatycznie ustawia globalną flagę
blokującą inne przerwania. Jężeli chcecie obsługiwać inne przerwania w
trakcie wykonywania innego to w procedurze obsługi przerwania trzeba
zadbać o zerowanie tej flagi i o ewentualne zblokowanie źródła bieżąco
wykonywanego przerwania. A propos polec kompilator IAR zamiast GCC.
IAR ma wielką wadę: trzeba za niego zapłacić ciężką kasę. Są też inne
rozwiązania niż GCC, wystarczy przeszukać trochę poprzednie wątki. Dla mnie
GCC jest o tyle dobry, że jest za darmo, jest pod linuxa, są źródła (to
akurat nie jest mi teraz potrzebne, ale może kiedyś być) i jest ciągle
rozwijany.

Pozdrawiam
--
Andrzej Zyśk Tel: +48 22 668 75 50
Security Technologies Sp. z o.o. Fax: +48 22 668 99 67
ul. Joteyki 20 Email: azysk_at_nospam_st.com.pl
02-317 Warszawa, Poland