logo elektroda
logo elektroda
X
logo elektroda
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 2319 16
  • #1 10247562
    Wikkan
    Poziom 9  
    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
  • #2 10247837
    Szumlus
    Poziom 17  
    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  
    Po zmianie zmiennych kod zmalał z 2KB do 1,5KB ale liczby nadal są źle wyświetlane.
  • #4 10248149
    INTOUCH
    Poziom 30  
    Pokaż schemat to może się rozjaśni.
  • #6 10248597
    Wikkan
    Poziom 9  
    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.
  • #8 10250086
    walek33
    Poziom 29  
    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).
  • #10 10250291
    walek33
    Poziom 29  
    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
    Moderator na urlopie...
    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  
    Ależ ja nie napisałem nigdzie, żeby nie umieszczać tego w przerwaniu.
    To miało zastąpić case.
  • #13 10250389
    dondu
    Moderator na urlopie...
    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  
    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  
    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  
    Problemem okazał się jeden wyświetlacz (drugi). Po wymianie wszystko działa ok.
    Dziękuje za pomoc i przydatne rady.
REKLAMA