Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Multipleksowanie na ATmedze88

03 Sty 2020 21:04 783 25
  • 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?
  • Poziom 39  
    A masz już jakiś kod do multipleksowania który chcesz przerobić i użyć?
  • Poziom 13  
    Tak. Mam taki gdzie anody podłączone są pod PC0 do PC3, a katody PD0 do PD7.
    Nie dodałem że jest to wyświetlacz czterocyfrowy ze wspólną anodą.
  • Poziom 31  
    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.
  • Poziom 39  
    Załącz ten kod to spróbujemy go zmodyfikować pod nowe realia.
  • 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ę
  • Poziom 13  
    Tak sobie napisałem procedurę obsługi przerwania
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Do tego są takie definicje
    Kod: c
    Zaloguj się, aby zobaczyć kod

    A tak mam zainicjowany TIMER dla kwarca 32,768kHz
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • 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.
  • 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ć?
  • 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.
  • Poziom 13  
    Nie rozumiem, jak działają wektory, nie mogę w necie znaleźć o tym nic sensownego. Pomoże ktoś to zrozumieć?
  • Poziom 13  
    No tak to rozumiem, tak działają wskaźniki. Ale dlaczego tutaj &cyfry[cyfra[licznik]] w elemencie tablicy cyfry jest podany element kolejnej tablicy?
  • Poziom 39  
    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
    Zaloguj się, aby zobaczyć kod
  • Poziom 23  
    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
    Zaloguj się, aby zobaczyć kod
  • 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
    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")?
  • Poziom 23  
    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ę.
  • Poziom 39  
    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.
  • Poziom 13  
    Ale czy przy takim zapisie
    Kod: c
    Zaloguj się, aby zobaczyć kod
    nie zostanie pobrany adres komórki przechowującej dane a nie dane potrzebne do ustawienia stanów niskich na katody?
  • Specjalista - Mikrokontrolery
    licznik - to numer cyfry
    cy[licznik] - wartość wyświetlanej cyfry
    cyfry[cy[licznik]] - obraz segmentów cyfry
  • Poziom 13  
    BlueDraco napisał:
    licznik - to numer cyfry
    cy[licznik] - wartość wyświetlanej cyfry
    cyfry[cy[licznik]] - obraz segmentów cyfry

    Z tym się zgadzam, ale dlaczego przed tym jest znak &? Czy to nie pobranie adresu jakiejś komórki pamięci?
  • Poziom 39  
    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]);

    ???
  • Poziom 13  
    Gdzieś na nacie to podpatrzyłem i użyłem u siebie, teraz nie dawno zacząłem się bardziej nad tym zastanawiać.
  • 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).
  • Poziom 13  
    BlueDraco napisał:
    Chciałbyś jeździć samochodem, którego projektant kierowałby się takimi zasadami?
    Z przyjemnością. O niczym innym nie marzę :D