Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ATMEGA 8][BASCOM] Tablica informacyjna LED

hiv_sick 20 Dec 2008 10:28 35103 106
  • #61
    lord_dagoth
    Level 25  
    hiv_sick, jakby Cię to interesowało, to cała matryca świeci duuuuużo jaśniej ;) Ustawiłem po prostu czas świecenia każdego wiersza na 40ms, wcześniej miałem go w mikrosekundach. Przy wyższej wartości matryca zaczyna migać, wiec tak jest optymalnie ;)
  • #62
    cikol
    Level 27  
    lord_dagoth wrote:
    hiv_sick, jakby Cię to interesowało, to cała matryca świeci duuuuużo jaśniej ;) Ustawiłem po prostu czas świecenia każdego wiersza na 40ms, wcześniej miałem go w mikrosekundach. Przy wyższej wartości matryca zaczyna migać, wiec tak jest optymalnie ;)


    Zainteresowałem się twoim układem i mam kilka pytań. 40ms na wiersz czyli 20x40ms = 0,8s? troche ponad 1Hz? czy to napewno 40ms?

    Przyglądałem się schematowi... dlaczego podłączyłeś AREF a AVCC i AGND wiszą?

    Dobra, doczytałem już czemu AVCC i AGND wiszą:)
  • #63
    lord_dagoth
    Level 25  
    No tak, te funkcje wyglądają w ten sposób:
    Code:
    #define F_CPU 1000000 //1MHz zegar procesora
    
    #define CYCLES_PER_US ((F_CPU+500000)/1000000) //cpu cycles per microsecond

    Code:
    void delay(unsigned int us) 
    
    {
        unsigned int delay_loops;
        register unsigned int  i;
        delay_loops = (us+3)/5*CYCLES_PER_US;
        for (i=0; i < delay_loops; i++) {};
    }

    void delayms(unsigned int ms)
    {
       unsigned int i;
       for (i=0;i<ms;i++)
       {
            delay(999);
            asm volatile ("WDR"::);
       }
    }

    I w miejscu użycia:
    Code:
    delayms(40);

    Wiem że te funkcje do odliczania czasu są prymitywne i w ogóle, ale narazie nie kombinowałem nic innego, tylko zaczerpnąłem gotowce z tutorialu pana Otulaka (chyba tak miał na nazwisko autor ;) ).
  • #64
    cikol
    Level 27  
    Heh.. Kali nie rozumieć C. Kali programowy analfabeta. Kali programować w asm. :)
  • #65
    lord_dagoth
    Level 25  
    Za jakiś czas zamieszcze filmik, gdzie podam dokładny czas świecenia każdego wiersza. Ale powoli przymierzam się do skonstruowania czegoś na bardziej profesjonalnych układach (co za tym idzie, cena drastycznie wzrasta :( ).
  • #67
    hiv_sick
    Level 22  
    udało mi się dostać dwa UDN2982 oraz jeden ULN2803. wszystko złożyłem, jednak nie potrafie tym sterować. W wierszach mam katody, w kolumnach anody. co mam podać na dane wejścia rejestru 74hct595, a co na ULN2803?
  • #68
    Dr.Vee
    VIP Meritorious for electroda.pl
    Zacznij od czytania datasheetów.
    Nie podłączyłeś wejście G (pin 13) rejestrów '595 - musisz je podłączyć pod GND, inaczej na wyjściach masz cały czas stan wysokiej impedancji.

    Jak to poprawisz, to sterowanie jest proste:
    0) "zerujesz" rejestry (wpisujesz same '1', żeby odciąć anody od zasilania).
    1) wsuwasz jedno '0' do rejestru (SER = '0', impuls na SCK, później impuls na RCK).
    2) wystawiasz dane na linie kolumn (0 = dioda dioda zgaszona, 1 = zapalona)
    3) czekasz ileśtam czasu
    4) jeśli to nie jest ostatnia kolumna, to wsuwasz '1' do rejestru - tak jak w 1) i goto 2). Jeśli to była ostatnia kolumna, to goto 1).

    Pozdrawiam,
    Dr.Vee
  • #69
    hiv_sick
    Level 22  
    napisalem program ktory powinien zapalić pokolei diody w jednym z wierszy.... wyglada on tak:
    Code:
    $regfile = "m8def.dat"
    
    $crystal = 1000000


    Config Portd = Output
    Config Portb = Output
    Dim I As Byte
    Portd = 255

    Ser_ Alias Pinb.3
    Sck Alias Pinb.5
    Rck Alias Pinb.0

    Sck = 1
    Rck = 1
    Ser_ = 1


    Do
    Loop


    Ser_ = 0
    Sck = 1
    Sck = 0
    Rck = 1
    Rck = 0
    Waitms 40
    Ser_ = 1
    Sck = 1
    Sck = 0
    Rck = 1
    Rck = 0
    Waitms 40
    Sck = 1
    Sck = 0
    Rck = 1
    Rck = 0
    Waitms 40
    Sck = 1
    Sck = 0
    Rck = 1
    Rck = 0
    Waitms 40
    Sck = 1
    Sck = 0
    Rck = 1
    Rck = 0
    Waitms 40
    Sck = 1
    Sck = 0
    Rck = 1
    Rck = 0
    Waitms 40

    End


    niestety program nie działa, co jest nie tak?
  • #70
    Dr.Vee
    VIP Meritorious for electroda.pl
    Jeśli już, to ten program zapali wszystkie wiersze w całej matrycy. Chyba nie za bardzo rozumiesz jak to wszystko działa...

    A to przeczytałeś?
    Dr.Vee wrote:
    Nie podłączyłeś wejście G (pin 13) rejestrów '595 - musisz je podłączyć pod GND, inaczej na wyjściach masz cały czas stan wysokiej impedancji.


    Pozdrawiam,
    Dr.Vee
  • #71
    hiv_sick
    Level 22  
    tak, przeczytałem... i podłączyłem pin13 do masy...nie zrozumiałem bo pierwszy raz przerabiam taki temat. pozdrawiam

    Dodano po 5 [godziny] 30 [minuty]:

    nie wiem poddaje sie :( jak mam wyzerować rejestr i jak wpisywac informacje ?
  • #72
    hiv_sick
    Level 22  
    Dr.Vee wrote:
    Jeśli już, to ten program zapali wszystkie wiersze w całej matrycy. Chyba nie za bardzo rozumiesz jak to wszystko działa...

    nie rozumiem prosze o wytlumaczenie tematu. pozdrawiam
  • #73
    lord_dagoth
    Level 25  
    Zacytuje Ci to co kiedyś mi powiedział użytkownik Paweł Es., gdy sam jeszcze nie wiedziałem jak korzystać z '595 ;)
    Paweł Es. wrote:
    Jeżeli wrzucasz pełną sekwencję 20 bitów do rejestru, to możesz sobie odpuścić jego zerowanie i dajesz MR rejestrów=1 na stałe.
    Wyzerować rejestr możesz wysyłając mu sekwencję 20 zer na dzień dobry.

    SH_CP - SHIFT CLOCK PULSE - tym taktujesz (zbocze narastające) rejestr przesuwający

    ST_CP - STORAGE CLOCK PULSE - tym przepisujesz (narastającym zboczem) dane z przesuwającego do rejestru wyjściowego

    Czyli do rejestru doprowadzasz sygnały:

    - DS (14) - dane szeregowe z procesora
    - SH_CP (11) - taktowanie przesuwania danych (podajesz równolegle na wszystkie rejetry wyjściowe)
    - ST_CP (12) - przepisanie wsuniętych danych na wyjście (jak wyżej)

    OE (13) - ustawiasz na stałe 0
    MR (10)- ustawiasz na stałe 1

    Q7 (9) podajesz na DS (14) następnego stopnia

    Jeżeli byłbyś zainteresowany, to mogę opublikować kod poszczególnych funkcji do obsługi wyświetlacza ;)
    Co by innych już nie zmuszać do czytania dokładnie wszystkich poprzednich postów, wprowadziłem wyżej wspomniane zmiany na schemat ;)

    [ATMEGA 8][BASCOM] Tablica informacyjna LED
  • #74
    hiv_sick
    Level 22  
    jasne ze jestem zainteresowany :)
    ten program moim zdaniem powinien zgasić ledy, jednak tego nie robi. moze cos nie tak z moim ukladem?
    Code:
    Config Portd = Output
    
    Config Portb = Output
    Dim I As Byte
    Portd = 255

    Ds Alias Portb.3
    Sh_cp Alias Portb.5
    St_cp Alias Portb.0


    Do
    Loop

    For I = 1 To 8

       Ds = 1
       Sh_cp = 1
       Sh_cp = 0


    Next I

    St_cp = 1
    St_cp = 0

    End
  • #75
    lord_dagoth
    Level 25  
    No więc tak, cały program jest podzielony na 3 pliki:
    -main.c <-główny plik, zawiera funkcję main()
    -functions.h <-plik nagłówkowy
    -functions.c <-plik zawierający definicje wszystkich funkcji, których prototypy znalazły się w poprzednim pliku

    Zaczniemy od pliku functions.h:
    Code:
    #define F_CPU 1000000 //1MHz zegar procesora
    
    #define CYCLES_PER_US ((F_CPU+500000)/1000000) //cpu cycles per microsecond

    void Init();//funkcja ustawia porty i piny na początkowe wartości
    void SetRegister(int x);//funkcja wpisuje do rejestru 0 lub 1
    void ReleaseLatch();//funkcja przepisuje dane wprowadzone do rejestrów na jego wyjścia (zwolnienie zatrzasku)
    void SetUDN(int x);//Ustawia podaną kolumnę (1-20) na aktywną
    void UnsetUDN(int x);//dezaktywuje podaną kolumnę (1-20)
    void delay(unsigned int us);//odczekuje podana ilosc mikrosekund
    void delayms(unsigned int ms);//odczekuje podana ilosc milisekund
    void ClearTheRegister();//funkcja do wyzerowania calego rejestru

    Zbyt wiele nie trzeba tłumaczyć, wszystko jest w komentarzach ;) Co do pliku functions.c to wygląda on tak (okomentowałem wszystko co się dało, co do funkcji SetUDN i UnsetUDN to musisz po prostu poczytać jak działa switch w C :P ):
    Code:
    #include <avr\io.h>
    
    #include "functions.h"

    void Init()
    {
       DDRA = 0xFF; //ustawienie portu A jako wyjścia
       DDRB = 0xFF; //ustawienie portu B jako wyjścia
       DDRC = 0xFF; //ustawienie portu C jako wyjścia
       DDRD = 0xFF; //ustawienie portu D jako wyjścia
       PORTB &=~_BV(1);//Ustawienie pinu PB1 na 0 (enable dla rejestru, active low)
       PORTB &=~_BV(3);//ustawienie 0 dla zegara
       PORTB &=~_BV(2);//ustawienie zera dla pinu odpowiedzialnego za przepisywanie
    }

    void SetRegister(int x)
    {
       if (x==1)
       {
          PORTB |=_BV(0); //podanie jedynki na wejście szeregowe rejestru
          PORTB |=_BV(3); //przesunięcie jedynki (zboczem narastającym)
          PORTB &=~_BV(3); //ustawienie zera (z powrotem)
       }
       else
       {
          PORTB &=~_BV(0); //podanie zera na wejście szeregowe rejestru
          PORTB |=_BV(3); //przesunięcie zera (zboczem narastającym)
          PORTB &=~_BV(3); //ustawienie zera (z powrotem)
       }
    }


    void ReleaseLatch()
    {
       PORTB |=_BV(2); //przepisanie danych na wyjścia '595
       PORTB &=~_BV(2); //ustawienie zera (z powrotem)
    }

    void SetUDN(int x)
    {
       switch (x)
       {
          case 1:  {PORTA |=_BV(0);break;}
          case 2:  {PORTA |=_BV(1);break;}
          case 3:  {PORTA |=_BV(2);break;}
          case 4:  {PORTA |=_BV(3);break;}
          case 5:  {PORTA |=_BV(4);break;}
          case 6:  {PORTA |=_BV(5);break;}
          case 7:  {PORTA |=_BV(6);break;}
          case 8:  {PORTA |=_BV(7);break;}
          case 9:  {PORTC |=_BV(7);break;}
          case 10: {PORTC |=_BV(6);break;}
          case 11: {PORTC |=_BV(5);break;}
          case 12: {PORTC |=_BV(4);break;}
          case 13: {PORTC |=_BV(3);break;}
          case 14: {PORTC |=_BV(2);break;}
          case 15: {PORTC |=_BV(1);break;}
          case 16: {PORTC |=_BV(0);break;}
          case 17: {PORTD |=_BV(7);break;}
          case 18: {PORTD |=_BV(4);break;}
          case 19: {PORTD |=_BV(5);break;}
          case 20: {PORTD |=_BV(6);break;}
       }
    }

    void UnsetUDN(int x)
    {
       switch (x)
       {
          case 1:  {PORTA &=~_BV(0);break;}
          case 2:  {PORTA &=~_BV(1);break;}
          case 3:  {PORTA &=~_BV(2);break;}
          case 4:  {PORTA &=~_BV(3);break;}
          case 5:  {PORTA &=~_BV(4);break;}
          case 6:  {PORTA &=~_BV(5);break;}
          case 7:  {PORTA &=~_BV(6);break;}
          case 8:  {PORTA &=~_BV(7);break;}
          case 9:  {PORTC &=~_BV(7);break;}
          case 10: {PORTC &=~_BV(6);break;}
          case 11: {PORTC &=~_BV(5);break;}
          case 12: {PORTC &=~_BV(4);break;}
          case 13: {PORTC &=~_BV(3);break;}
          case 14: {PORTC &=~_BV(2);break;}
          case 15: {PORTC &=~_BV(1);break;}
          case 16: {PORTC &=~_BV(0);break;}
          case 17: {PORTD &=~_BV(7);break;}
          case 18: {PORTD &=~_BV(4);break;}
          case 19: {PORTD &=~_BV(5);break;}
          case 20: {PORTD &=~_BV(6);break;}
       }
    }

    void delay(unsigned int us)
    {
        unsigned int delay_loops;
        register unsigned int  i;
        delay_loops = (us+3)/5*CYCLES_PER_US;
        for (i=0; i < delay_loops; i++) {};
    }

    void delayms(unsigned int ms)
    {
       unsigned int i;
       for (i=0;i<ms;i++)
       {
            delay(999);
            asm volatile ("WDR"::);
       }
    }

    void ClearTheRegister()
    {
       int i=1;
       for(i;i<21;i++) //wpisanie do rejestru 20 zer
       {
          SetRegister(0);
       }
       ReleaseLatch(); //zwolnienie zatrzasku
    }

    No i jeszcze można dodać funkcje związane z zapalaniem:
    -Każdej diody
    -Każdego wiersza
    -Całej matrycy
    -Funkcję, której podajesz tablicę 20x20 wypełnioną 0 lub 1, a ona ją wyświetla
    U mnie wygląda to mniej więcej tak (tylko funkcja do "przetwarzania" tablicy nie jest jeszcze dopracowana, mam gdzieś przesunięcie jednego wiersza ;) ):
    Code:
    /*funkcje zwiazane z wyswietlaniem roznych rzeczy*/
    
    void LightEachDiode();//funkcja swieci kazda dioda po kolei
    void LightEachLine();//funkcja swieci kazdy wiersz po kolei
    void ZapalCalaMatryce();//funkcja swieci cala matryce
    void ProceedArray(int array[20][20]);//Przetwarza podana tablice do wyswietlenia

    No i reszta:
    Code:
    void LightEachDiode()
    
    {
       int i=1,j=1;
       for(i;i<21;i++) // pierwsza petla for, odpowiedzialna za kazdy wiersz
       {
          j=1;
          SetUDN(i);
          SetRegister(1);
          ReleaseLatch();
          delayms(3000);
          for(j;j<20;j++) //druga petla for, odpowiedzialna za wpisanie do rejestru 20 cyfr
          {
             SetRegister(0); //wpisanie do rejestru 0
             ReleaseLatch(); //zwolnienie zatrzasku rejestru
             delayms(3000); //odczekanie
          }
          UnsetUDN(i);
       }
    }

    void LightEachLine()
    {
       int i=1,j=0;
       for(i;i<21;i++)
       {
          SetUDN(i);
          j=0;
          for(j;j<20;j++)
          {
             SetRegister(1);
          }
          ReleaseLatch();
          delayms(6000);
          UnsetUDN(i);
       }
    }

    void ZapalCalaMatryce()
    {
       int i=1,j=0;
       for(i;i<21;i++)
       {
          SetUDN(i);
          j=0;
          for(j;j<20;j++)
          {
             SetRegister(1);
          }
          ReleaseLatch();
          delayms(40);
          UnsetUDN(i);
       }
    }

    void ProceedArray(int array[20][20])
    {
       int i=0;
       for(i;i<20;i++)
       {
          SetUDN(i+1);
          int j=0;
          for(j;j<20;j++)
          {
             if (array[i][j]==1)
                SetRegister(1);
             else
                SetRegister(0);
          }
          ReleaseLatch();
          delay(2000);
          UnsetUDN(i+1);
       }
    }

    No i prawie bym zapomniał o pliku main.c ;) Za wiele to nie robi, tylko w nieskonczoność świeci każdą diode po kolei.
    Code:
    #include "functions.h"
    
    int main ()
    {
       Init(); //inicjalizujemy wszystkie porty i piny
       ClearTheRegister(); //czyscimy rejestr z poprzednich wartosci
       for(;;) //rozpoczynamy nieskonczona petle
       {
          LightEachDiode();      
       }
       return 0;
    }
  • #76
    hiv_sick
    Level 22  
    dzieki za program LORD_DAGOTH. Nie wiem jak to się stało, ale atmega8 mi padł...tzn mozna go zaprogramować, jednak gdy wgra sie do niego program, nie uruchamia się żadna instrukcja... testowałem to na takim programie:

    Code:

    portd = &B01010101
    rotate portd, left
    waitms 10


    Bity portu D nie są presuwane. jutro kupie nowy uklad i bede dalej testowal :)
  • #77
    BoskiDialer
    Level 34  
    hiv_sick: Nie dziwię się, że nie są przesuwane. Nie masz żadnej pętli.
  • #78
    hiv_sick
    Level 22  
    BoskiDialer wrote:
    hiv_sick: Nie dziwię się, że nie są przesuwane. Nie masz żadnej pętli.


    Juz do tego doszedłem :). Ktoś wcześniej pisał o sterowaniu matrycy poprzez SPI. Jak to ma mniej więcej wyglądać? Rozumiem, że zegarem rejestrów będzie sterować SCK (SPI) np. podzielony przez 128, dane będą wprowadzanie przez MOSI. A co z zatrzaskami? W którym momencie podawać dane na wiersze...Jak to wyliczyć?

    Witam po dłuższej przerwie. Napisałem program który kolejno zapala anody kolumn, jednak nie wiem w jaki sposób i kiedy zapalać wiersze, aby wyświetlać znaki...Do zapalania anod kolumn użyłem przerwania od licznika T0. Z tego co mogę się domyślać to trzeba będzie rozbić każdą kolumnę każdego znaku na liczbę binarną (lub hex, dec itp.).

    Ma ktoś jakiś pomysł jak to napisać??


    Post był raportowany.
    Pisanie postu pod postem.
    Należy używać przycisku ZMIEŃ.
    Scaliłem dwa posty. [hefid]
  • #79
    megaman123
    Level 13  
    Cześć , mam pytanko :

    Układ A6276 jako driver zasila anody prawda ? Jak teraz rozwiązać problem z anodami ? Miałem zamiar połączyć 3 takie drivery natomiast na anody wystawiać PORTem skonfigurowanym jako wyjscie mase.

    Czyli przykładowo 000...............1 jako zasilona ostatnia kolumna w szeregu , natomiast na PORT wystawić 11111110 co odpowiednio mi zewrze pierwsza diodę do masy , prawda ? Jak dobrać wartość prądu ( rezystorem przy driverze ) przy kolumnach 8 diodowych ? Myśląc 80 mA , dzieląc na 8 wychodzi ładne 10 więc teoretycznie nie musiałbym stosować żadnych rezystorów przy nóżkach .

    Pierwszą koncepcją było sterowanie anod nóżkami uC a jakimś rejestrami przesuwnymi zwierać diody do masy .
  • #80
    hiv_sick
    Level 22  
    Ja na twoim miejscu rezystory dałbym na wiersze, ponieważ jak sądze sterujesz kolumnami multipleksowo. Gdybyś ustawił prąd na kolumnie powiedzmy 80mA i zapalił jeden wiersz to dioda by się spaliła. Jak możesz to wrzuć schemat
  • #81
    megaman123
    Level 13  
    Schemat na razie jest na kartce , za nim zacznę klepać chce mieć wszystko pewne co i jak :)

    OK więc jeśli trzymać się pierwszej ideii , to kazda anoda wiersza byłaby połączona przez rezystor do jednego wyprowadzenia uC i wybierany znak byłby tworzony przez negacje ( w sensie jesli nogę od litery A symbolizuje 11111111 , to zapalenie wszystkich diod w kolumnie będzie równoznaczne z wyzerowaniem portu ) .

    Później planem jest "utyć" schemat o parę więcej matryc i może coś z PC'ta sterować , żeby to żywotne było.
  • #82
    hiv_sick
    Level 22  
    Gdy bedziesz chciał zapalić wszystkie wiersze powiedzmy w pierwszej kolumnie będziesz musiał podać na PORT (ten od wierszy) same jedynki (255 - dziesiętnie) i wyzerować kolumnę pierwszą :)
  • #83
    megaman123
    Level 13  
    aff , przepraszam źle napisałem u góry . Oczywiście skoro 0 , to katody diód muszą być zwarte z wyprowadzeniami . Ewentualnie tak jak mówisz , podawać na anody stan wysoki z uC ale jak się teraz to ma do multipleksacji katod ? Rozumiem , że wyprowadzenia z rejestru przesuwnego mają być zwarte z bazami tranzystorów które już będą wtedy zwierały diody do masy.

    Byłem dzisiaj w pobliskim i jedynym sklepie ale niestety A6276 jest u w nim nie do zdobycia - a fajny 16 bitowy rejestr tylko ,że ten układ w przeciwieństwie do rejestrów nie będzie zwierał do masy a do vcc więc wtedy sterowanie pozostaje katodom , zgadza się ? Czy bełkocze ?
  • #84
    hiv_sick
    Level 22  
    Nie lepiej byłoby ci skorzystać z mojego schematu? Jednak wtedy musiałbyś mieć w wierszach katody a w kolumnach anody. W moim schemacie jest rejestr 74595, który jest łatwo dostępny przynajmniej w J.Górze - troche gorzej może być z UDN2981 i ULN2803.
  • #85
    megaman123
    Level 13  
    Bardzo ciekawe , nie powiem ! Mógłbyś mi trochę przejaśnić Twoją koncepcje ? Bezpośrednie wyjście z rejestru przesuwnego jest podane na układ UDN2981 który jak mniemam dostarcza ( tak przynajmniej wyczytałem z DS chociaż mój angielski wymaga wiele do życzenia ) wyższego napięcia ( i jak widzę do 0.5 A prądu ) . A co jest z częścią katod ? Czy drugi układ ma wyprowadzenia OC ? Przepraszam ale nie mam już jak sprawdzić , bo internet w pracy ledwo zipie
  • #86
    hiv_sick
    Level 22  
    UDN 2981/2 to osiem tranzystorów PNP, natomiast ULN2803 to NPN. UDN to źródło prądowe (8-CHANNEL SOURCE DRIVERS). Rezystory za ULN2803 powodują spadek napięcia z 5V do określonej wartości (PRAWO OHMA) - to zależy od diod użytych w matrycy.
  • #87
    megaman123
    Level 13  
    Ok znalazłem jeden rejestr przesuwny którego używacie , wszystko działa a sprawdzając amperomierzem wyciąga 70 mA prądu . Więc teoretycznie dałoby się takim shift register sterować także kolumnami ( za nóżkami umieścić rezystory ograniczające prąd diody ) , racja ? A na dole Twoim sposobem używać shift registerów do sterowanie układem z tranzystorami npn .

    [ EDIT ]

    O rany , nigdy wcześniej nie bawiłem się matrycą 8x8 , ale sądziłem ,że położone równolegle nóżki coś znaczą i jedną granicą są udzielone styki do VCC , natomiast przeciwnie GND a teraz widze że to dość losowe i rozłożenie tego na płytce uniwersalnej będzie śmieszne :)
  • #88
    megaman123
    Level 13  
    Przepraszam za double post.

    Cholera , prace trwają ale kiedy układ z tranzystorami npn kosztuje w granicach 1,5 zł to pnp już w granicach 9 ( suma trzech takich już wychodzi dość spora ) . Tranzystory których użyłeś na początku kosztują 0.2 zł mimo , że płytke utrudniają to koszt wyjdzie mniejszy .

    [ATMEGA 8][BASCOM] Tablica informacyjna LED

    I oczywiście na rysunku brakuje zwarcia dolnych rejestrów do uC. Zastanawiam się jak najlepiej i małym kosztem zoptymalizować taka matryce . Szczególnie w przypadku kiedy bardziej chcialoby sie ja rozszerzyc

    Przepraszam , że w takiej formie ale w miejscu gdzie jestem obecnie mam tylko płytkę uniwersalną , i w zasadzie pusty PC ... nawet żona została w domu ! :)
  • #89
    PiotrPitucha
    Level 33  
    Witam
    Namieszam trochę ale zaglądnij na stronę Maritexu, masz tam masę driverów idealnych do Twojego celu, są 8 i 16 bitowe ze sterowaniem szeregowym i kontrolą prądu, co pozwala wyeliminować rezystory szeregowe, od strony zasilania niezmiennie proponuję mosfety, takie w SOT23 potrafią mieć ponad 1A dopuszczalnego prądu.
    Piotr
  • #90
    megaman123
    Level 13  
    Dzięki Piotrze za zaangażowanie ! Świetnych propozycji nigdy za wiele !

    Te drivery o których mówisz , mają być zwarte z anodami prawda ?

    16-kanałowy LED driver, 5-90mA/5V - przykładowy sterownik który ładnie przełączałby kolumny natomiast zwieranie do masy byłoby na wierszach poprzez załączanie / wylaczanie tranzystorów.

    Pytanie jest jedno . Skoro brak rezystorów , to jak najlepiej wysterować prąd wypływający z cmos'a ? Ustawiając ok 90 mA i włączając jedną diodę automatycznie ja tracimy prawda ?