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

Multipleksowanie LED atmega32.

matiu6565 30 Maj 2015 20:03 981 22
  • #1 30 Maj 2015 20:03
    matiu6565
    Poziom 10  

    Witam. Mam atmege32 do tego mam połączony wyświetlacz 7 segmentowy ze wspólną anodą. Gdy steruje sobie na ''krótko'' to wyświetlacz jest ok. Problem zaczyna się kiedy wkracza multipleksowanie i przerwania. Mam błąd w programie którego nie mogę znaleźć.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Drugi plik
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodano po 8 [minuty]:

    Multipleksowanie LED atmega32.

    Wyświetlacz ma anody połączone do pinu 0 i pinu 1 portu c poprzez tranzystor npn, natomiast segmenty do pinów portu D.

    0 22
  • #2 30 Maj 2015 21:10
    electronics_design
    Poziom 13  

    Jaki jest efekt działania programu? Wydaje się prawie dobry ale zapomniałeś o ponownym ustawieniu wszystkich pinów na 1 przed wyświetleniem nowego znaku, przez to nowa wartość zostanie dodana do starej. Nie widzę też nieskończonej pętli while(1).

    0
  • #3 30 Maj 2015 21:15
    matiu6565
    Poziom 10  

    Program po wgraniu na mikrokontroler wgl nie widać jego działania. Wyświetlacz się nie świeci, nic się nie dzieje. Co z ta pętla? Co powinienem w niej umieścić?

    0
  • #5 31 Maj 2015 07:47
    el2010tmp
    Poziom 25  

    matiu6565 napisał:
    7 segmentowy ze wspólną anodą.

    matiu6565 napisał:
    anody połączone do pinu 0 i pinu 1 portu c poprzez tranzystor npn

    Jak to podłączyłeś?
    Pokaż schemat.

    0
  • #8 31 Maj 2015 10:31
    matiu6565
    Poziom 10  

    Chodzi ci o to ze piny portu D i C powinny być ustawione jako wejścia?

    Dodano po 2 [minuty]:

    Co mógłbym umieścić w pętli while (1)? Jakie instrukcje?

    0
  • #9 31 Maj 2015 12:59
    dondu
    Moderator Mikrokontrolery Projektowanie

    matiu6565 napisał:
    Sorry za jakość.

    Eagle ma funkcję eksportu do pliku graficznego: http://mikrokontrolery.blogspot.com/2011/03/e...-and-tricks.html#eksport_do_pliku_graficznego


    electronics_design napisał:
    Dla sterowania ze wspólną anodą porty nie powinny być ustawione jako wejścia? Do nich przecież wpływa prąd od zasilania, przez diodę.

    Kolega myli dwie sprawy:
    1. ustawienia jako pin wejściowy - do badania stanu jakiegoś zewnętrznego sygnału cyfrowego,
    2. ustawienia jako pin wyjściowy do sterowania sygnałem cyfrowym np. wyświetlaczem LED. Kierunek przepływu prądu natomiast jest zależny od tego, czy na wyjściu jest zero (prąd płynie do pinu), czy też jedynka (prąd wypływa z pinu).

    Przyczyną niedziałania programu jest brak pętli głównej, co już koledzy wyżej wskazali. W takim przypadku w procesie kompilacji zostaje dodana pętla główna przy jednoczesnym wyłączeniu przerwań globalnych, co w Twoim przypadku powoduje pozorne niedziałanie mikrokontrolera.

    matiu6565 napisał:
    Co mógłbym umieścić w pętli while (1)? Jakie instrukcje?

    Nic - przykład: http://mikrokontrolery.blogspot.com/2011/03/led-sterowany-przez-timer.html

    0
  • #10 31 Maj 2015 14:00
    matiu6565
    Poziom 10  

    Dalej nic.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #11 31 Maj 2015 14:12
    electronics_design
    Poziom 13  

    Dobrze ale nie ustawiłeś nadal pinów jako wejścia
    - po pierwsze usuń linię DDRD = 0xFF;
    - po drugie jeżeli masz wyświetlacz ze wspólną anodą to powinieneś wykorzystać tranzystory PNP a nie NPN tak jak na obrazu poniżej - wtedy też piny sterujące tranzystorami ustawiasz jako wejścia i sterujesz zerem. Multipleksowanie LED atmega32.

    0
  • #12 31 Maj 2015 14:23
    matiu6565
    Poziom 10  

    Ale jak w programie wydam komendę za pomocą funkcji delay i cyklicznie Sobie przełączam segmenty to wszystko jest ok. Dopiero problem zaczyna się z przerwaniem. Wiec wydaje mi się ze tranzystory nie mają nic do rzeczy a ustawianie wejść na porcie wyjściowym jest nie właściwe.

    0
  • #13 31 Maj 2015 14:45
    dondu
    Moderator Mikrokontrolery Projektowanie

    electronics_design napisał:
    Dobrze ale nie ustawiłeś nadal pinów jako wejścia
    - po pierwsze usuń linię DDRD = 0xFF;
    ... wtedy też piny sterujące tranzystorami ustawiasz jako wejścia ...

    Kolego, przeczytaj post #9: https://www.elektroda.pl/rtvforum/viewtopic.php?p=14734605#14734605

    electronics_design napisał:
    - po drugie jeżeli masz wyświetlacz ze wspólną anodą to powinieneś wykorzystać tranzystory PNP a nie NPN

    To słuszna uwaga.

    matiu6565 napisał:
    ... a ustawianie wejść na porcie wyjściowym jest nie właściwe.

    Tak, dobrze rozumiesz.

    0
  • #14 31 Maj 2015 22:59
    matiu6565
    Poziom 10  

    Wiec do poprawnego działania układu musze wymienić tranzystory? Wydaje mi się ze źle rozumiem. Przepraszam za moje błądzące pytania. Moglibyście mi zrobić poprawki w tym programie bo juz szczerze zgubiłem się. :-) Będę wdzięczny.

    0
  • #15 01 Cze 2015 10:46
    el2010tmp
    Poziom 25  

    matiu6565 napisał:
    Wiec do poprawnego działania układu musze wymienić tranzystory?

    Schemat który pokazałeś na pewno jest błędny. Poprawny schemat jest w poscie #11.

    0
  • #16 01 Cze 2015 11:42
    94075
    Użytkownik usunął konto  
  • #17 01 Cze 2015 12:15
    matiu6565
    Poziom 10  

    Wyświetlacz na schemacie jest tylko poglądowy. Przepraszam za wprowadzenie w błąd. Napewno ma wspólna anode ponieważ jak wyżej juz mówiłem sygnały sterujące podane na krótko i wszystko działa.

    Dodano po 2 [minuty]:

    Wiec nie wydaje mi się by była to wina schematu lecz programu.

    0
  • #18 01 Cze 2015 13:39
    94075
    Użytkownik usunął konto  
  • #19 01 Cze 2015 13:46
    matiu6565
    Poziom 10  

    1. Działa
    2. Jak to sprawdzić?

    0
  • #20 01 Cze 2015 13:53
    94075
    Użytkownik usunął konto  
  • #21 01 Cze 2015 16:41
    matiu6565
    Poziom 10  

    Zrobiłem coś takiego.

    Kod: c
    Zaloguj się, aby zobaczyć kod
    Wpisałem jakieś wartości. Więc wnioskuje że przerwanie nie działa.

    Dodano po 14 [sekundy]:

    O to efekt.

    0
  • Pomocny post
    #22 01 Cze 2015 17:01
    slx
    Poziom 18  

    Cytat:
    // ================= PROCEDURA OBSŁUGI PRZERWANIA COMPARE MATCH
    ISR(TIMER0_OVF_vect )
    Błąd. To jest przerwanie od przepełnienia licznika.

    Przerwanie od porównania to: TIMER0_COMP_vect.

    Moderowany przez dondu:

    W nagrodę Pomógł od mniej spostrzegawczych użytkowników i moderatorów :)



    A co do tranzystorów, to oczywiście lepsze by były PNP, ale z NPN też będzie działać (trochę większy spadek napięcia - nie wejdą w nasycenie)

    1
  • #23 01 Cze 2015 19:16
    matiu6565
    Poziom 10  

    Ok. Działa. Wielkie dzięki. :-D Jestem krok dalej.

    0