W dniu 2013-02-22 00:26, Michoo pisze:
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.