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 - błędne wyświetlanie wartości TCNT0 na LCD po konwersji itoa

marcin w 15 Lut 2015 23:47 1110 7
REKLAMA
  • #1 14443101
    marcin w
    Poziom 22  
    Witam

    Mam problem z konwersją wartości 8-bitowego rejestru TCNT0 i wyświetleniem jego wartości na LCD. TNCT0 to rejestr licznika T0, który w mojej konfiguracji zlicza impulsu wejściowe na T0. 8-bitwa zmienna po konwersji wyświetlana jest jako wartości większe niż 255. Kod który to realizuje to:

    na początku deklaracje zmiennych:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W obsłudze przerwania generowanego przez licznik T1 odczytywana wartość TCNT0 i wyświetlana na LCD:

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


    Jako że TCNT0 jest wartością która może często ulegać zmianie, celowo przypisuję go do zmiennej licznikT0 opatrzonej modyfikatorem volatile.

    Wartości wyświetlane na LCD w pewnym momencie przekraczają 255, to jest niemożliwe jeżeli licznikT0 może zawierać tylko liczbę 8-bitową. Podstawiałem też w linii itoa(licznikT0, wynik, 10) zamiast licznikT0 bezpośrednio TCNT0 ale bez zmian.

    Skąd się coś takiego bierze ?
  • REKLAMA
  • #2 14443122
    excray
    Poziom 41  
    Może stąd że nie czyścisz wyświetlacza przed wyświetleniem nowej wartości.
  • REKLAMA
  • #3 14443137
    Pi0trek121
    Poziom 23  
    Przypisujesz zmienną 8 bitową do zmiennej "7 bitowej" masz zmienną typu int8_t a zakres takiej zmiennej to od -128 do 127, zamień ją na uint8_t
  • REKLAMA
  • #4 14443433
    BlueDraco
    Specjalista - Mikrokontrolery
    Zmienna pośrednia licznikT0 co prawd anie przeszkadza, ale sensu nie ma żadnego. Funkcja nie używa zmiennej licznikT0, tylko jednokrotnie pobranej jej wartości, więc wstawienie jako argumentu rejestru TCNT0 ma dokładnie taki sam skutek, a jest szybsze. Nie wiem też, dlaczego zerujesz TCNT1.
  • #5 14444853
    marcin w
    Poziom 22  
    excray napisał:
    Może stąd że nie czyścisz wyświetlacza przed wyświetleniem nowej wartości.

    To było przyczyną, sądziłem że funkcja itoa konwertując liczbę jedno czy dwucyfrową na tablicę znaków char (kilkuelementową) puste pola wypełni białymi znakami. Nie dzieje się tak, to co wydawało się być skonwertowaną liczbą w rzeczywistości zawierało śmieci z poprzedniej liczby

    To moje pierwsze kroki w samodzielnym programowaniu uP w C, wcześniej troszkę programowałem w BASCOM. Człowiek uczy się na błędach.

    BlueDraco napisał:
    dlaczego zerujesz TCNT1.

    Licznik T1 jest używany do generowania przerwania przy zrównaniu z zawartością OCR1A. W momencie kiedy TCNT1 osiąga wartość OCR1A, następuje wywołanie przerwania, w którym wykonuję operację wyświetlenia zawartości licznika T0 na LCD, przed zakończeniem obsługi przerwania zeruję stan licznika T1 by od nowa zacząć odliczać założony czas po wyjściu z przerwania.
  • REKLAMA
  • #6 14445498
    krru
    Poziom 33  
    marcin w napisał:

    To było przyczyną, sądziłem że funkcja itoa konwertując liczbę jedno czy dwucyfrową na tablicę znaków char (kilkuelementową) puste pola wypełni białymi znakami. Nie dzieje się tak, to co wydawało się być skonwertowaną liczbą w rzeczywistości zawierało śmieci z poprzedniej liczby


    Nie podaje się długości tablicy do itoa(), więc skąd ma wiedzieć ile wypełnić.
  • #7 14445517
    marcin w
    Poziom 22  
    Ale wynik ma określoną długość
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    W tym przypadku 7 znaków.
  • #8 14445645
    tmf
    VIP Zasłużony dla elektroda
    marcin w napisał:
    Ale wynik ma określoną długość
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    W tym przypadku 7 znaków.


    To ty wiesz, że wynik ma określoną długość - do itoa podajesz tylko wskaźnik do bufora, który musi mieć odpowiednią wielkość, natomiast itoa nie ma żadnej możliwości sprawdzenia wielkości bufora. Chcesz, żeby funkcja czyściła i formatowała łańcuch znakowy to użyj np. sprintf i łańcucha formatującego.
REKLAMA