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.

Poczatkujacy mrugajace diody jak napisac program ?

rakso1313 05 Lut 2012 02:18 2440 29
  • #1 05 Lut 2012 02:18
    rakso1313
    Poziom 13  

    Witam jestem w trakcie robienia co piszą na tej stronie http://hobby.abxyz.bplaced.net/index.php?pid=4&aid=2 i nadszedł czas aby sprobowac napisać własny program jeszcze nie wiem wszystkiego ale chciałem się dowiedzieć jak zrobić aby 8 diod zapały się jedna po drugiej a ta za nią gasła ?
    Tylko jednego nie wiem jak zrobić takie coś jak autor ze 0x55 = binarnie 0101 0101 skąd on wziął to 0x55 ? Moj program binarnie wyglądał by tak ale w jezyku C jak to będzie wyglądać ? Używam usbasp a układ to Atmega 16

    1000 0000
    0100 0000
    0010 0000
    0000 1000
    0000 0100
    0000 0010
    0000 0001


    Oryginalny kod

    Code:
    /* przyklad 2.1 "leds.c" */
    
    /* 8 diod LED przlaczonych do portu D */
    /* ATmega 1MHz */

    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>

    int main(void)
    {   
       /* Wszystkie linie portu D beda wyjsciami */
       DDRD = 0xFF;  /* 0xFF binarnie 1111 1111 */

       /* Poczatek nieskonczonej petli */
       while(1)
       {
          PORTD = 0xaa;    /* 0xaa binarnie 1010 1010 */
          /* opóznienie 0.33 sek. */
          _delay_ms(330);
           PORTD = 0x55;    /* 0x55 binarnie 0101 0101 */
          /* opóznienie 0.33 sek. */
          _delay_ms(330);
       }
    }

    0 29
  • #3 05 Lut 2012 09:48
    rakso1313
    Poziom 13  

    Juz poprawione.

    0
  • #4 05 Lut 2012 10:12
    excray
    Poziom 39  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 05 Lut 2012 10:46
    rakso1313
    Poziom 13  

    Ten kod co podałeś nie działa a mogl by mi ktos powiedziec jak albo zrobic taki kod:

    1000 0000
    _delay_ms(330);
    0100 0000
    _delay_ms(330);
    0010 0000
    _delay_ms(330);
    0000 1000
    _delay_ms(330);
    0000 0100
    _delay_ms(330);
    0000 0010
    _delay_ms(330);
    0000 0001

    0
  • #6 05 Lut 2012 11:01
    excray
    Poziom 39  

    rakso1313 napisał:
    Ten kod co podałeś nie działa a mogl by mi ktos powiedziec jak albo zrobic taki kod:

    Sprecyzuj. Jaki kod błędu dostałeś. Bo u mnie i u 99,999% pozostałych użytkowników działa bezbłędnie.

    0
  • #7 05 Lut 2012 11:09
    rakso1313
    Poziom 13  

    Juz mam zadziałało :)Czyli tylko wystarczy dać 0bkod binarny?

    0
  • #8 05 Lut 2012 11:09
    excray
    Poziom 39  

    tak

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #9 05 Lut 2012 11:23
    rakso1313
    Poziom 13  

    A jak zrobić kod żebym miał cztery rożne efekty pod czterema przyciskami ?

    http://hobby.abxyz.bplaced.net/img/art002_schemat2.png
    Ja nie dawałem buzera :)

    Jeden efekt:

    Code:
    #define F_CPU 1000000L
    
    #include <avr/io.h>
    #include <util/delay.h>


    int main(void)
    {   
       DDRD = 0b11111111;
     
       while(1)
       {
          PORTD = 0b10000000; 
          _delay_ms(250);
           PORTD = 0b01000000;   
          _delay_ms(250);
       
       PORTD = 0b00100000; 
          _delay_ms(250);
           PORTD = 0b00010000;   
          _delay_ms(250);
       PORTD = 0b00001000; 
          _delay_ms(250);
           PORTD = 0b00000100;   
          _delay_ms(250);
       
       PORTD = 0b00000010; 
          _delay_ms(250);
           PORTD = 0b00000001;   
          _delay_ms(250);
       
             PORTD = 0b00000010; 
          _delay_ms(250);
           PORTD = 0b00000100;   
          _delay_ms(250);
       
       PORTD = 0b00001000; 
          _delay_ms(250);
           PORTD = 0b00010000;   
          _delay_ms(250);
       PORTD = 0b00100000; 
          _delay_ms(250);
           PORTD = 0b01000000;   
          _delay_ms(250);
       PORTD = 0b10000000;   
          _delay_ms(250);

       
       
       }
    }





    Na czym polega zapis szesnastkowy?

    0
  • #10 05 Lut 2012 11:43
    analfabet
    Poziom 12  

    excray napisał:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Na pewno te wartości są dobre? (EDIT- chyba, że podawałeś przykłady zapisu- jeżeli tak to nie załapałem od razu).


    Zapis szesnastkowy- w zapisie binarnym grupujesz liczby po 4, a następnie dla tych czwórek wyliczasz wartość w szesnastkowym (od 1 do F).

    np. 0010 1100
    0010- 2
    1100- C
    00101100 (bin)=2C(hex)

    0
  • #11 05 Lut 2012 11:52
    rakso1313
    Poziom 13  

    Z zapisem szesnastkowy na razie dam sobie spokój:)
    A co do rożnych efektów pod czterema przyciskami jak to zrobić poniżej zrobiłem parę efektów na szybko:

    EFEKT 1

    Code:
    #define F_CPU 1000000L
    
    #include <avr/io.h>
    #include <util/delay.h>


    int main(void)
    {   
       DDRD = 0b11111111;
     
       while(1)
       {

           PORTD = 0b00000000;   
          _delay_ms(200);
          PORTD = 0b10000001;   
          _delay_ms(200);
          PORTD = 0b11000011; 
          _delay_ms(200);
           PORTD = 0b11100111;   
          _delay_ms(200);
          PORTD = 0b11111111; 
          _delay_ms(200);
           PORTD = 0b11100111;   
          _delay_ms(200);
           PORTD = 0b11000011; 
          _delay_ms(200);
           PORTD = 0b10000001;   
          _delay_ms(200);   
           PORTD = 0b00000000;   
          _delay_ms(200);
       
       }   
    }



    EFEKT 2
    Code:

    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>


    int main(void)
    {   
       DDRD = 0b11111111;
     
       while(1)
       {
          PORTD = 0b11110000; 
          _delay_ms(250);
           PORTD = 0b00001111;   
          _delay_ms(250);
       }   
    }



    EFEKT 3

    Code:
    #define F_CPU 1000000L
    
    #include <avr/io.h>
    #include <util/delay.h>


    int main(void)
    {   
       DDRD = 0b11111111;
     
       while(1)
       {
           PORTD = 0b10000000; 
          _delay_ms(250);
           PORTD = 0b01000000;   
          _delay_ms(250);
       
          PORTD = 0b00100000; 




          _delay_ms(250);
           PORTD = 0b00010000;   
          _delay_ms(250);
          PORTD = 0b00001000; 
          _delay_ms(250);
           PORTD = 0b00000100;   
          _delay_ms(250);
       
          PORTD = 0b00000010; 
          _delay_ms(250);
           PORTD = 0b00000001;   
          _delay_ms(250);
       
           PORTD = 0b00000010; 
          _delay_ms(250);
           PORTD = 0b00000100;   
          _delay_ms(250);
       
          PORTD = 0b00001000; 
          _delay_ms(250);
           PORTD = 0b00010000;   
          _delay_ms(250);
          PORTD = 0b00100000; 
          _delay_ms(250);
           PORTD = 0b01000000;   
          _delay_ms(250);
           PORTD = 0b10000000;   
          _delay_ms(250);

       
       
       }
    }




    EFEKT 4
    Code:

    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>


    int main(void)
    {   
       DDRD = 0b11111111;
     
       while(1)
       {

           PORTD = 0b10101010;   
          _delay_ms(200);
          PORTD = 0b01010101;   
          _delay_ms(200);
          
       }   
    }

    0
  • Pomocny post
    #12 08 Lut 2012 01:45
    bercikmk
    Poziom 16  

    Witam. Co do zapisu szesnastkowego to nie jest taki straszny. Może to Ci troszkę przybliży ten zapis. Liczysz od prawej do lewej.
    0000 0000 odpowiada 0x00
    0000 0001 odpowiada 0x01
    0000 0010 odpowiada 0x02
    0000 0011 odpowiada 0x03
    0000 0100 odpowiada 0x04
    0000 0101 odpowiada 0x05
    0000 0110 odpowiada 0x06
    0000 0111 odpowiada 0x07
    0000 1000 odpowiada 0x08
    0000 1001 odpowiada 0x09
    0000 1010 odpowiada 0x0a
    0000 1011 odpowiada 0x0b
    0000 1100 odpowiada 0x0c
    0000 1101 odpowiada 0x0d
    0000 1110 odpowiada 0x0e
    0000 1111 odpowiada 0x0f
    przykład
    0b0010 0110 = 0x26
    dlaczego tak, ano dlatego, że w czterech znakach xxxx licząc od prawej zawarto wartości 8421 z tych 4 liczb jesteś w stanie zliczyć od 0 do 15 czyli 0000= 0, 1111=15 i tak jeżeli chcesz użyć 1 to piszesz 0001 czyli xxx1, jeżeli 2 0010 czyli xx2x, jeżeli 3 0011 czyli xx21, jeżli 13 1101 czyli 84x1.

    1
  • #13 08 Lut 2012 01:48
    rakso1313
    Poziom 13  

    Dzieki za odpowiedz to mi bardzo pomogło :)

    0
  • #14 08 Lut 2012 10:05
    gaskoin
    Poziom 38  

    Wszystkie systemy liczy się tak samo, nawet nasz "naturalny" dziesiętny.

    masz zapisaną liczbę w systemie dziesiętnym to jedziesz od prawej do lewej:

    1234 = 4*10^0 + 3*10^1 + 2*10^2 + 1*10^3

    W binarnym (dwójkowym):

    1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3

    W szesnastkowym (liczby od 0-9 są zapisane normalnie, liczby 10,11,12,13,14,15 to odpowiednio a, b, c, d, e, f) :

    f30a = 10*16^0 + 0*16^1 + 3*16^2 + 15*16^3

    i tak dalej, systemów może być niskończoność. Ostatnio tu na forum ktoś wrzucił kod w systemie siedemnastkowym :D

    0
  • #15 08 Lut 2012 14:19
    kamil1cos7
    Poziom 14  

    Jak rozumiesz efekty pod różnymi przyciskami?? Chcesz żeby po wciśnięciu przycisku diody innaczej migały czy jeszcze coś innaczej??

    0
  • #16 08 Lut 2012 18:19
    rakso1313
    Poziom 13  

    Jak efekty pod rożnymi przyciskami?
    Chodzi o to ze jak nacisnę przycisk jeden to efekt jeden się włącza co oznacza ze diody np. mrugają potem jak nacisnę przycisk dwa to efekt dwa się włącza co oznacza np. ze diody zaczynają się włączać jedna po kolei i wyłączać i tak dalej.

    0
  • #17 09 Lut 2012 10:35
    kamil1cos7
    Poziom 14  

    Najprościej było by gdybyś zrobił np w ten sposób:

    Code:

    while(!(PINC&(1<<PC1))){
    // 'efekt_1'
    }
    while(!(PINC&(1<<PC2))){
    //'efekt_2'
    } //itd

    Tylko musisz te piny na których są przyciski (tutaj PC1 i PC2) podciągnąć przez wewnętrzny(lub zewnętrzny) rezystor do zasilania i wtedy przyciskiem zwierając pin do masy będziesz wchodził w poszczególne pętle. Oczywiście musisz odpowiednio ustawić rejestr DDR. Jeszcze przydała by się jakaś funkcja eliminująca drgania styków.

    0
  • #18 09 Lut 2012 12:40
    dondu
    Moderator Mikrokontrolery Projektowanie

    kamil1cos7 napisał:
    Jeszcze przydała by się jakaś funkcja eliminująca drgania styków.

    Przy takim algorytmie jak autor chce mieć oraz zastosowanych delay-ach, a także zaproponowanym przez Ciebie sposobie wykrywania naciśnięcia przycisku, nie będzie potrzeby eliminacji drgań styków.

    0
  • #19 09 Lut 2012 13:09
    kamil1cos7
    Poziom 14  

    @dondu
    Ale chyba dobrze żeby wiedział że takie coś istnieje i jak tego od początku unikać.

    0
  • #20 09 Lut 2012 13:13
    dondu
    Moderator Mikrokontrolery Projektowanie

    kamil1cos7 napisał:
    @dondu
    Ale chyba dobrze żeby wiedział że takie coś istnieje i jak tego od początku unikać.

    Oczywiście nie neguję tego, ale napisałeś, że "przydałaby się", a akurat tutaj jest niepotrzebna.
    Generalna zasada: "Programy należy kompilować, a nie komplikować."

    0
  • #21 09 Lut 2012 14:04
    kamil1cos7
    Poziom 14  

    @dondu
    Oooooo, jaki 'wyszukany' cytat, wydaje mi się że gdzieś go już widziałem:P
    Nie każdy skompilowany program działa tak jak powinien:P Drgania styków są tego chyba najlepszym przykładem:P A czy funkcja zajmująca kilka linijek tekstu aż tak komplikuje... To już subiektywna opinia...
    Pozdrawiam:)

    0
  • #22 09 Lut 2012 14:06
    dondu
    Moderator Mikrokontrolery Projektowanie

    kamil1cos7 napisał:
    A czy funkcja zajmująca kilka linijek tekstu aż tak komplikuje... To już subiektywna opinia...
    Pozdrawiam:)

    ... ale w tym przypadku całkowicie zbędna.
    Również pozdrawiam :)

    0
  • #23 09 Lut 2012 15:21
    daniel6662
    Poziom 20  

    Panowie, wy tu rozmawiacie o drganiach styków a nikt z was nie zauważył że przykład podany przez kamil1cos7 jest trochę nie praktyczny. Ponieważ dany efekt będzie mrugał tylko wtedy gdy przycisk jest wciśnięty, po zwolnieniu przycisku sekwencja dojdzie do końca i diody zgasną czekając na wciśnięcie któregoś przycisku, a to trochę nie praktyczne rozwiązanie:) Więc zamiast dyskutować nad potrzebą eliminacji drgań wymyślcie jakiś bardziej praktyczny algorytm do przełączania sekwencji:)
    Ja również pozdrawiam :-D

    0
  • #24 09 Lut 2012 15:43
    dondu
    Moderator Mikrokontrolery Projektowanie

    daniel6662 napisał:
    ... a nikt z was nie zauważył że przykład podany przez kamil1cos7 jest trochę nie praktyczny. Ponieważ dany efekt będzie mrugał tylko wtedy gdy przycisk jest wciśnięty, po zwolnieniu przycisku sekwencja dojdzie do końca i diody zgasną czekając na wciśnięcie któregoś przycisku, a to trochę nie praktyczne rozwiązanie:)

    Może nie tyle co niepraktyczne, ale zależy od tego co chce osiągnąć autor tematu. Ponieważ określił się tak:

    rakso1313 napisał:
    Chodzi o to ze jak nacisnę przycisk jeden to efekt jeden się włącza co oznacza ze diody np. mrugają potem jak nacisnę przycisk dwa to efekt dwa się włącza co oznacza np. ze diody zaczynają się włączać jedna po kolei i wyłączać i tak dalej.

    to prawdopodobnie słusznie zauważyłeś, że rozwiązanie zaproponowane przez kamil1cos7 nie spełnia tego, co chce osiągnąć autor (choć tekst autora można zrozumieć dwojako).

    A jak to zrobić? Jak zwykle co najmniej kilka sposobów.
    Najprostszy to zastosowanie zmiennej, która będzie inkrementowana za każdym naciśnięciem przycisku + warunek, który będzie włączał odpowiedni efekt po skończeniu odtwarzania poprzedniego.

    Ale tu pojawi się następny problem - przycisk trzeba będzie trzymać na końcu sekwencji efektu, bo dopiero po jej zakończeniu sprawdzany będzie stan przycisku. Eliminacja drgań nadal nie będzie wymagana. Czy takie rozwiązanie satysfakcjonuje autora, nie wiemy?

    Innymi słowy, autor musi dokładnie opisać, co chce osiągnąć.

    0
  • #25 09 Lut 2012 16:00
    daniel6662
    Poziom 20  

    Według mnie autor opisał jasno co chce osiągnąć, mianowicie po przyciśnięciu przycisku włącza się któraś sekwencja, a po przyciśnięciu innego przycisku program "przełącza się" na obsługę innej sekwencji. Kolega nic nie pisał o przytrzymaniu przycisku więc najbardziej prawdopodobną opcją jest że chodziło mu o zwykłe "kliknięcie"(jeżeli się mylę niech autor mnie poprawi:)).
    Zgadzam się z Tobą dondu że można zrobić to na kilka całkiem różnych sposobów, aczkolwiek poszedł bym w kierunku przerwań. Mianowicie żeby jak najmniej zmieniać w efektach które kolega ma już napisane, dałbym 4 warunki w main do "wyzwalania" efektów a w przerwaniu od któregoś timera sprawdzanie który przycisk jest wciśnięty. Rozwiązanie proste i optymalne pod względem praktycznym a przy okazji można się nauczyć obsługi przerwań:)

    0
  • #26 09 Lut 2012 16:05
    kamil1cos7
    Poziom 14  

    Dlatego napisałem że najprościej...
    "Ale tu pojawi się następny problem - przycisk trzeba będzie trzymać na końcu sekwencji efektu, bo dopiero po jej zakończeniu sprawdzany będzie stan przycisku." - możemy stan przycisku sprawdzać częściej i przerywać dany efekt który będzie w pętli, instrukcją break. A resztę proponuje podobnie jak autor powyższego postu, czyli dodatkowa zmienna itd.

    0
  • #27 09 Lut 2012 16:10
    dondu
    Moderator Mikrokontrolery Projektowanie

    Jak już pisałem, wypowiedź autora można zrozumieć dwojako, dlatego chciałbym, aby dokładnie określił co chce osiągnąć. Tym bardziej, że za chwilę okaże się, że oprócz tego zadania uC ma robić jeszcze coś innego i będzie trzeba zmieniać opracowane rozwiązanie.

    0
  • #28 09 Lut 2012 17:11
    rakso1313
    Poziom 13  

    Hehe na chwilkę mnie nie było a tu temat się rozciągnął :)

    Ogólnie o co mi chodzi przyciskam przycisk efekt się włącza odchodzę wracam naciskam przycisk 2 drugi efekt się włącza i odchodzę itd.
    Cos takiego jak lampki choinkowe :)

    0
  • #29 09 Lut 2012 17:26
    kamil1cos7
    Poziom 14  

    Nie miałeś jeszcze do czynienia z przerwaniami?

    0
  • #30 09 Lut 2012 17:31
    rakso1313
    Poziom 13  

    Jak powiedziałem ja dopiero zaczynam :D
    I jak ktoś będzie mówił ze kup sobie książkę to kupiłem ale czekam na dostawę :D
    Książka od atnel

    0