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 licznik impulsów, niewłaściwe wyświetlanie.

Wikkan 11 Gru 2011 18:50 2457 16
REKLAMA
  • #1 10247562
    Wikkan
    Poziom 9  
    Posty: 27
    Witam.

    Mam problem z projektem licznika impulsów. Układ ma liczyć impulsy w "przód" i w "tył" i wyświetlać go na 4 wyświetlaczach led. Problem pojawia się wraz z przekroczeniem stu, dwa pierwsze wyświetlacze pokazują dziwne cyfry np. nie ma trójki tylko odwrócona szóstka.

    Dopiero zaczynam naukę w C nie wiem co jest źle. Proszę o pomoc.

    Poniżej zamieszczam kod.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 10247837
    Szumlus
    Poziom 17  
    Posty: 124
    Pomógł: 27
    Witam,

    Proponuje zacząć koledze od uporządkowania nieco programu.

    Po pierwsze typy zmiennych dlaczego wszędzie są int'y??
    Tablica ze znakami dla wysw. 7seg spokojnie starcza bajtowa. To samo tyczy się pojedynczych cyfr (setki, dziesiątki jedności). Po tych zmianach polecam sprawdzić ile kod w pamięci flash. Co do złego wyświetlania to najprawdopodobniej jest błąd w procedurze konwersji i na port wysyłasz 'coś' co jest z poza tablicy znaków dla wyświetlacza.

    Pozdrawiam,
    Marcin
  • #3 10247998
    Wikkan
    Poziom 9  
    Posty: 27
    Po zmianie zmiennych kod zmalał z 2KB do 1,5KB ale liczby nadal są źle wyświetlane.
  • REKLAMA
  • #4 10248149
    INTOUCH
    Poziom 30  
    Posty: 1581
    Pomógł: 99
    Ocena: 199
    Pokaż schemat to może się rozjaśni.
  • #6 10248597
    Wikkan
    Poziom 9  
    Posty: 27
    Po zmianach kod wygląda tak.

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


    Zmieniałem piny, sprawdzałem połączenia i nic się nie zmienia. Na "setkach" i "tysiącach" źle wyświetlane są tylko cyfry "3","5" i "9".
    Wszystko mam złożone na płytce stykowej i nie mam programu do narysowania schematu.
    Proszę o pomoc.
  • REKLAMA
  • #8 10250086
    walek33
    Poziom 29  
    Posty: 1015
    Pomógł: 132
    Ocena: 81
    Tak dla ewolucji programu to multiplex prościej jest zrobić w pętli For...
    Zajmie wtedy pięć linijek.
    A co do wyświetlania poszczególnych cyfr to sprawdź połączenie dwóch najbardziej znaczących wyświetlaczy (podłączenie poszczególnych segmentów).
  • #9 10250104
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    walek33 napisał:
    Tak dla ewolucji programu to multiplex prościej jest zrobić w pętli For...
    Zajmie wtedy pięć linijek.

    Możesz wyjaśnić dokładniej jak to miałoby wyglądać?
  • REKLAMA
  • #10 10250291
    walek33
    Poziom 29  
    Posty: 1015
    Pomógł: 132
    Ocena: 81
    Służę. Może nie dokładnie, ale...
    Wyświetlaną cyfrę ubrałbym w tablicę np. cyfra_wysw(4) i obliczenia jedności, dziesiątek, setek, tysięcy umieścił w niej zamiast w oddzielnych zmiennych.
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Może nie jest to idealne, bo dawno nie programowałem, ale zasada działania j/w. Myślę, że wyrobiłem się w obiecanej ilości linii. ;)
  • #11 10250363
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    Jeżeli mikrokontroler miałby robić tylko i wyłącznie wyświetlanie, to Twój sposób z pętlą for() jest idealny :)
    Niestety wyświetlanie ma być realizowane "w tle", dlatego sposób autora oparty o przerwania jest prawidłowy.
  • #12 10250375
    walek33
    Poziom 29  
    Posty: 1015
    Pomógł: 132
    Ocena: 81
    Ależ ja nie napisałem nigdzie, żeby nie umieszczać tego w przerwaniu.
    To miało zastąpić case.
  • #13 10250389
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    walek33 napisał:
    Ależ ja nie napisałem nigdzie, żeby nie umieszczać tego w przerwaniu.
    To miało zastąpić case.

    To zastanów się co zobaczysz na wyświetlaczu, przy tak szybkiej zmianie wyświetlania trzech pierwszych segmentów i pozostawieniu czwartego zapalonego do następnego przerwania.
  • #14 10250445
    walek33
    Poziom 29  
    Posty: 1015
    Pomógł: 132
    Ocena: 81
    OK. I tu mnie masz :)
    Choć ustalając na starcie programu i=1 i portb=1 można skorzystać z poniższego:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Jeśli gdzieś popełniam błąd, popraw mnie.
  • #16 10250467
    walek33
    Poziom 29  
    Posty: 1015
    Pomógł: 132
    Ocena: 81
    Dzięki. A tak na marginesie. Jeżeli to ma liczyć impulsy to czy przy pewnej częstotliwości przerwanie nie będzie przeszkadzać w poprawnym zliczaniu?

    Edit:
    Powinno być po 1 ponieważ multipeks realizowany na czterech najmłodszych bitach ma mieć wartości 1, 2, 4, 8.
    Tak mi się przynajmniej wydaje. I tu był błąd.
  • #17 10250848
    Wikkan
    Poziom 9  
    Posty: 27
    Problemem okazał się jeden wyświetlacz (drugi). Po wymianie wszystko działa ok.
    Dziękuje za pomoc i przydatne rady.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik zgłosił problem z licznikiem impulsów opartym na mikrokontrolerze Atmega8, który nieprawidłowo wyświetla liczby na czterech wyświetlaczach LED po przekroczeniu wartości 100. W odpowiedziach zasugerowano uporządkowanie kodu, zmiany typów zmiennych oraz sprawdzenie procedury konwersji. Po wprowadzeniu poprawek, w tym zmiany typu zmiennych z int na unsigned char, problem z wyświetlaniem nadal występował. Użytkownik otrzymał również porady dotyczące użycia pętli for do multiplexowania oraz sprawdzenia połączeń wyświetlaczy. Ostatecznie problem został rozwiązany po wymianie uszkodzonego wyświetlacza.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA