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

[Atmega16][C]Wyświetlacz LED, multipleksowanie nie do końca działa

nsmarcin 31 Lip 2011 13:38 2993 14
REKLAMA
  • #1 9778067
    nsmarcin
    Poziom 12  
    Witam, napisałem sobie pewien kod bo chciałem spróbować sterować dwoma wyświetlaczami LED przy pomocy multipleksowania. Niby działa ale nie do końca tak jak powinno, chodzi o to, że na załączonym obrazku w miejscu cyfry 2 widać, że wyświetla się ona jasno, tak jak powinna ale wyświetla się razem z cyfrą 6 (jest ona ciemniejsza), która powinna być tylko na wyświetlaczu drugim. Na drugim wyświetlaczu wszystko jest ok. Dobrałem liczbę 26 bo ona dokładnie odzwierciedla mój problem.

    Oto obrazek:
    [Atmega16][C]Wyświetlacz LED, multipleksowanie nie do końca działa

    Oto kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 9778085
    tadzik85
    Poziom 38  
    Temat wałkowany. Czas martwy, Po miedzy kolejnymi odświeżeniami wyświetlacz należy całkowicie wyłączyć.
  • REKLAMA
  • #5 9778157
    nsmarcin
    Poziom 12  
    Ten wyświetlacz jest ze wspólną anodą, podpięte są one do PINB0 i PIN1 więc myślałem, że wpisanie PORTB=0x00 po prostu wyłącza wyświetlacze. Do portu A podpięte są odpowiednie katody.

    Dodano po 1 [minuty]:

    Po wpisaniu PORTA=0xff po delay rzeczywiście działa, ale powiedzcie mi dlaczego wyłączenie anod nie daje rezultatu tylko trzeba wyłączyć i anody i katody?
  • #7 9778210
    nsmarcin
    Poziom 12  
    Tak, a między katodami a pinami portuA są rezystory 1kOhm, ale nie o to pytam

    Dodano po 2 [godziny] 56 [minuty]:

    nsvinc niestety nie da się tak zdefiniować tablicy, tzn jej elementami nie mogą być LED_0, LED_1 itd
  • REKLAMA
  • #8 9778882
    LordBlick
    VIP Zasłużony dla elektroda
    No to teraz jeszcze ULN2003 wyjściami na katody przez rezystory i na wspólne anody po tranzystorze PNP [np. BC327](emiter na VCC, kolektor na WA) sterowanym tranzystorem NPN (oczywiście rezystory 4k7 na bazach), który z kolei przez rezystor na bazie dopiero jest łaskawie podłączony do wysterowania z µC. No chyba, że lubisz smażone µC... ;)
  • #9 9778918
    nsmarcin
    Poziom 12  
    użyłem Twojego kodu i pięknie działa, ale jak mogę zrobić tak, żeby liczby się zwiększały od 0 do 99. Mój kod prawie działa ale po każdej pełnej 10 są jakieś dziwne znaki wyświetlane, tzn wyświetla się np 11,12,13,14,15,16,17,18,19 i tutaj jakieś losowe znaki i dopiero 20 i po 29 to samo itd.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #10 9779023
    nsvinc
    Poziom 35  
    No i tak będzie. W tej implementacji dwie cyfry są trzymane w kodzie BCD (Binary Coded Decimal). Więc na bitach 3..0 będziesz miał pierwszą cyfrę (młodszą), a na bitach 7..4 drugą cyfrę (starszą).
    Więc nie można sobie po prostu robić w pętli "liczba++", bo zauważ, że w momencie gdy np. na bitach 3..0 masz "9" i zrobisz jej ++, to zamiast na bity 7..4 wskoczyć jedynka a bity 3..0 się wyzerować, dostaniesz na bitach 3..0 liczbę 0xA (0b1010), ktora nie ma zdefiniowanego zachowania na wyświetlaczu.
    Poza tym liczysz do 0x99, tak jakbyś zupełnie nie wiedział co robisz tylko przepisał na pałę...
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Uzyj funkcji tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Można też tak (znacznie wydajniejszy kod):
    Kod: text
    Zaloguj się, aby zobaczyć kod


    No i nie kreć "liczba" do 0x99 tylko do 99(dec)...

    Niestawiaj średników po #define! Dlatego nie działa ci inicjalizacja tablicy makrami LED_0,LED_1,...
    Poczytaj o preprocesorze C w k&r2, a dowiesz się kiedy średnik w definicji makra ma prawo być, a kiedy nie...
  • REKLAMA
  • #11 9779300
    nsmarcin
    Poziom 12  
    Ten ostatni kod jest genialny, tym bardziej, że można wybrać dowolne cyfry nie tylko 2-cyfrowe
  • #12 9784308
    nsmarcin
    Poziom 12  
    Light-I mógłbyś mi narysować jakiś schemat albo podać link do informacji o takim sposobie podłączenia bo chyba nie do końca rozumiem. Mam z ULN wyjścia dać na katody przez rezystory (mogą być 1k?) a na anody też z ULN czy bezpośrednio z zasilania przez dwa tranzystory(chodzi o układ Darlingtona tak)? Tranzystory PNP BC327, a NPN jakie?
  • #13 9785723
    LordBlick
    VIP Zasłużony dla elektroda
    nsmarcin napisał:
    Mam z ULN wyjścia dać na katody przez rezystory (mogą być 1k?)
    Tak, aczkolwiek przy większej ilości muszą być mniejsze, aby prąd chwilowy kompensował jasność w krótkim czasie świecenia
    nsmarcin napisał:
    a na anody też z ULN
    Nie, bezpośrednio z zasilania przez tranzystor PNP BC327 sterowany dowolnym tranzystorem NPN
    nsmarcin napisał:
    (chodzi o układ Darlingtona tak)?
    Nie
    [Atmega16][C]Wyświetlacz LED, multipleksowanie nie do końca działa
  • #14 9785904
    nsmarcin
    Poziom 12  
    Aaaa to już rozumiem, wielkie dzięki. Ale teraz jak będę chciał zapalić jedną z cyfr to na anody muszę tak jak do tej pory dać "1", a na katody "0" czy ULN coś zmienia i na katody tzn. na port do których jest ULN przyłączony też będę musiał dać "1"?
REKLAMA