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

Poczatkujacy mrugajace diody jak napisac program ?

rakso1313 05 Lut 2012 02:18 2788 29
REKLAMA
  • #1 10496986
    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

    /* 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);
       }
    }
  • REKLAMA
  • REKLAMA
  • #3 10497305
    rakso1313
    Poziom 13  
    Juz poprawione.
  • #4 10497381
    excray
    Poziom 41  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 10497521
    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
  • #6 10497605
    excray
    Poziom 41  
    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.
  • #7 10497661
    rakso1313
    Poziom 13  
    Juz mam zadziałało :)Czyli tylko wystarczy dać 0bkod binarny?
  • #8 10497665
    excray
    Poziom 41  
    tak
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 10497739
    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:

    #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?
  • #10 10497841
    analfabet
    Poziom 13  
    excray napisał:

    Kod: C / 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)
  • #11 10497879
    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

    #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
    
    #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

    #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
    
    #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);
    	   
       }	
    }
  • Pomocny post
    #12 10512341
    bercikmk
    Poziom 18  
    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.
  • REKLAMA
  • #13 10512343
    rakso1313
    Poziom 13  
    Dzieki za odpowiedz to mi bardzo pomogło :)
  • #14 10512803
    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
  • #15 10513816
    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??
  • #16 10514919
    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.
  • #17 10517749
    kamil1cos7
    Poziom 14  
    Najprościej było by gdybyś zrobił np w ten sposób:
    
    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.
  • #18 10518244
    dondu
    Moderator na urlopie...
    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.
  • #19 10518348
    kamil1cos7
    Poziom 14  
    @dondu
    Ale chyba dobrze żeby wiedział że takie coś istnieje i jak tego od początku unikać.
  • #20 10518362
    dondu
    Moderator na urlopie...
    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ć."
  • #21 10518574
    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:)
  • #23 10518889
    daniel6662
    Poziom 21  
    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
  • #24 10519001
    dondu
    Moderator na urlopie...
    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ąć.
  • REKLAMA
  • #25 10519067
    daniel6662
    Poziom 21  
    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ń:)
  • #26 10519097
    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.
  • #27 10519121
    dondu
    Moderator na urlopie...
    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.
  • #28 10519407
    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 :)
  • #29 10519470
    kamil1cos7
    Poziom 14  
    Nie miałeś jeszcze do czynienia z przerwaniami?
  • #30 10519494
    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
REKLAMA