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] - Jak zrealizować płynne przesuwanie cyfr na wyświetlaczach LED?

servgsm 10 Lut 2013 21:32 2859 9
REKLAMA
  • #1 11916973
    servgsm
    Poziom 23  
    Witam,

    Dotychczas na AVRach robiłem tylko logiczne sterowanie triakami, tranzystorami, czasami sczytywanie danych z termopar... Przyszedł czas na naukę sensownego multipleksowania.

    A więc,
    złożyłem sobie układzik składający się z atmegi8, 4543 i trzech wyświetlaczy led siedmiosegmentowych. Dążę do tego, aby na wyświetlaczach pojawiało się kolejno:
    012
    123
    234
    345
    456
    567
    678
    789
    890
    901
    012 itd.
    Czyli tak jakby przesuwanie cyfr.

    Przy czym miganie wyświetlaczy ma być niewidzialne dla ludzkiego oka.
    Ostatecznie popełniłem coś takiego (proszę nie zwracać uwagi na brak niektórych oznaczeń i estetykę, schemat szkicowany na szybko):
    AtMega8 [C] - Jak zrealizować płynne przesuwanie cyfr na wyświetlaczach LED?

    Porty D 0-2 sterują anodą wyświetlaczy, a PB 0-3 wysyłają dane do 4543 jaką cyfrę w danym czasie ma wyświetlić.

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


    A efekt tak jak w linku: Youtube.

    Nie mogę ostatecznie pojąć dlaczego wyświetlacze dają czasami zamierzony efekt, a czasami zwyczajnie wariują. Kod wedle mnie wydaje się logiczny i poprawny. Będę wdzięczny za wszelkie sugestie.

    Pozdrawiam,
    Bartek.
  • REKLAMA
  • #2 11917000
    BlueDraco
    Specjalista - Mikrokontrolery
    Kod zdecydowanie nie jest poprawny. Zacznij od przerwanai timera zgłaszanego z częstotliwością jakieś 800 Hz. W każdym przerwaniu wyłącz cyfrę, ustaw segmenty i zapal nową cyfrę.
  • REKLAMA
  • #3 11917038
    servgsm
    Poziom 23  
    Rozumiem, że użyć mam po prostu zegara wewnętrznego? Aktualnie mam podpięty kwarc 16MHz, bo przy wewnętrznym 8MHz wyświetlacze nadal migały.

    Dodano po 2 [minuty]:

    Tfu, co ja piszę.. (przemęczenie).
    Ogólnie cała akcja multipleksowania ma działać na 800Hz?
  • #4 11917069
    BlueDraco
    Specjalista - Mikrokontrolery
    Problem leży wyłącznie w złym oprogramowaniu. Zrób to, co pisałem. Zegar 8MHz w zupełności wystarczy. Zacznij od przerwania timera.
  • #5 11917165
    mirekk36
    Poziom 42  
    servgsm napisał:
    Rozumiem, że użyć mam po prostu zegara wewnętrznego? Aktualnie mam podpięty kwarc 16MHz, bo przy wewnętrznym 8MHz wyświetlacze nadal migały.

    Dodano po 2 [minuty]:

    Tfu, co ja piszę.. (przemęczenie).
    Ogólnie cała akcja multipleksowania ma działać na 800Hz?


    Do multipleksowania wystarczyłoby ci nawet taktowanie 1MHz z wewn. oscylatora. To żaden problem. Multipleksowanie przenosisz do obsługi przerwania jednego z timerów sprzętowych. Tam wykonujesz te operacje a w pętli głównej programu co najwyżej wpisujesz dane na wyświetlacz. Dla 4 wyświetlaczy LED wystarczy przerwanie co 200Hz po co aż 800Hz ??? totalna strata czasu ....Przy 200Hz będziesz miał odświeżanie 50Hz na jeden wyświetlacz. Nawet jak wydawałoby ci się za mało to lekko zwiększysz i po kłopocie.
  • REKLAMA
  • #6 11917271
    BlueDraco
    Specjalista - Mikrokontrolery
    Przyjmuje się, że efekt migotania przy widzeniu pobocznym zanika przy 300 Hz. Ja konserwatywnie zaproponowałem na początek odświeżanie 200 Hz (4 cyfry, czyli przerwanie odświeżania 800 Hz). W zasadzie powinno być 1200 Hz. Oczywiście początkujący amatorzy, tacy jak Kolega powyżej robią odświeżanie wolniejsze.
  • REKLAMA
  • #7 11917808
    piotrva
    VIP Zasłużony dla elektroda
    A co do schematu, raz rysuj schematy na komputerze, dwa, gdzie rezystory ograniczające prąd na ledach i tranzystory na wspólnych końcach led?
  • #8 11917835
    servgsm
    Poziom 23  
    Póki co wielkie dzięki. Przy kolejnej wolnej chwili będę kombinował z tymi przerwaniami.

    piotrva napisał:
    A co do schematu, raz rysuj schematy na komputerze, dwa, gdzie rezystory ograniczające prąd na ledach i tranzystory na wspólnych końcach led?


    Kolego piotrva, proszę wybaczyć, ale ze względu na nawyk, rysuję schematy odręcznie i ciężko byłoby mi się od tego odzwyczaić, więc proszę ostrożniej z tym rozkazującym tonem, troszkę szacunku.

    Schemat przedstawiony jest schematem poglądowym o co tu w ogóle chodzi. Proszę to przyjąć jako schemat a'la blokowy. Rysowałem go wyłącznie na potrzeby tego tematu, nie uważam więc za potrzebne dokładne rozrysowywanie tu elementów dyskretnych, które do tematu nic nie wniosą.
  • #9 11917958
    McMonster
    Poziom 32  
    servgsm napisał:
    Schemat przedstawiony jest schematem poglądowym o co tu w ogóle chodzi. Proszę to przyjąć jako schemat a'la blokowy. Rysowałem go wyłącznie na potrzeby tego tematu, nie uważam więc za potrzebne dokładne rozrysowywanie tu elementów dyskretnych, które do tematu nic nie wniosą.


    O to, że na schemacie wychodzi masa podstawowych i głupich błędów, które ciężko inaczej wyłapać. Pół biedy, jeśli schemat odręczny jest dokładny i wyraźny, ale ten po prostu za wiele do tematu nie wnosi. Pamiętaj, że to ty przedstawiając coś na forum masz za zadanie ułatwić pomoc sobie.
  • #10 11919340
    piotrva
    VIP Zasłużony dla elektroda
    servgsm napisał:

    Kolego piotrva, proszę wybaczyć, ale ze względu na nawyk, rysuję schematy odręcznie i ciężko byłoby mi się od tego odzwyczaić, więc proszę ostrożniej z tym rozkazującym tonem, troszkę szacunku.

    Nie wiem gdzie Kolega widzi w mojej wypowiedzi brak szacunku i niekulturalny ton rozkazujący.
    Gdyby schemat był czytelny to nie miałbym do tego żądnych uwag, ale ten ani nie jest czytelny, ani poprawny, zawiera podstawowe błędy. Poza tym złych nawyków należy się oduczać i nabierać poprawnych, a gwarantuję, że taki rysunek na komputerze zająłby 15 minut.
    Póki co w związku z takim tonem Kolegi z mojej strony na pomoc proszę nie oczekiwać.
REKLAMA