logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak zrobić multipelsowanie wyświetlacza LED na ATmedze88?

Jacek212 03 Sty 2020 21:04 918 25
REKLAMA
  • #1 18378976
    Jacek212
    Poziom 13  
    Witam. chcę zrobić multipelsowanie typowego wyświetlacza LED na ATmedze88 z tym że piny PD0 i PD1 chcę zostawić wolne dla RS232 a piny PB6 i PB7 chcę mieć dla kwarca, Segmenty A i B podpiąłem pod PB0 i PB1 a segmenty od C do DP podłączone są PD2 do PD7. szukam jakiejś gotowej biblioteki do tego, lub sposobu jak to zrobić. Ktoś może coś podpowie?
  • REKLAMA
  • #2 18379325
    excray
    Poziom 41  
    A masz już jakiś kod do multipleksowania który chcesz przerobić i użyć?
  • REKLAMA
  • #4 18379355
    dasej
    Poziom 32  
    Witam.

    Porty PC0, PC1, PC2, PC3 są zabezpieczone tranzystorami?
    Jeżeli tak to w czym jest problem.
    Uruchamiasz time na minimum 25Hz i w jego obsłudze robisz wszystko co trzeba.
    Czyli ustaw PC0=1, reszta na 0, i na szynę PD0..7 wystawiasz to co chcesz zobaczyć.
    Następnie PC1=1, reszta na 0, i na szynę PD0..7 wystawiasz to co chcesz zobaczyć.
    i kolejno PC2 i PC3.

    Temat zakończony.
  • #5 18379357
    excray
    Poziom 41  
    Załącz ten kod to spróbujemy go zmodyfikować pod nowe realia.
  • #6 18379626
    BlueDraco
    Specjalista - Mikrokontrolery
    dasej napisał:
    Uruchamiasz time na minimum 25Hz i w jego obsłudze robisz wszystko co trzeba.
    Czyli ustaw PC0=1, reszta na 0, i na szynę PD0..7 wystawiasz to co chcesz zobaczyć.


    Chyba miało być "minimum 250 Hz", ale ja proponowałbym min. 400 Hz, a raczej powyżej 1 kHz.
    No i przy takiej obsłudze, jak piszesz, na wyświetlaczu będą słynne duchy.

    Powinno być:
    W kolejnym przerwaniu timera
    - wyłącz wszystkie cyfry
    - ustaw sterowanie segmentów dla nowej cyfry
    - włącz nową cyfrę
  • REKLAMA
  • REKLAMA
  • #8 18380565
    BlueDraco
    Specjalista - Mikrokontrolery
    Tę całą błędną serię if zastąp prostym:
    KATODAPORTD &= pgm_read_byte (&cyfry[cyfra[licznik]) | MASKAD;
    KATODAPORTB &= pgm_read_byte (&cyfry[cyfra[licznik]] | MASKAB);

    tylko wcześniej zdefiniuj te maski - bez nich będzie źle.
  • #9 18384950
    Jacek212
    Poziom 13  
    BlueDraco napisał:
    Tę całą błędną serię if zastąp prostym:
    KATODAPORTD &= pgm_read_byte (&cyfry[cyfra[licznik]) | MASKAD;
    KATODAPORTB &= pgm_read_byte (&cyfry[cyfra[licznik]] | MASKAB);

    tylko wcześniej zdefiniuj te maski - bez nich będzie źle.

    Podoba mi się takie pominięcie if-ów tylko nie bardzo rozumiem ten zapis.
    Do KATODAPORTD wrzucam zera na linie które mają zapalać odpowiednie segmenty informacja o tym pochodzi z tablicy cyfry którą pobieram z pamięci flash przy pomocy operatora &, to rozumiem.
    licznik w tym zapisie wyznacza na której pozycji wyświetlacza mają się w danym momencie zapalać się segmenty, to też rozumiem.
    A co to jest "cyfra" co ona ma robić?
  • #10 18385720
    BlueDraco
    Specjalista - Mikrokontrolery
    Po prostu trzymaj cyfry do wyświetlenia w wektorze, a nie w czterech zmiennych, w ten sposób unikniesz bezsensownych if lub switch, gdzie w każdym bloku jest to samo, tylko z innymi danymi. Zapisując do portu raczej nie powinieneś modyfikować linii nie sterujących segmentami, stąd te stałe MASKx.
  • #12 18386384
    dasej
    Poziom 32  
    Pisząc w potwornie dużym skrócie.
    Przekazujesz adres komórki pamięci gdzie są Twoje dane.
  • #14 18386421
    excray
    Poziom 41  
    Jacek212 napisał:
    Ale dlaczego tutaj &cyfry[cyfra[licznik]] w elemencie tablicy cyfry jest podany element kolejnej tablicy?

    Bo tam się koledze sporo pomieszało. Pewnie pisał z rozpędu aby przekazać ogólną ideę. Powinno być:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #16 18386620
    ex-or
    Poziom 28  
    excray napisał:
    Bo tam się koledze sporo pomieszało.

    Nie sądzę.
    Jacek212 napisał:
    Nie rozumiem, jak działają wektory, nie mogę w necie znaleźć o tym nic sensownego.

    Wektor czyli tablica jednowymiarowa.
    Jacek212 napisał:
    Ale dlaczego tutaj &cyfry[cyfra[licznik]] w elemencie tablicy cyfry jest podany element kolejnej tablicy?

    Tablica (wektor) cyfra zawiera wartość kolejnych pozycji liczby. Tablica 'cyfry' zawiera patterny danej cyfry dla kodu 7 segment. Pattern musi być zamaskowany dla pinów nie wykorzystanych w wyświetlaczu.

    Przy okazji: makra pgm_read_byte są przestarzałe, w tej chwili pisze sie tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #17 18386896
    BlueDraco
    Specjalista - Mikrokontrolery
    excray napisał:
    Jacek212 napisał:
    Ale dlaczego tutaj &cyfry[cyfra[licznik]] w elemencie tablicy cyfry jest podany element kolejnej tablicy?

    Bo tam się koledze sporo pomieszało. Pewnie pisał z rozpędu aby przekazać ogólną ideę. Powinno być:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A co konkretnie mi się pomieszało i czym różni się Twoje "powinno być" od tego, co ja podałem (poza zmianą nazwy "cyfra" na "cy")?
  • #18 18386916
    ex-or
    Poziom 28  
    BlueDraco napisał:
    czym różni się Twoje "powinno być" od tego, co ja podałem

    Tym że "cy" zmaterializowalo się między 23.01 a 8.17 a "powinno być" pozostało takie jak było wcześniej ;-)
    ex-or napisał:
    Tablica 'cyfry' zawiera patterny danej cyfry dla kodu 7 segment.

    Jeszcze by wyczerpać temat: ponieważ piny wykorzystywane na portach (numery pinów) się nie pokrywają można skorzystać z tego samego patternu dla obu portów stosując jedynie odpowiednią maskę.
  • #19 18387128
    excray
    Poziom 41  
    BlueDraco napisał:
    A co konkretnie mi się pomieszało i czym różni się Twoje "powinno być" od tego, co ja podałem (poza zmianą nazwy "cyfra" na "cy")?

    BlueDraco napisał:
    KATODAPORTD &= pgm_read_byte (&cyfry[cyfra[licznik]) | MASKAD;
    - brakuje nawiasu kwadratowego
    BlueDraco napisał:
    KATODAPORTB &= pgm_read_byte (&cyfry[cyfra[licznik]] | MASKAB);
    - nawias zamknięty nie w tym miejscu. Przez co maska bitowa dokłada się do adresu

    Dodano po 6 [minuty]:

    ex-or napisał:
    Tym że "cy" zmaterializowalo się między 23.01 a 8.17 a "powinno być" pozostało takie jak było wcześniej ;-)

    Zmienną cyfra[] która też jest ok, zmieniłem później na cy[] tylko dlatego, że autor używa obecnie zmiennych cy1, cy2 .. cy4 więc uznałem, że jak zapiszę cy[] zamiast cyfra[] to łatwiej będzie mu zrozumieć skąd to się wzięło.
  • #21 18412131
    BlueDraco
    Specjalista - Mikrokontrolery
    licznik - to numer cyfry
    cy[licznik] - wartość wyświetlanej cyfry
    cyfry[cy[licznik]] - obraz segmentów cyfry
  • #23 18412969
    excray
    Poziom 41  
    Jacek212 napisał:
    Z tym się zgadzam, ale dlaczego przed tym jest znak &? Czy to nie pobranie adresu jakiejś komórki pamięci?

    Hmm, no właśnie. W takim razie dlaczego Ty sam napisałeś tak w swoim kodzie:
    Jacek212 napisał:
    KATODAPORTD &= pgm_read_byte (&cyfry[cy1]);

    ???
  • #25 18413091
    BlueDraco
    Specjalista - Mikrokontrolery
    "Podpatrzyłem i nie miałem czasu się zastanawiać" - manifest inżyniera... Chciałbyś jeździć samochodem, którego projektant kierowałby się takimi zasadami?

    Funkcja pgm_read_byte() ma jako argument ADRES komórki pamięci programu, którą ma odczytać - taka proteza do czytania danych z Flash wynikająca z egzotycznej architektury AVR. Obecnie zamiast tego robi się to, co podał Kolega powyżej - wystarcza deklaracja danej z atrybutem _flash (czy jakoś tak - ja ostatni program na AVR popełniłem ok 10 lat temu, kiedy jeszcze takich udogodnień nie było).
REKLAMA