Przerwanie przerwania AVR atmega8

May 21, 2008 13 Replies

Czy da sie zrobic wlasnie cos takiego jak w czasie obslugi jednego przerwania przyjąć kolejne?



Robie sobie taki zegarek wirujacy (Propeller display) i obsluge wyswietalania napisu mam w przerwaniu od transoptora szczelinowego INT0, a na INT1 chcialbym powiesic IR receiver TSOP1736, a do tego chcialbym jeszcze obsluzyc czujnik Temp DS18B20 i jakiegos RTC czy dobrze mysle ze uda mi sie to wszystko obslozyc jedna malutka atmega8? Program pisze w ASM czy lepiej od razu pomyslec o rozbudowie hardware'u. Pozdrawiam Bart.


bart pisze:

To wszystko zależy od tego jakiego rzędu to są czasy itp. Aby przerwać przerwanie musisz po prostu odblokować przerwania w procedurze obsługi przerwania ;)... ale wówczas KAŻDE INNE przerwanie przerwie aktualnie wykonywane przerwanie ;).. no ale nic :P.. po kolei:

- wyświetlanie obsługujesz TYLKO za pomocą przerwania INT0, czy może później są jeszcze jakieś zależności czasowe i wykorzystujesz jakiś licznik??

- jak często będą zgłaszane poszczególne przerwania i jakiego rzędu czasy są potrzebne na obsługę czujnika temperatury albo odebranie sygnału z IR??

Co do rozbudowania hardware'u - jeśli chcesz, żeby to było małe, to trzeba wszystko bardzo dokładnie przemyśleć ;)... Jeśli sterownik może być duży, to może warto dorobić jakiś układzik zewnętrzny, i początkowo go nie montować... tylko - jaki?? Umiesz programować CPLDki??

Pozdrawiam Konop

PS Swego czasu miałem problem, żeby jednocześnie obsłużyć wyświetlacz LED i czujnik temperatury 1wire ;)... ale wystarczyło użyć głowy i odpalić wszystko w odpowiedniej kolejności i poszło :)... dodatkowo, to był BASCOM (korzystałem z gotowych procedur i nie mogłem się "wstrzelić" w środek procedury z niczmy) i 1wire totalnie software'owo ;)...

Przerwanie w przerwaniu mozesz zrobic bez problemu, wystarczy, ze w procedurze obslugi przerwania odblokujesz przerwania, najlepiej wpierwszej instrukcji. Tylko wez pod uwage, ze czytajac DS1820, czy IR nie bedziesz wtedy mial zadnych gwarancji co do czasu wykonania poszczegolnych instrukcji co sie moze fatalnie odbic wszelkich petlach opozniajacych. Ale IR mozesz zrobic na UART, ktory jest w ATMega, z DS tez jakos sobie poradzisz.

Problem mo¿e byæ np: gdy w trakcie odczytywania DS18B20 przyjdzie przerwanie od transoptora INT0. Ja bym próbowa³ co¶ na kszta³t tego:

unsigned char volatile odczyt_ds;

//--------------------- czytaj_ds(){

odczyt_ds=1 //procedura odczytu ... if(odczyt_ds==0) //by³o przerwanie wynik mo¿e byæ b³êdny else //nie by³o przerwania wynik poprawny odczyt_ds = 0; } //------------------------- INT0(){ odczyt_ds=0; // obs³uga przerwania .... } //---------------------------

Pozdrawiam Pawe³

U¿ytkownik "bart" snipped-for-privacy@amu.edu.pl> napisa³ w wiadomo¶ci news: snipped-for-privacy@newsgate.onet.pl...

Do IR mo¿esz, jak s³usznie Koledzy wspomnieli, daæ UART. Transmisjê do RTC mo¿esz sobie dowolnie przerywaæ i zawieszaæ, wiêc nie ma problemu. Najwredniejszy bêdzie 1wire, bardzo wra¿liwy na czasy, transmisja nie do wstrzymania a UART ju¿ zajêty :). Masz do wyboru albo tak zorganizowaæ sobie czas, ¿eby fragmenty transmisji do DS-a mieæ nienaruszalne (fragmenty, bo o jednorazowym przes³aniu wszystkiego raczej mo¿esz zapomnieæ), albo wykrywaæ zak³ócenie tej transmisji przez przerwanie - oczywi¶cie o ile zapobiegniesz sytuacji "synchronizowania" siê przerwania z transmisj±, bo wtedy bêdziesz mia³ d³ugie okresy bez mo¿liwo¶ci przes³ania czegokolwiek.

