Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Atmega8 problem z migającą diodą.

Gelliam 04 Aug 2009 19:26 2606 12
  • #1
    Gelliam
    Level 13  
    Witam, jestem zupełnym początkującym w elektronice. Pewnie mnie pojedziecie ale mam nadzieje, że pojawią się także odpowiedzi pomagające mi zrozumiec w czym tkwi problem. Stworzyłem następujący układ na płytce uniwersalnej:

    Atmega8 problem z migającą diodą.

    Zastosowałem kod, który znalazłem tu na forum (użyłem gotowego gdyż chciałem przetestowac projekt płytki. Powoduje on iż dioda świeci i gaśnie co 2,5s. Niestety dioda świeci cały czas, ale gdy się wpatrzymy to widać ze świeci cały czas mocniej-jaśniej co 2.5s zmieniając jasność. Roznica jest naprawdę trudna do zauwazenia. Po zmierzeniu miernikiem zauważyłem żę napiecie na nozkach procesora zmienia się co 2.5s od 3,8 do 4,25V. Powiedzcie mi co mogłem zrobić źle. W dokumentacji atmegi8 (datasheets) napisali ze maksymalne natęzenie na VCC procka moze wyniesc 300mA, więc zupełnie w ciemno założyłem ze puszczę tam 200mA. Skoro uC bierze 5V napięcia to wyliczyłem potrzebne R=20Ohm natomiast przed diodą napięcie wynosi 5V więc aby obizyc napiecie zastosowałem opornik 1,5kOhm. Chciałbym aby dioda świeciła i gasła całkowicie a nie zmieniała jasność. Proszę o pomoc . pozdrawiam

    
    /*********************************************
    * vim: set sw=8 ts=8 si :
    * Author: Guido Socher, Copyright: GPL 
    * This program is to test the led connected to
    * PD5. 
    * Chip type           : ATMega8
    * Clock frequency     : 1,000000 MHz
    *********************************************/
    #include </avr/io.h>
    
    #define	F_CPU	1000000	/* czestotliwosc kwarcu */
    #define	CYCLES_PER_US	((F_CPU + 500000)/1000000)
    
    
    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 delay_ms(unsigned int ms)
    {
    	unsigned int i;
    	for(i=0;i<ms;i++)
    	{
    		delay(999);
    	}
    }
    
    int main(void)
    {
    	PORTC = 0;
    	while (1)
    	{
    		/* led on/off, pin=0 */
    		DDRC ^= _BV(PC0);
    		delay_ms(500);
    	}
    	return(0);
    }
    
  • #3
    skalsky5000
    Level 21  
    Wyrzuć te oporniki 10R i baterie 9V i podłącz baterie plaska 4.5V
  • #4
    Gelliam
    Level 13  
    Aa czy Atmega8 nie ma wbudowanego rezonatora? Bateria 4.5V pomoże? Nie dałoby rady zrobić tego n abaterii 9V z odpowiednio dobranymi opornikami?

    EDIT: zauważyłem, że spora ilośc osób daje diodę przed uC. Czy to cokolwiek zmienia?
  • #6
    bdfhjk
    Level 11  
    AtMega wytrzymuje 9V ?

    Ale to chyba chodzi o stabilizacje, więc użyj 7805.
  • #7
    ZbeeGin
    Level 39  
    I znów AVCC nie podłączone. Jedno GND też... No, ręce opadają.
  • #8
    Gelliam
    Level 13  
    Moglibyście mi powiedzieć po co stabilizator oraz po co kondensator na masie. Nie rozumiem również dlaczego wszyscy dają przełączniki na GND. Liczę na "cierpliwe odpowiedzi"
  • #9
    ZbeeGin
    Level 39  
    Generalnie: Bo tak się robi.

    I nie steruje się diodą LED stanem wysokim.

    A za takie coś to powinno się klawiatury rekwirować:
        /* led on/off, pin=0 */ 
          DDRC ^= _BV(PC0);
  • #10
    Gelliam
    Level 13  
    mógłbyś powiedzieć co w tym zapisie jest złe oraz jak sterować diodą za pomocą stanu niskiego (tzn różnice w kodzie)
  • Helpful post
    #11
    Freddie Chopin
    MCUs specialist
    Żeby sterować diodą za pomocą atmegi należy wykonać szereg kroków w odpowiedniej kolejności

    1. poczytać o mikrokontrolerach
    2. poczytać datasheeta od danego mikrokontrolera
    3. zakupić układ, złożyć, podłączyć
    4. napisać program, zaprogramować

    Pominąłeś dwa pierwsze kroki. Nie dziw się, że nikt nie chce ci odpowiedzieć. Po prostu rzeczy o które tutaj pytasz są "oczywiste" - są doskonale wytłumaczone w dokumentacji, kursach programowania, kursach elektroniki, kursach szydełkowania i kursach gotowania na parze. Do tego odpowiedź (tekstem i przykładowym kodem) pojawia sie na tym forum tak często, że ktokolwiek jest tu dłużej nie ma ochoty powtarzać się po raz setny odpowiadając na te same podstawowe pytania.

    Twój zapis jest poprawny... Tyle że jest bezsensowny biorąc pod uwagę to co chcesz zrobić. Więc poczytaj po prostu tego datasheeta - od momentu zadania tego pytania znalazłbyś już odpowiedź ze 4x.

    Przy okazji może dowiedziałbyś się, czy ATmegi pracują na 9V. Jeśli wydaje ci się, że parametr określony jako "Maximum current consumption" oznacza stały pobór prądu zupełnie niezależny od warunków, to zdziwiłbyś się. PRzy prostym kodzie i jednej diodce, twój układ pobiera może z 10mA (albo i mniej), co przy 20R przed zasilaniem daje fantastyczne napięcie 8.8V. Ja bym tego procka wyrzucił już <:

    Dalej idąc - średnio co tydzien, sam osobiście piszę, że podłącza się WSZYSTKIE nóżki zasilania, nawet te przy których pisze AVCC. Gdybyś raczył przeczytać datasheeta to nawet dowiedziałbyś się dlaczego. Nie jestem też jedyną osobą która takie rzeczy pisze na tym forum, więc taka informacja pojawia się "co chwilę". Tak samo jest z tymi "kondensatorami na masie" jak to określiłeś. Racz więc poszukać sobie sam, a nie wymagać od nas odpowiedzi po raz milion pierwszy. To nie szkółka niedzielna, tylko forum. Jak każde forum - i to ma wyszukiwarkę i zestaw przyklejonych tematów. Użyj ich, zamiast marnować czas swój i nasz.

    A na następny raz jak mierzysz napięcie, to może zmierz też napięcie zasilania, wtedy pewnie w ogóle nie zakładałbyś tego wątku teraz.

    4\/3!!
  • #12
    Gelliam
    Level 13  
    Dzięki za mobilizującą odpowiedź. Mógłys mi wyjasnic chociaż na chłopski rozum co dają kondensatory na masach? Wiem, ze magazynuja energie ale co dzieki nim zyskujemy akurat w tym przypadku?
    Pozdrawiam ;}
  • #13
    Freddie Chopin
    MCUs specialist
    Źródłem jest zasada działania układów cyfrowych -MOS. Układy takie przy przełączaniu pobierają relatywnie duży prąd, więc na liniach zasilania takich układów panuje całkiem niezły chaos przy ich pracy. Duży kondensator w układzie zaspokaja zapotrzebowanie układów na duże impulsy prądu. Małe kondensatorki tuż przy nóżkach zasilania blokują "wychodzące" z układu zakłócenia, dzięki czemu inne układy nie są zakłócane - w skrócie "zwierają" one wysokoczęstotliwościowe zakłócenia do masy.

    4\/3!!