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

[C] Atmega32 i sterowanie wyświetlaczami LED.

28 Lip 2011 13:10 4849 33
  • #1 9767843
    Konto nie istnieje
    Poziom 1  
  • #2 9767881
    snnaap
    Poziom 25  
    Jest to tak zwane wyświetlanie multipleksowe.
    Anody poszczególnych segmentów 2 wyświetlaczy są ze sobą połączone, czyli A1 z A2, B1 z B2 itd.
    Wyświetlanie wygląda następująco:
    1. Podajesz na połączone anody sygnały żądanej cyfry dla wyświetlacza 1
    2. podajesz minus na katodę pierwszego wyświetlacza (włączasz go)
    3. podajesz plus na katodę pierwszego wyświetlacza (wyłączasz go)
    4. Podajesz na połączone anody sygnały żądanej cyfry dla wyświetlacza 2
    5. podajesz minus na katodę drugiego wyświetlacza (włączasz go)
    6. podajesz plus na katodę drugiego wyświetlacza (wyłączasz go)
    i tak w kółko.
    Robisz to na tyle szybko, że ludzkie oko nie widzi, że poszczególne wyświetlacze gasną.

    Jaki zestaw kupiłeś?
  • #3 9767950
    Konto nie istnieje
    Poziom 1  
  • #5 9768147
    Konto nie istnieje
    Poziom 1  
  • #7 9769069
    Konto nie istnieje
    Poziom 1  
  • #9 9771046
    Konto nie istnieje
    Poziom 1  
  • #11 9771111
    Konto nie istnieje
    Poziom 1  
  • #12 9771247
    snnaap
    Poziom 25  
    Cytat:
    Gdzie timer realizuje zliczanie ?


    Timer zlicza automatycznie zwiększając wartość rejestru TCCR0.
    W tym przypadku TCCR0 jest zwiększany od zera do 255. Gdy nastąpi przepełnienie czyli przejście z 255 na 0 następuje wywołanie procedury przerwania.

    Cytat:
    Widać też lekkie miganie wyświetlaczy...


    Najwyraźniej częstotliwość 'przełączania' poszczególnych wyświetlaczy jest za mała. Należy ją zwiększyć czyli skrócić czas przepełnienia się Timer.
    Robi się to wpisując do TCCR0 wartość początkową od której ma liczyć.
    Czyli na początku procedury przerwania należy wstawić np:

    TCCR0 = 100;


    Cytat:
    w przerwaniu wykonujesz algorytm multipleksowania który opisałeś tak

    Tak.

    Cytat:
    Co dzieje się w pętli nieskończonej w mainie


    W pętli tej co sekundę zwiększana jest wartość zmiennej w2 - czyli zwiększana jest liczba którą chcemy wyświetlić na wyświetlaczu nr 2.


    Cytat:
    do czego użyłeś zmiennych w1 i w2


    W zmiennych w1i w2 przechowywane są liczby jakie mają być wyświetlane na poszczególnych wyświetlaczach.


    Pozdrawiam
  • #13 9771283
    Konto nie istnieje
    Poziom 1  
  • #14 9771340
    snnaap
    Poziom 25  
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Zmienna ' i ' mówi który wyświetlacz ma zostać teraz włączony.

    gdy i = 1 to "włączony" ma zastać wyświetlacz nr 1 czyli na port B ma trafić zawartość zmiennej W1 i następnie do zmiennej ' i ' zostaje wpisana wartość 0 aby po kolejnym przepełnieniu timera włączony został wyświetlacz 2

    i analogicznie

    gdy i = 0 to "włączony" ma zostać wyświetlacz nr 2 czyli na port B ma trafić zawartość zmiennej W2 i następnie do zmiennej ' i ' zostaje wpisana wartość 1 aby po kolejnym przepełnieniu timera włączony został wyświetlacz 1

    Trochę to nie 'po polsku' ale cóż, nieraz tak bywa ;)

    'Po polsku' powinno być tak:


    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [minuty]:

    Cytat:
    Cytat:
    Gdzie timer realizuje zliczanie ?


    Timer zlicza automatycznie zwiększając wartość rejestru TCCR0.
    W tym przypadku TCCR0 jest zwiększany od zera do 255. Gdy nastąpi przepełnienie czyli przejście z 255 na 0 następuje wywołanie procedury przerwania.

    Cytat:
    Widać też lekkie miganie wyświetlaczy...


    Najwyraźniej częstotliwość 'przełączania' poszczególnych wyświetlaczy jest za mała. Należy ją zwiększyć czyli skrócić czas przepełnienia się Timer.
    Robi się to wpisując do TCCR0 wartość początkową od której ma liczyć.
    Czyli na początku procedury przerwania należy wstawić np:

    TCCR0 = 100;


    Tu zrobiłem mały błąd.

    Oczywiście zamiast rejestru TCCR0 powinien być rejestr TCNT0.
    Sorki za wprowadzenie w błąd.

    Dodano po 8 [minuty]:

    Cytat:
    Dlaczego mam zdefiniowany F_CPU na 16Mhz, w funkcji _delay_ms wpisuję 1000ms a opóźnienie wygląda jak ... 200ms ? 250, nie wiem. Powinno czekać 1s a czeka nawet nie ćwierć sekundy. O co tu chodzi ? żeby uzyskać 1s w delayu muszę wpisać jako argument 100000. Da się zrobić w ogóle ten program inaczej niż Twoim sposobem (zapisem) ?


    Masz coś namieszane z tym oscylatorem.

    Napisz jak masz ustawione fusy bits.
    Wtedy będziemy wszystko wiedzieć.

    Cytat:
    Chciałbym napisać go sam i sam dojść do wszystkiego ale widzę że jest to niemożliwe. Twój program nic mi nie pomaga, bo i tak nie rozumiem w nim praktycznie niczego prócz ustawień timera


    Mogę poradzić Ci, żebyś kupił sobie jakąś książkę np książka użytkownika tmf. Ostatnio głośno o niej na forum.
    A jeżeli masz jakieś dodatkowe pytania to żeby nie zaśmiecać forum możemy kontaktować się przez gg.
  • #15 9771450
    piotrva
    VIP Zasłużony dla elektroda
    Ja na początek polecałbym mimo wszystko książkę Mirka, która jest bardziej zorientowana w kierunku początkujących - książkę tmf polecam po książce mirka - idealne uzupełnienie i ogromne rozszerzenie informacji
  • #16 9771551
    Konto nie istnieje
    Poziom 1  
  • #17 9771614
    snnaap
    Poziom 25  
    Cytat:
    co do fuse bitów to nie wiem jak one są ustawione...Programuje ATmege poprzez kabel USB i przestawioną jakąś tam zworke wg. instrukcji tego zestawu uruchomieniowego. A sam wsad wrzucam za pomocą MegaLoad.


    No to tu nie pomogę bo tego programu nie znam.

    W instrukcji zestawi nie jest napisane z jak to jest ustawione.


    Jedyne co pozostaje to spróbowanie różnych wariantów, wpis:

    #define F_CPU 1000000UL

    i sprawdź jak to działa.
  • #18 9780108
    Konto nie istnieje
    Poziom 1  
  • #19 9780272
    gaskoin
    Poziom 38  
    Spróbuj z avrdude. Jakie fusy bity i jak należy ustawić znajdziesz w nocie katalogowej.

    Dobrą praktyką jest umieszczanie definicji F_CPU w makefilu a nie definując je gdzie popadnie. Samo zadefiniowanie prędkości CPU nie zwiększa jej :) Stąd duże wartości jakie musisz wpisywać.
  • #20 9780311
    Konto nie istnieje
    Poziom 1  
  • #21 9788768
    Konto nie istnieje
    Poziom 1  
  • #22 9793263
    LordBlick
    VIP Zasłużony dla elektroda
    Kwestia jest analizy jakie biblioteki są dołączane przy kompilacji albo ustawiania gdzieś w opcjach AVRS5 rzeczywistej prędkości zegara...
  • #23 9809047
    Konto nie istnieje
    Poziom 1  
  • #24 9809078
    piotrva
    VIP Zasłużony dla elektroda
    A od kiedy AVRStudio5 ma moduł jasnowidza?
    Przecież kompilator NIE WIE jaki masz kwarc na płytce ani jak są ustawione fusebity w procesorze! A zatem NIE WIE jaka jest częstotliwość pracy procesora. Z tego co wiem w ostatniej wersji AS5, którą testowałem zapomnieli o tym okienku, które jest w AS4 do ustawiania tego parametru, zatem abo trzeba ręcznie dodać do linii poleceń przy kompilacji, albo dać #define F_CPU ...
  • #25 9809211
    Konto nie istnieje
    Poziom 1  
  • #26 9809332
    piotrva
    VIP Zasłużony dla elektroda
    Jedyna moja rada - powrót do AS4 - wmiarę pewne a na pewno sprawdzone na 1000 stron środowisko... A AS5 ma swoje błędy jeszcze i niedociągnięcia...
  • #27 9809360
    dondu
    Moderator na urlopie...
    No nie dajmy się zwariować. Tak banalny błąd w AS5 na pewno nie występuje.
    Autor popełnia jakiś błąd - spakuj cały projekt i załącz go tutaj to ktoś kto ma AS5 sprawdzi go (ja niestety nie mam).

    Oprócz tego pytanie o warningi. Występują jakieś podczas kompilacji?
    Załącz całość komunikatów.
  • #28 9809403
    piotrva
    VIP Zasłużony dla elektroda
    dondu napisał:
    No nie dajmy się zwariować. Tak banalny błąd w AS5 na pewno nie występuje.
    Autor popełnia jakiś błąd - spakuj cały projekt i załącz go tutaj to ktoś kto ma AS5 sprawdzi go (ja niestety nie mam).

    Na pewno nigdy nie mów na pewno...
    Otóż błąd z barkiem tego okienka na 100% występował (a może występuje nadal) w jednej z pierwszych wersji AS5 - nawet chyba pisałem o tym na forum w temacie o AS5...
  • #29 9809408
    dondu
    Moderator na urlopie...
    Nawet jeżeli tak było to pewnie w wersji Beta, a nie tej która jest dostępna aktualnie.

    Kiedyś miałem podobnie (choć na odwrót) na oficjalnym forum microchipa. Udowadniano mi, że starsza wersja kompilatora nie obsługuje pewnej techniki. Kazano instalować najnowszą wersję. Jednak wykazałem, że kod generowany jest prawidłowo.

    Inna sprawa że w końcu nowszą wersję zainstalowałem :)
  • #30 9809464
    piotrva
    VIP Zasłużony dla elektroda
    Cóż zaznaczyłem, że błąd ten występował i nie wiem czy dalej występuje, ale warto to sprawdzić.
REKLAMA