logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega8][hd44780][rtc] - Zawieszanie się programu. Działa tylko przerwanie.

lukhol2 02 Lut 2016 17:05 1035 4
REKLAMA
  • #1 15396615
    lukhol2
    Poziom 7  
    Witam, stworzyłem na płytce stykowej układ, gdzie podłączyłem przyciski, LCD hd47780, rtc ds1307 i buzzer. Korzystam z bibliotek do wyświetlacza od "radzia", TWI od p. Mirka oraz ze znalezionej na tym forum biblioteki do RTC. Napisałem szybki program, który wyświetla godzinę w formie hh:mm:ss na ostatnich polach pierwszej linii. Dodatkowo dodałem przerwanie, którego zadaniem jest miganie diodą. Program poprawnie pokazuje godzinę, ale raz na jakiś czas (nieokreślony) zawiesza się. Godzina przestaje się odświeżać, ale dioda dalej miga. Tracę działanie całego kodu w pętli głównej ( jak np. dodam tam buzzer pod przycisk po zawieszeniu nie reaguje na przycisk ). Jaka może być tego przyczyna ? W załączeniu dołączam schemat układu (zgadza się wyświetlacz oraz rtc, przyciski podłączone są w innych miejscach).



    Kod programu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod do biblioteki RTC ds1307

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Biblioteka do wyświetlacza oczywiście edytowane porty pod mój układ pobrałem ze strony radzio.dxp.pl - Sterowanie w trybie 4-bitowym z odczytem flagi zajętości z dowolnym przypisaniem linii sterujących.

    Biblioteki do TWI pobrane ze strony p.Mirka w dziale uaktualnienia do DVD.

    [Atmega8][hd44780][rtc] - Zawieszanie się programu. Działa tylko przerwanie.
  • REKLAMA
  • #2 15397027
    tehaceole

    Poziom 28  
    Co do reszty programu to nie będę marudny bo to Twoje początki. Natomiast z pewnością zmień podejście do flagi. Flagę w przerwaniu powinieneś tylko ustawiać. Natomiast w pętli głównej sprawdzasz czy flaga jest ustawiona. Jeżeli tak to wykonujesz przypisany jej kod i ją kasujesz. W tej chwili co sekundę (zakładam, że timer skonfigurowany poprawnie) masz zmianę stanu flagi na przeciwny. Czyli Twój program przez jedną sekundę katuje 100% czasu procesora by w następnej sekundzie nie robić nic poza oczekiwaniem na przerwanie.
    Nie używałem ds1307, korzystam ze scalaków PCF. Nie potrafię powiedzieć jak ds zareaguje na taki odczyt "non stop". W praktyce nie jest to do niczego potrzebne. Wystarczy, że czas odczytasz raz na sekundę. Tu warto skorzystać z nóżki scalaka na której pojawia się impuls co sekundę i użyc jej zamiast flagi do "inicjalizacji" odczytu.

    Inna sprawa, że wszystkie obliczenia (w tym przypadku) również możesz wykonywać co ustawienie flagi. Nie musisz w kółko tego "mielić".
  • REKLAMA
  • #3 15397050
    lukhol2
    Poziom 7  
    tehaceole napisał:
    Co do reszty programu to nie będę marudny bo to Twoje początki. Natomiast z pewnością zmień podejście do flagi. Flagę w przerwaniu powinieneś tylko ustawiać. Natomiast w pętli głównej sprawdzasz czy flaga jest ustawiona. Jeżeli tak to wykonujesz przypisany jej kod i ją kasujesz. W tej chwili co sekundę (zakładam, że timer skonfigurowany poprawnie) masz zmianę stanu flagi na przeciwny. Czyli Twój program przez jedną sekundę katuje 100% czasu procesora by w następnej sekundzie nie robić nic poza oczekiwaniem na przerwanie.
    Nie używałem ds1307, korzystam ze scalaków PCF. Nie potrafię powiedzieć jak ds zareaguje na taki odczyt "non stop". W praktyce nie jest to do niczego potrzebne. Wystarczy, że czas odczytasz raz na sekundę. Tu warto skorzystać z nóżki scalaka na której pojawia się impuls co sekundę i użyc jej zamiast flagi do "inicjalizacji" odczytu.

    Inna sprawa, że wszystkie obliczenia (w tym przypadku) również możesz wykonywać co ustawienie flagi. Nie musisz w kółko tego "mielić".


    Część programu z flagą była zrobiona na szybko żeby sprawdzić czy zacina się cały procesor czy tylko to co dzieje się w while(1) w main. Nie przykładałem do tego zbytnio uwagi, ale dzięki za wskazówki. Następne flagi będę tylko ustawiał w przerwaniu. Co do problemu dalej nie wiem co jest jego przyczyną więc czekam na odpowiedzi :)

    Co do kolejnej części Twojej wypowiedzi to w programie odczyt jest na flagę więc raz na około pół sekundy odczytuję godzinę z RTC.
  • REKLAMA
  • #4 15397092
    tehaceole

    Poziom 28  
    Z moich zabaw z TWI - jeżeli masz problem z magistralą to program idzie w niebyt bo w kodzie obsługi TWI będzie czekać w pętli nieskończonej. Stawiałbym u Ciebie na jakiś problem sprzętowy (płytka stykowa - luźny jakiś przewód?). Oczywiście da się bibliotekę napisać w takisposób, aby przy utracie komunikacji na magistrali nie zawieszała całego programu. Ale w bibliotekach dostępnych w necie tego nie widziałem.
  • #5 15437354
    lukhol2
    Poziom 7  
    Zmieniłem płytkę na nową i problem ciągle występuje więc chyba nie jest to problem płytki.

    //Edit:

    Po dokładnym przeanalizowaniu całości kod zapętla się w funkcji od obsługi RTC uint8_t I2C_ReadNACK(void), ale nie wiem jak rozwiązać problem zacinania.
REKLAMA