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][c] - nieprawidłowe wyświetlanie zmiennej

siwy2411 27 Sty 2013 00:49 2259 8
REKLAMA
  • #1 11846639
    siwy2411
    Poziom 11  
    Witam.

    Buduję zegar słowowy (word clock). Funkcję wyświetlającą daną godzinę mam już napisaną i działa prawidłowo (przetestowana dla każdej godziny wpisanej ręcznie), funkcje obsługi zew. RTC (PCF8563) też mam i działają. Zabrałem się za zbieranie tego do kupy i mam następujący kod (wklejam tylko problematyczny kawałek):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    zmienne time_minutes i time_hour (zadeklarowane oczywiście jako volatille) trzymają aktualny czas, flaga refresh oznacza że od ostatniego sprawdzenia minęło 5 sek (flaga ustawiana na przerwaniu timera), funkcja LED_send powoduje wysłanie godziny i minuty na wyświetlacz
    powyższy kawałek kodu powoduje nieprawidłowe wyświetlenie godziny (wyświetlacz zachowuje się tak, jakby zwracało to ciąg jedynek)
    bezpośrednie wywołanie tej funkcji jako
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    (przed powyższym kawałkiem kodu) działa prawidłowo
    także prawidłowo wyświetla się godzina w przypadku kodu
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    nie mam już pomysłu co jest nie tak. błąd jest najprawdopodobniej głupi, ale nie widzę go...
  • REKLAMA
  • #2 11847044
    BlueDraco
    Specjalista - Mikrokontrolery
    Zgaduję, że błąd jest w BCD2Dec. Sama nazwa tej procedury już sugeruje błąd, ale może się mylę - w końcu jej nie pokazałeś. Ni epokazałeś też LCD_Send,a podobno błąd jest w wyświetlaniu. Bez deklaracji tych procedur trudno coś stwierdzić.

    Wątpię też, czy istnieje potrzeba deklarowania zmiennych time_xxx jako volatile.

    Co to jest ten "zegar słowowy"?
  • REKLAMA
  • #3 11847412
    siwy2411
    Poziom 11  
    to od końca:
    zegar słowowy - [atmega8][c] - nieprawidłowe wyświetlanie zmiennej
    zarówno funkcja BCD2Dec (dlaczego jej nazwa sugeruje błąd?) jak i LED_send działają prawidłowo, ponieważ wywołanie
    LED_send(BCD2Dec(RTC_recive(RTChours)&0x3F),BCD2Dec(RTC_recive(RTCminutes)&0x7F));
    powoduje wyświetlenie prawidłowej godziny. problemy zaczynają się, gdy w if'ie zmieniam wartość time_minutes lub time_hour i potem chcę je wyświetlić.
    zmienne zadeklarowane jako volatile trochę na wszelki wypadek, bo nie bardzo jeszcze czuję kiedy jest to niezbędne, a parę razy się już na tym przejechałem - poza tym są zmiennymi globalnymi, których wartość zmieniam w przerwaniu, więc chyba jednak należy im się "volatile" - poprawcie mnie jeżeli się mylę?
    żeby rozwiać wątpliwości:
    BCD2Dec:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

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

    LED_send wygląda tak a nie inaczej, ponieważ godzinę wyświetlam na dwóch 16bitowych rejestrach przesuwnych połączonych kaskadowo. LED_data_prepare zwraca 32bitowy ciąg binarny na podstawie podanej godziny, zawierający informację, które słowa należy "zapalić".
    na wszelki wypadek jeszcze LED_data_separate:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    jak widać służy do wybrania 8bitowego podciągu, który w danym momencie należy wyświetlić
  • REKLAMA
  • #4 11847687
    BlueDraco
    Specjalista - Mikrokontrolery
    BCD2dec zamienia postać BCD na binarną, a co sugeruje jej nazwa, to chyba wiesz.

    Na moje oko problem leży albo w LED_data_prepare, albo w SPI_send.

    LED_data_separate jest całkowicie zbędna, wystarczy:
    SPI_send(data);
    SPI_send(data >> 8);
    SPI_send(data >> 16);
    SPI_send(data >> 24);

    A w ogle masz za dużo procedur w kodzie. Czas wykonania ciała procedury powinien być znacznie większy od czasu potrzebnego na wywołanie i powrót, a u Ciebie jest odwrotnie.
  • #5 11847730
    siwy2411
    Poziom 11  
    BlueDraco napisał:
    BCD2dec zamienia postać BCD na binarną, a co sugeruje jej nazwa, to chyba wiesz.

    dlaczego na binarną? szczerze mówiąc tą funkcję zaczerpnąłem gdzieś z sieci, ale działa tak jak tego oczekuję - dlaczego Twoim zdaniem zwraca wartość w postaci binarnej?
    BlueDraco napisał:
    Na moje oko problem leży albo w LED_data_prepare, albo w SPI_send.

    Problem nie może tam leżeć, ponieważ napisałem już dwukrotnie że wywołanie tych funkcji z podaniem godziny do wyświetlenia jako cyfry a nie zmiennej działa prawidłowo. Cyrk zaczyna się gdy używamy tam zmiennej.
  • #6 11847789
    BlueDraco
    Specjalista - Mikrokontrolery
    Na binarną, bo żaden współczesny procesor nie operuje na danych dziesiętnych.

    Skoro, jak twierdzisz, problemu nie ma, to zamknij wątek i nie zawracaj głowy.

    Prawdopodobnie wykładasz się na konwersji typów, ale nie znając programu błędu nikt Ci nie pokaże.
  • REKLAMA
  • #7 11847828
    siwy2411
    Poziom 11  
    BlueDraco napisał:
    Na binarną, bo żaden współczesny procesor nie operuje na danych dziesiętnych.

    a co ma piernik do wiatraka? jeżeli w kodzie programu używam zmiennej trzymającej dane w systemie dziesiętnym, to nie interesuje mnie fakt, że procesor żeby coś na nich zrobić je sobie konwertuje na binarny, bo wynik konwertuje mi z powrotem na dziesiętny.
    BlueDraco napisał:
    Skoro, jak twierdzisz, problemu nie ma, to zamknij wątek i nie zawracaj głowy.

    piszę wyraźnie (chyba) że błąd jest, ale na pewno nie w tym miejscu w którym Ty go sugerujesz - więc może nie atakuj mnie bez powodu?
  • #8 11847906
    BlueDraco
    Specjalista - Mikrokontrolery
    Nie ma w Twoim programie żadnej zmiennej, która trzymałby dane w systemie dziesiętnym, a procesor nic nie konwertuje na system binarny z dziesiętnego. Żeby mógł konwertować, musiałby znać jakiś system liczbowy inny niż binarny, a nie zna takiego.

    "Najbliżej" systemu dziesiętnego są dane odczytywane z zegara, bo są one zapisane w kodzie BCD, czyli "dziesiętnym kodowanym binarnie". Wszystkie pozostałe dane, na których operujesz, są czysto binarne.

    Skasowałem niepotrzebne wypowiedzi.
    Dar.El
  • #9 11848504
    siwy2411
    Poziom 11  
    W międzyczasie znalazłem źródło problemu i go rozwiązałem - tak jak od początku mówiłem błąd był we fragmencie kodu wklejonym jako pierwszym - po wyświetleniu aktualnej godziny nie kasowałem flagi refresh, co powodowało zapętlenie programu.

    Skasowałem niepotrzebne wypowiedzi.
    Dar.El
REKLAMA