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