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.

Atmega8 problem z migającą diodą.

Gelliam 04 Sie 2009 19:26 2417 12
  • #1 04 Sie 2009 19:26
    Gelliam
    Poziom 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

    Code:

    /*********************************************
    * 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);
    }

    0 12
  • #2 04 Sie 2009 19:42
    blue_17
    Poziom 32  

    Nie masz podłączonego kwarcu i wstaw stabilizator 7805 :)

    0
  • #3 04 Sie 2009 19:43
    skalsky5000
    Poziom 20  

    Wyrzuć te oporniki 10R i baterie 9V i podłącz baterie plaska 4.5V

    0
  • #4 04 Sie 2009 19:46
    Gelliam
    Poziom 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?

    0
  • #6 04 Sie 2009 19:58
    bdfhjk
    Poziom 11  

    AtMega wytrzymuje 9V ?

    Ale to chyba chodzi o stabilizacje, więc użyj 7805.

    0
  • #7 04 Sie 2009 20:02
    ZbeeGin
    Poziom 38  

    I znów AVCC nie podłączone. Jedno GND też... No, ręce opadają.

    0
  • #8 04 Sie 2009 20:20
    Gelliam
    Poziom 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"

    0
  • #9 04 Sie 2009 21:50
    ZbeeGin
    Poziom 38  

    Generalnie: Bo tak się robi.

    I nie steruje się diodą LED stanem wysokim.

    A za takie coś to powinno się klawiatury rekwirować:

    Code:
        /* led on/off, pin=0 */ 
    
          DDRC ^= _BV(PC0);

    0
  • #10 05 Sie 2009 16:26
    Gelliam
    Poziom 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)

    0
  • Pomocny post
    #11 05 Sie 2009 17:03
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Ż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!!

    0
  • #12 06 Sie 2009 09:10
    Gelliam
    Poziom 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 ;}

    0
  • #13 06 Sie 2009 09:13
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Ź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!!

    0