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

atmega8 i wyświetlacz diodowy problem

cocacola 20 Sie 2009 18:51 2006 8
REKLAMA
  • #1 6914262
    cocacola
    Poziom 2  
    Witam,
    Jestem zupełnie początkującym, stworzyłem mały i prosty układzik oparty na mikrokontrolerze atmega8. Ma on za zadanie obsługę 48 diod. Parametry diod to: 2mA, 1,8V. Problem polega na tym, iż dioda w dolnym prawym rogu (patrz schemat) świeci zdecydowanie ciemniej od pozostałych.

    atmega8 i wyświetlacz diodowy problem

    Mam również drugie pytanie. Czy jeżeli podpinam diodę (+) do portu np. D (stan wysoki), natomiast (-) do portu C (stan niski) to ile wynosi różnica potencjałów między stanami. Na początku zupełnie błędnie założyłem że stan niski ma 0V, a więc różnica wyniesie 4,5-5V( i dla takiego napięcia obliczyłem rezystory 1.5k) jednak stan niski to nie 0V. DLatego też wszystkie diody świecą dość ciemno. Pytanie brzmi ile Voltów mamy na stanie niskim, abym dokładnie dopasował oporniki. Niestety jeszcze nie mam miernika dlatego prosiłbym o pomoc.

    Oto kod programu który ma jedynie zaświecić wszystkie diody.

    #define F_CPU 1000000L
    #include <avr/io.h>
    int main(void)
    {
       DDRD = 255; 
       DDRC = 255; 
    
     
       while(1)
       {
     	PORTD=255;
    	asm volatile("nop; nop;");
    	PORTC=0;
        
       }
    }
  • REKLAMA
  • #2 6914628
    fiskusmati
    Użytkownik obserwowany
    Ja zawsze do diod dawałem 350-470 ohm.
  • REKLAMA
  • #4 6914686
    m.bartczak
    Poziom 16  
    Z tego co widzę masz tam 48 diod, każda pobiera 20mA, czyli potrzebujesz ze swojego układu dostarczyć 960mA!

    Wg. specyfikacji, Atmega8 dostarcza do 300mA.

    I tak wg. mnie działa lepiej niż powinien :)

    Bez tranzystorów się tutaj nie obejdzie.
  • REKLAMA
  • #5 6914700
    Petros
    Poziom 20  
    diaody świecą słabo bo wszytkie ściecą naraz!

    przez opornik płynie prąd 2mA ... ale ten prąd dzieli sie na 6 diód ! czyli masz 0,35 mA na diode.
    Takie wyświetlacze nigdy nie działają na zasadzie "zapal wszystko" tylko są multipleksowane tzn diody szybko migają i nie widać tych "mignięc" powyżej 60Hz

    proponuje najpierw zakupić multimetr i zaczynać przygodę z mikrokontrolerami.
  • #6 6914706
    kulmar
    Poziom 31  
    m.bartczak napisał:
    Z tego co widzę masz tam 48 diod, każda pobiera 20mA, czyli potrzebujesz ze swojego układu dostarczyć 960mA!

    Wg. specyfikacji, Atmega8 dostarcza do 300mA.

    I tak wg. mnie działa lepiej niż powinien :)

    Bez tranzystorów się tutaj nie obejdzie.


    Kolego ! Przecież na początku napisał, że diody pobierają ok 2mA każda (niskoprądowe) i tak ma rzeczywiście policzone rezystory. Więc jednak obędzie się bez tranzystorów. Na razie interesuje mnie niezgodność kodu i schematu.

    Pozdrawiam

    Mariusz
  • REKLAMA
  • #7 6914843
    cocacola
    Poziom 2  
    Tak oczywiście błąd jest na schemacie. Diody podłączone są tak, że na porcie D muszę dać 1 natomiast na porcie C 0. Faktycznie diody świecą naraz, już zmieniam kod.

    Poprostu chciałbym wiedizieć dlaczego ta jedna dioda świeci ciemnie i czy jeżeli obliczam rezystancję dla diod to mam ją liczyć dla 4,5-5V ponieważ tyle daje stan wysoki uC, czy muszę odjąć stan wysoki [V]- stan niski [V] i dla takowego napięcia liczyć rezystancję. Jeżeli tak to czy wie ktoś z was ile VOltów jest na stanie niskim.

    Pozdrawiam
  • #8 6914871
    kulmar
    Poziom 31  
    Przy prądzie pojedynczej diody rzędu 2mA (a tak masz dobrane rezystory) możesz przyjąć, że wyjście portu w stanie niskim to 0V.
    Ale bez poprawnego schematu i pokazaniu RZECZYWISTEGO kodu, którym testujesz ten układ nikt nie będzie zgadywał, dlaczego ta jedna dioda swieci inaczej.

    Pozdrawiam

    Mariusz
  • #9 6914876
    m.bartczak
    Poziom 16  
    Rzeczywiście, nie doczytałem specyfikacji LED'ów - wziąłem pod uwagę standardowe.

    Może warto w takim razie spróbować z kodem, np: (powinno to wyświetlać kolejno 6 linii wg, danych w tablicy 'data'

    
    #include <avr/io.h>
    #include <util/delay.h>
    
    #define LINES 6
    
    unsigned char data[6] = { 255,255,255,255,255,255};
    
    int main(void)
    {
    	DDRC = 0xff; // Sources
    	DDRB = 0xff; // Sinks
    
    	while(1)
    	{
    		// Iterate through lines	
    		for(int l = 0; l < LINES ; l++)
    		{
    			PORTB = 0xFF; // Turn off all leds
    			PORTC = 1<<l; // Source the line;
    			PORTB = ~(data[l]); // Sink the data
    			//_delay_ms(3); // 3*6 = 18ms refresh ~50/sec
    		}
    	}
    }
    


    Ten kod powinien teoretycznie nie pozwalać na zapalenie więcej niż jednej diody na rezystor.
REKLAMA