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

Timer2 ISR nie wyświetla godziny przy zegarze 1MHz i prescalerze 1024

04 Gru 2014 09:27 1053 13
REKLAMA
  • #1 14190574
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #2 14190628
    BlueDraco
    Specjalista - Mikrokontrolery
    A w jaki niby sposób ten kod miałby cokolwiek wyświetlać?
  • REKLAMA
  • #3 14190631
    Konto nie istnieje
    Konto nie istnieje  
  • #4 14190655
    excray
    Poziom 41  
    Pokaż jak zdefiniowałeś zmienne. Pokaż więcej kodu. Napisz co to za procesor. Dlaczego katujesz w tak dziwny sposób timer, słyszałeś o trybie CTC? Wywoływanie funkcji zapewne długo trwających w przerwaniu to porażka.
  • #5 14190670
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #6 14190701
    tmf
    VIP Zasłużony dla elektroda
    Może są inne błędy, ale:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    raczej nie wróży nic dobrego. t będzie wskazywało na komórkę pamięci o adresie 0 - rejestr R0 mikrokontrolera. Jeśli używasz wskaźników to musisz sobie przydzielić pamięć na strukturę na którą wskazują.
  • #7 14190739
    BlueDraco
    Specjalista - Mikrokontrolery
    Użycie dwóch timerów do pobierania i wyświetlania czasu też nic dobrego nie wróży, podobnie jak deklarowanie stałych jako zmiennych i nadużywanie słowa volatile, świadczące o tym, eż programista nie wie, co robi. ;)

    Ale za to kodu nadal nie zobaczyliśmy, więc możemy sobie powróżyć...
  • #8 14190870
    Konto nie istnieje
    Konto nie istnieje  
  • #9 14190917
    tmf
    VIP Zasłużony dla elektroda
    Jeżeli funkcja:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    nie rezerwuje pamięci na stercie to powyższe działanie, w świetle tego, że t jest wskaźnikiem jest zupełnie błędne i daje nieprzewidziane skutki.
    Wszelkie inne odwołania do t w kodzie są błędne dopóki t nie będzie wskazywać na poprawny obszar pamięci.
    Podobnie operacja:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ma niezdefiniowany skutej, jeśli t i f są równe NULL (0). Uporządkuj najpierw pokazane poważne problemy, a potem przejdziemy do kolejnych.
  • REKLAMA
  • #10 14190994
    Konto nie istnieje
    Konto nie istnieje  
  • #11 14191255
    BlueDraco
    Specjalista - Mikrokontrolery
    Błąd jest zapewne w funkcji rtc_get_time, której nie pokazałeś .

    Jeśli oczekujesz pomocy - załącz aktualne pełne źródła. Problem nie leży w funkcji, którą załączasz z uporem godnym lepszej sprawy.
    Prawdopodobnie masz kilka różnych zmiennych hour, min i sec o takich samych nazwach i różnych zasięgach - tak było w starszej wersji kodu.
  • #12 14191318
    Konto nie istnieje
    Konto nie istnieje  
  • #13 14191764
    BlueDraco
    Specjalista - Mikrokontrolery
    No to mamy trzy fragmenty kodu i nadal nic nie wiemy o ich złożeniu w jeden program. Jeśli nie chcesz, pomimo próśb, pokazać całego swojego kodu po ostatnich zmianach, to skończ narzekanie i zamknij wątek. Błąd jest prosty i głupiutki, ale nie widząc programu nie sposób go wskazać. Stawiam na zasłanianie deklaracji danych.
  • #14 14192089
    nsvinc
    Poziom 35  
    To jest gwałcenie wskaźników.

    Takie coś jak
    Kod: text
    Zaloguj się, aby zobaczyć kod

    to również jest gwałcenie wskaźników, w szczegolnosci, ze nie wiadomo gdzie jest _tm, a wyglada na to, ze masz funkcję ktora zwraca adres globalnej zmiennej. Po co? W pewnych okolicznosciach ma to sens, ale wątpię, ze te okolicznosci tutaj wystepuja...

    Kod wypadaloby podzielic na sensowne bloki bez takiego zamieszania jak tu. Tak samo szkoda miejsca na cos typu twelveHour czy am. To powinno się wyifowac przy wyswietlaniu a nie przy przetwarzaniu.
    Funkcje ktore pobierają czy konwertują dane, raczej powinny pracować na zmiennych do nich przekazanych, a nie na jakichs magicznych zmiennych globalnych. To dodatkowo umozliwia pisanie funkcji bibliotecznych ktore są reentrant (i przewaznie tez thread-safe).

    Kod: text
    Zaloguj się, aby zobaczyć kod
REKLAMA