Przerwanie przerwania AVR atmega8
Patrzysz na archiwalną wersję tematu "Przerwanie przerwania AVR atmega8" z forum pl.misc.elektronika
bart - 21 Maj 2008, 08:03
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.
Konop - 21 Maj 2008, 09:24
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.
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 ;)...
T.M.F. - 21 Maj 2008, 09:25
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.
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.
Pawel - 21 Maj 2008, 10:46
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.
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ł
entroper - 21 Maj 2008, 11:46
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
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.
Adam Dybkowski - 21 Maj 2008, 15:48
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 :).
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.
bart - 21 Maj 2008, 16:20
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 :).
| 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.
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.
-- Inteligentny dom - http://idom.wizzard.one.pl Teraz takze forum dyskusyjne Zobacz, wyslij uwagi, dolacz do projektu.
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Q - 21 Maj 2008, 16:37
Czy da sie zrobic wlasnie cos takiego jak w czasie obslugi jednego przerwania przyjąć kolejne?
troche ot: mnie uczyli, ze obsluga przerwania ma byc jak najkrotsza, tzn. ma sie zakonczyc jak najszybciej sie da :)
Adam Dybkowski - 21 Maj 2008, 16:44
mnie uczyli, ze obsluga przerwania ma byc jak najkrotsza, tzn. ma sie zakonczyc jak najszybciej sie da :)
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.
T.M.F. - 21 Maj 2008, 21:06
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 :).
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.
bpoz...@amu.edu.pl - 22 Maj 2008, 06:03
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.
T.M.F. - 22 Maj 2008, 09:41
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.
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.
Q - 23 Maj 2008, 05:51
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.
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
entroper - 26 Maj 2008, 12:53
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.
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.
AVR-GCC Jak zablokować używanie przez kompilator rejestru z zakresu r2 - r14
avr-gcc - co odpowiada za adres pierwszej zmiennej lokalnej ?
avr-gcc i operacje na strukturach określinych przez wskaźniki
Zewnętrzna pamięć RAM i jej obsługa w AVR-GCC z avrstudio
wanilcia nareszcie w wyczekiwanym domu 150
jastrzab samica wyglad
remont pokoju mlodego chlopaka
6677 cena
ebony eyes
piramida w gizie
nieruchomosci powiat warszawa zachodnia
14967 madrid
chrysler piti cruzer
Spis wypowiedzi z grup dyskusyjnych || Strona Główna
|
|