e.

entroper pisze:

Bo 1wire trzeba zorganizować w przerwaniach (timera + ew. zewnętrzne) a nie robić na piechotę z opóźnieniami w stylu _delay_us (240) i drżeniem o każde dodatkowe przerwanie.

Nigdy niekonfigurowalem USART'a ale brzmi to bardzo interesujaco, czy sadzicie ze moznaby go skonfigurowac np do odbioru "RC5" czy tego juz za wiele? Wiem ze moge sobie tego poszukac ale to potrwa, a niemoge sie juz doczekac :) Pozdrawiam!

PS wielkie dzieki za cenne uwagi :).

troche ot: mnie uczyli, ze obsluga przerwania ma byc jak najkrotsza, tzn. ma sie zakonczyc jak najszybciej sie da :)

Q pisze:

To jest jedna strona medalu. Najlepiej w ogóle w przerwaniu tylko zaznaczyć w globalnej fladze (volatile!), że coś jest do zrobienia - a właściwą dłuższą robotę przerzucić do głównej pętli programu. Oprócz oczywiście operacji krytycznych czasowo czyli np. odczyt bajtu z UARTu czy wysłania kolejnej próbki dźwięku do C/A.

Odpowiadaj pod postem. Poszukaj not aplikacyjnych Atmela, tam jest przyklad jak zrobic RC5 na UART. Co do 1-wire to jak Adam sugerowal najlepiej odmierzac czas przerwaniami albo jakos sprytnie wykorzystac timery.

Przegladalem noty aplikacyjne jedyne co znalazlem o RC5 to AVR410 i AVR415 jedna dotyczy odbioru rc5, ale niestety nie przez USART, a druga to opis nadajnika RC5 tez nie przez USART. Pierwszą wykorzystalem i program z niej udalo sie odpalic, tylko ze zjada sporo zasobow: przerwania i timer, a co najgorsze sporo czasu. Jesli ktos ma jakiekolwiek materiualy AVR USART <-> RC5 to prosze o podpowiedź. (Google slabiutko) Obawiam sie jednak ze harakterystyka rc5, z jego Bifazowym kodowaniem bitow, chyba bedzie nie do ugryzienia przez UART czy USART, ktory jest jednak standartem transmisji szeregowej z tego co zdazylem doczytac. Pewnie jedyne co mi pozostaje to skonstruowac spec. Pilota nadajacego w USART.

Pozdrawiam i milego Weekendu! Bart.

Bo to nie chodzi o to, ze dostaniesz z UART gotowy wynik, chociaz w nowszych ATMegach z USART chyba jest to obslugiwane. Natomiast UART ma ta mila ceche, ze mozesz go wykorszystac do samplowania danych, zamiast czekac w petli w obsludze przerwania RxD odczytujesz rejestr danych i sobie je analizujesz.

dokladnie; taki np. qnx ma "tylko" 2 sposoby podczepiania sie pod irq:

- podczepiasz cala funkcje (niepolecane / zalecane gdy nie ma innego wyjscia :)

- podczepiasz pod irq "puls" (krotki message), ktory obslugujesz sobie standardowo w systemie

U¿ytkownik "Adam Dybkowski" snipped-for-privacy@45wp.pl napisa³ w wiadomo¶ci news:g11u86$ogf$ snipped-for-privacy@news.wp.pl...

Oczywi¶cie o ile ma siê to przerwanie do dyspozycji i jest ono na najwy¿szym priorytecie (jest nieprzerywalne i jest w stanie przerywaæ inne przerwania). Inaczej te¿ bêdzie dr¿enie o ka¿de dodatkowe przerwanie :)Delaye miêdzy bitami, bajtami itd to rzecz zupe³nie drugorzêdna, najwa¿niejszy jest re¿im czasowy dla pojedynczego bitu (szczególnie odbierania przez mastera, bo rozrzuty produkcyjne ze¿ar³y prawie ca³y dopuszczalny margines).

A generalnie chodzi o to, ¿e dodanie 1 wire do bardzo "zajêtego" programu mo¿e byæ bardziej k³opotliwe, ni¿ siê autorowi w±tku wydaje.

BTW, nie u¿ywam _delay_xx, bo szkoda mi czasu ;) ale tak± metod± spokojnie da siê obs³u¿yæ 1-wire, o ile oczywi¶cie ma siê kontrolê nad programem.

e.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required