eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaAVR - przerwania zewnętrzne, usypianie i budzenie
Ilość wypowiedzi w tym wątku: 25

  • 21. Data: 2013-02-22 19:00:27
    Temat: Re: AVR - przerwania zewnętrzne, usypianie i budzenie
    Od: Atlantis <m...@w...pl>

    W dniu 2013-02-22 00:26, Michoo pisze:

    > Przykład 1 - Czytasz dane z GPS po UART i zapisujesz na kartę.
    > - Procesor po starcie resetuje zewnętrzne urządzenia i przeprowadza
    > inicjalizację.

    No cóż... Mi chodziło o sytuację odwrotną - UNIKNIĘCIE resetowania
    zewnętrznego urządzenia (moduł) GSM i napisanie kodu w taki sposób, żeby
    ATmega po ewentualnym restarcie sama zorientowała się gdzie stoi.

    Załóżmy, że sam uC (ale nie modem) wiesza się w trakcie aktywnej rozmowy
    telefonicznej. Watchdog go restartuje, ale moduł GSM działa dalej (co
    najwyżej chwilowo tracąc komunikację z Atmegą).

    Procedura inicjacji modułu jest tak napisana, żeby radzić sobie z
    sytuacją, kiedy natknie się na już zainicjowany moduł - wtedy zostawia
    go w spokoju spokoju.

    W pętli znajduje się instrukcja sprawdzająca podniesienie słuchawki.
    Jeśli słuchawka zostanie podniesiona (lub program po włączeniu natknie
    się na podniesioną słuchawkę) wykonuje się seria instrukcji (m.in.
    wybudzenie modułu). Potem odwołuję się do funkcji, która wysyła
    "AT+CPAS\r\n" na potem czeka na ciąg +:CPAS: 00". Gdy ciąg się pojawi
    funkcja oczekuje jeszcze na ostatnią cyferkę i zwraca wartość
    odpowiadającą znakowi ASCII.

    Dalej jest instrukcja switch(), która w zależności od zwróconej wartości
    podejmuje odpowiednie działanie:
    - Jeśli moduł zgłosił gotowość - uruchomienie procedury wybierania numeru.
    - Jeśli moduł zgłosił połączenie przychodzące - odebranie odebranie go i
    uruchomienie procedury obsługującej rozmowę
    - Jeśli moduł zgłosił już aktywne połączenie (poprzednia sesja,
    przerwana przez reset) - uruchomienie procedury obsługującej połączenie.


  • 22. Data: 2013-02-22 21:00:12
    Temat: Re: AVR - przerwania zewnętrzne, usypianie i budzenie
    Od: Michoo <m...@v...pl>

    On 22.02.2013 19:00, Atlantis wrote:
    > W dniu 2013-02-22 00:26, Michoo pisze:
    >
    >> Przykład 1 - Czytasz dane z GPS po UART i zapisujesz na kartę.
    >> - Procesor po starcie resetuje zewnętrzne urządzenia i przeprowadza
    >> inicjalizację.
    >
    > No cóż... Mi chodziło o sytuację odwrotną - UNIKNIĘCIE resetowania
    > zewnętrznego urządzenia (moduł) GSM i napisanie kodu w taki sposób, żeby
    > ATmega po ewentualnym restarcie sama zorientowała się gdzie stoi.

    Ale czemu atmega miała się zresetować?

    >
    > Załóżmy, że sam uC (ale nie modem) wiesza się w trakcie aktywnej rozmowy
    > telefonicznej.

    Oznacza to:
    a) błąd w programie. należy go wyeliminować
    b) błąd w module albo zakłócenie w komunikacji. stan systemu jest
    prawdopodobnie niespójny. Twardy reset jest w takiej sytuacji
    najbezpieczniejszym wyjściem.


    > Watchdog go restartuje, ale moduł GSM działa dalej (co
    > najwyżej chwilowo tracąc komunikację z Atmegą).

    >
    > Procedura inicjacji modułu jest tak napisana, żeby radzić sobie z
    > sytuacją, kiedy natknie się na już zainicjowany moduł - wtedy zostawia
    > go w spokoju spokoju.

    Ja bym w takim wypadku zrobił sprawdził na ile stan wygląda "dobrze" i w
    rzie czego zrobił power-cycle. Skoro był reboot to znaczy, ze coś się
    poważnie spieprzyło. Nic ci nie gwarantuje, że moduł będzie po czymś
    takim pracował poprawnie. (Któreś telefony tak miały, że po padzie
    komunikacji robiły soft reset podsystemu GSM, w efekcie wszystko
    wyglądało ok (zasięg, sieć, etc), tylko moduł nie sygnalizował
    przychodzących połączeń.)

    >
    > W pętli znajduje się instrukcja sprawdzająca podniesienie słuchawki.
    > Jeśli słuchawka zostanie podniesiona (lub program po włączeniu natknie
    > się na podniesioną słuchawkę) wykonuje się seria instrukcji (m.in.
    > wybudzenie modułu). Potem odwołuję się do funkcji, która wysyła
    > "AT+CPAS\r\n" na potem czeka na ciąg +:CPAS: 00". Gdy ciąg się pojawi
    > funkcja oczekuje jeszcze na ostatnią cyferkę i zwraca wartość
    > odpowiadającą znakowi ASCII.
    foo:
    Czekasz na
    +:CPAS: 00
    a dostajesz
    +:CPAS: 01 (albo jeszcze lepiej 05, bo wybudzenie się nie powiodło)
    watchdag robi reset, goto foo.


    >
    > Dalej jest instrukcja switch(), która w zależności od zwróconej wartości
    > podejmuje odpowiednie działanie:
    > - Jeśli moduł zgłosił gotowość - uruchomienie procedury wybierania numeru.
    > - Jeśli moduł zgłosił połączenie przychodzące - odebranie odebranie go i
    > uruchomienie procedury obsługującej rozmowę
    > - Jeśli moduł zgłosił już aktywne połączenie (poprzednia sesja,
    > przerwana przez reset) - uruchomienie procedury obsługującej połączenie.

    A jeżeli zgłosił 1,2,5?

    --
    Pozdrawiam
    Michoo


  • 23. Data: 2013-02-23 08:59:43
    Temat: Re: AVR - przerwania zewnętrzne, usypianie i budzenie
    Od: Atlantis <m...@w...pl>

    W dniu 2013-02-22 21:00, Michoo pisze:

    > Ale czemu atmega miała się zresetować?

    W powodu watchdoga?
    Może inaczej. Czy przypadkiem mikrokontrolerowi nie zdarza się czasem
    (choćby niezmiernie rzadko) zawiesić się, tak po prostu zaprzestać
    pracy? Jeśli tak, to chodzi mi właśnie o ochronę przed taką sytuacją.


    Bo rozumiem, że czasem jakiś niuans w samym kodzie (np. pętla, która w
    określonych okolicznościach zacznie się wykonywać w nieskończoność) może
    spowodować zawias, ale to na razie pomijam.


    > Oznacza to:
    > a) błąd w programie. należy go wyeliminować
    > b) błąd w module albo zakłócenie w komunikacji. stan systemu jest
    > prawdopodobnie niespójny. Twardy reset jest w takiej sytuacji
    > najbezpieczniejszym wyjściem.

    Dla jasności: nigdy takiej sytuacji nie miałem. Nie zdarzyło mi się,
    żeby moduł albo uC się zawiesił. Wszystkie przypadki, kiedy coś działało
    nieprawidłowo okazywały się efektem jakiegoś drobnego błędu w programie.

    A co do twardego resetu, to modem D15 nie ma nawet odpowiedniego pinu.
    Jedynym rozwiązaniem z tego co widzę jest odcięcie zasilania, a to mogę
    zrobić ręcznie.


    > Ja bym w takim wypadku zrobił sprawdził na ile stan wygląda "dobrze" i w
    > rzie czego zrobił power-cycle. Skoro był reboot to znaczy, ze coś się
    > poważnie spieprzyło. Nic ci nie gwarantuje, że moduł będzie po czymś
    > takim pracował poprawnie.

    Proces inicjacji modułu GSM oczywiście przeprowadza elementarną
    diagnostykę, nawet jeśli zastanie go w stanie włączonym. Jeśli coś jest
    nie tak, zgłasza kod błędu migając diodą. Trochę "diagnostyki" jest też
    po podniesieniu słuchawki - pytanie o status, sprawdzenie poziomu
    sygnału itp. Słowem raczej można się połapać, gdy coś nie działa.


    > foo:
    > Czekasz na
    > +:CPAS: 00
    > a dostajesz
    > +:CPAS: 01 (albo jeszcze lepiej 05, bo wybudzenie się nie powiodło)
    > watchdag robi reset, goto foo.

    Tak swoją drogą co zwraca "+CPAS: 001" gdy modem jest niedostępny albo
    "+CPAS: 005" gdy znajduje się w stanie uśpienia, skoro przecież jest
    niedostępny albo znajduje się w stanie uśpienia? ;)
    Tutaj chyba chodzi o jakieś bardzo specyficzne sytuacje?
    W funkcji sprawdzającej o stan modemu umieściłem po prostu licznik.
    Funkcja zwraca odpowiednią wartość, gdy program nie otrzyma odpowiedzi
    przed upływem 500 ms. Jeszcze tego nie zagospodarowałem, ale myślałem o
    zwykłym komunikacie błędu.


    > A jeżeli zgłosił 1,2,5?

    Jeszcze niezagospodarowane, ale to kwestia dodania kolejnego "case"
    wewnątrz instrukcji switch(). Jak już mówiłem funkcja odpowiedzialna za
    obsługę CPAS czeka po prostu aż przyjdzie stała część komunikatu (+CPAS:
    00) a potem czeka na pojawienie się ostatniej cyferki, pobiera ją,
    konwertuje z ASCII na liczbę i zwraca programowi.


  • 24. Data: 2013-02-23 12:54:08
    Temat: Re: AVR - przerwania zewnętrzne, usypianie i budzenie
    Od: Michoo <m...@v...pl>

    On 23.02.2013 08:59, Atlantis wrote:
    > W dniu 2013-02-22 21:00, Michoo pisze:
    >
    >> Ale czemu atmega miała się zresetować?
    >
    > W powodu watchdoga?

    To jest skutek równoważny z - "dlaczego watchdog zadziałał" - bo coś go
    nie zresetowało, ale dlaczego?

    > Może inaczej. Czy przypadkiem mikrokontrolerowi nie zdarza się czasem
    > (choćby niezmiernie rzadko) zawiesić się, tak po prostu zaprzestać
    > pracy?

    Po odliczeniu błędów zasilania - nie. [1] To by oznaczało, że nie można
    go bezpiecznie używać.


    [1] W teorii możesz mieć przypadek w którym jakiś błąd jest zależny od
    czasu i temperatury, ale prawdopodobieństwo jest minimalne. W praktyce
    zdarza się czasami jakiś błąd w przerwaniach (na krzemie) i w określonym
    przypadku procesor się nie budzi, ale to będzie raczej tylko missed
    interrupt a nie zwis, w bardzo specyficznych warunkach (no i trafi do
    erraty). Może też oberwać cząstką wysokoenergetyczną, ale to raczej na
    orbicie.

    > Jeśli tak, to chodzi mi właśnie o ochronę przed taką sytuacją.

    Taka sytuacja byłaby nielogiczna - na co komu urządzenie, które się
    losowo zawiesza?

    Załóżmy, że masz szansę na zadziałanie w cyklu 6? - to by oznaczało, że
    procesor lecący na 20MHz zawiesza się średnio co 25 sekund...

    > Bo rozumiem, że czasem jakiś niuans w samym kodzie (np. pętla, która w
    > określonych okolicznościach zacznie się wykonywać w nieskończoność) może
    > spowodować zawias, ale to na razie pomijam.

    Błędnie - to jest jedyne z czym się będziesz musiał mierzyć w typowych
    przypadkach.

    >
    >
    >> Oznacza to:
    >> a) błąd w programie. należy go wyeliminować
    >> b) błąd w module albo zakłócenie w komunikacji. stan systemu jest
    >> prawdopodobnie niespójny. Twardy reset jest w takiej sytuacji
    >> najbezpieczniejszym wyjściem.
    >
    > Dla jasności: nigdy takiej sytuacji nie miałem. Nie zdarzyło mi się,
    > żeby moduł albo uC się zawiesił. Wszystkie przypadki, kiedy coś działało
    > nieprawidłowo okazywały się efektem jakiegoś drobnego błędu w programie.

    Oczywiście. Weź tylko pod uwagę, że moduł to też jakiś uC z jakimś
    oprogramowaniem.

    >
    > A co do twardego resetu, to modem D15 nie ma nawet odpowiedniego pinu.

    PMOS na zasilaniu.

    > Jedynym rozwiązaniem z tego co widzę jest odcięcie zasilania, a to mogę
    > zrobić ręcznie.

    W sprzęcie bateryjnym trochę z tym gorzej - dlatego robi się obwód
    resetu na długim przytrzymaniu włącznika.


    >
    >
    >> Ja bym w takim wypadku zrobił sprawdził na ile stan wygląda "dobrze" i w
    >> rzie czego zrobił power-cycle. Skoro był reboot to znaczy, ze coś się
    >> poważnie spieprzyło. Nic ci nie gwarantuje, że moduł będzie po czymś
    >> takim pracował poprawnie.
    >
    > Proces inicjacji modułu GSM oczywiście przeprowadza elementarną
    > diagnostykę, nawet jeśli zastanie go w stanie włączonym.

    A co robi jeżeli uC zwisł w trakcie komunikacji? (Wysłał pół polecenia,
    przyszło przerwanie, gdzieś nie było volatile i resetuje się w momencie
    gdzie moduł dostał jakieś śmieci?)

    > Jeśli coś jest
    > nie tak, zgłasza kod błędu migając diodą.

    Jest to jedno z podejść "skontaktuj się z serwisem". Drugim jest
    "spróbujemy się zrestartować".

    >
    > Tak swoją drogą co zwraca "+CPAS: 001" gdy modem jest niedostępny albo
    > "+CPAS: 005" gdy znajduje się w stanie uśpienia, skoro przecież jest
    > niedostępny albo znajduje się w stanie uśpienia? ;)

    Moduł. Moduł składa się z:
    - radia
    - modemu
    - uC, który nim steruje
    (czasami w jednym scalaku)

    A spora część współczesnych SoC ma odrębne bloki funkcjonalne z
    niezależnym wejściem zegara i asynchroniczne moduły komunikacyjne po to,
    żeby cała reszta mogła spać.

    >
    >> A jeżeli zgłosił 1,2,5?
    >
    > Jeszcze niezagospodarowane, ale to kwestia dodania kolejnego "case"
    > wewnątrz instrukcji switch().

    No tak, ale właśnie w ten sposób - przez zostawienie nieobsłużonych
    przypadków - tworzy się zawieszające się urządzenia. Dobra praktyka -
    zawsze dajesz default a jak nie wiesz co tam wstawić to wstawiasz
    logowanie błędu + reset.

    > Jak już mówiłem funkcja odpowiedzialna za
    > obsługę CPAS czeka po prostu aż przyjdzie stała część komunikatu (+CPAS:
    > 00) a potem czeka na pojawienie się ostatniej cyferki, pobiera ją,
    > konwertuje z ASCII na liczbę i zwraca programowi.

    A co w momencie gdy przyjdzie zakłócenie i zamiast cyferki przyjdzie coś
    niezrozumiałego?

    --
    Pozdrawiam
    Michoo


  • 25. Data: 2013-02-23 17:50:41
    Temat: Re: AVR - przerwania zewnętrzne, usypianie i budzenie
    Od: Atlantis <m...@w...pl>

    W dniu 2013-02-23 12:54, Michoo pisze:

    > Po odliczeniu błędów zasilania - nie. [1] To by oznaczało, że nie można
    > go bezpiecznie używać.
    > (...)
    > Załóżmy, że masz szansę na zadziałanie w cyklu 6? - to by oznaczało, że
    > procesor lecący na 20MHz zawiesza się średnio co 25 sekund...

    Chodziło mi raczej o znacznie, znacznie rzadsze przypadki. Kiedy uC
    pracuje non stop. Założyłem, że w pewnym momencie może wystąpić jakaś
    "sprzętowa" przyczyna zawieszenia i w związku z tym stosowanie watchdoga
    ma sens.


    > Błędnie - to jest jedyne z czym się będziesz musiał mierzyć w typowych
    > przypadkach.

    Rozumiałem przez to "pomijam w tych rozważaniach" a nie "pomijam w całym
    projekcie udając, że zagadnienie nie istnieje". ;)

    > W sprzęcie bateryjnym trochę z tym gorzej - dlatego robi się obwód
    > resetu na długim przytrzymaniu włącznika.

    Sprzętowy włącznik też przecież można zainstalować. ;)


    > A spora część współczesnych SoC ma odrębne bloki funkcjonalne z
    > niezależnym wejściem zegara i asynchroniczne moduły komunikacyjne po to,
    > żeby cała reszta mogła spać.

    Z tego co wyczytałem w dokumentacji, to w D15 działa to trochę inaczej.
    Żeby wybudzić moduł ze stanu uśpienia trzeba wysłać jakikolwiek, krótki
    ciąg znaków i odczekać 30ms. Wysłana wiadomość przepada. Dopiero potem
    można nawiązać właściwą komunikację.


    > No tak, ale właśnie w ten sposób - przez zostawienie nieobsłużonych
    > przypadków - tworzy się zawieszające się urządzenia. Dobra praktyka -
    > zawsze dajesz default a jak nie wiesz co tam wstawić to wstawiasz
    > logowanie błędu + reset.

    Nieobsłużony jest w tej chwili, bo jak na razie nie mam nawet wykonanych
    połączeń, które umożliwiłyby mi przeprowadzenie resetu modułu z poziomu
    mikrosterownika.


    > A co w momencie gdy przyjdzie zakłócenie i zamiast cyferki przyjdzie coś
    > niezrozumiałego?

    Przedstawione rozwiązanie było tymczasowym. Teraz wyciągam liczbę za
    pomocą sscanf(). Przy czym rzecz jasna przed zakłóceniem w komunikacji
    przez USART mnie to nie obroni. Jak będzie miało dojść do przekłamania,
    to do niego dojdzie. Jeśli zastosuję twoje rozwiązanie - całe urządzenie
    się wtedy zrestartuje.
    Jeśli zrobię to po mojemu - dioda zamiga informując mnie, że coś jest
    nie tak. Odłożę słuchawkę i spróbuję podnieść ją ponownie.

    Jak widać każda filozofia ma swoje złe i dobre strony. ;)

strony : 1 . 2 . [ 3 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: