Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 24 kwi 2024, o 04:00


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 8 sie 2017, o 11:17 
Offline
Nowy

Dołączył(a): 08 sie 2017
Posty: 3
Pomógł: 0

Witam wszystkich, od niedawna zacząłem zabawę z mikro kontrolerami Atmegi (dokładnie Atmega8A-PU).
Chciałem napisać kod który powoduje że po wciśnięciu switcha dioda zaczyna migać 10 razy po czym gaśnie i tak w kółko.
O to on:
Kod:
#include <avr/io.h>
#include <util/delay.h>

#define LED_PIN (1<<PB0)               
#define LED_TOG PORTB ^= LED_PIN         

#define SWITCH_PIN (1<<PB1)               
#define SWITCH_ON !(PINB & SWITCH_PIN)      

uint8_t i;                           

int main(void)
{
   
  DDRB |= LED_PIN;                     
  PORTB |= LED_PIN;                     
 
  DDRB &= ~SWITCH_PIN;                  
  PORTB |= SWITCH_PIN;                  
 
    while (1)
    {
      if (SWITCH_ON)                  
      {
         _delay_ms(50);               
         if(SWITCH_ON)               
         {
            for (i=0; i<20; i++)      
            {
               LED_TOG;            
               _delay_ms(500);         
            }
         }
      }
                     
    }
}


Taki kod wgrałem żeby sprawdzić czy dioda będzie świecić za pierwszym razem, ku mojemu zdziwieniu za każdym następnym naciśnięciem switcha dioda znowu wykonuje cykl świecenia. Myślałem że będę musiał napisać kolejną linię kodu który powoduje wyzerowanie uint_t8 i.

Może ktoś wytłumaczyć mi dlaczego tak się dzieje? Albo czy ja coś źle rozumuję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sie 2017, o 11:26 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 544
Pomógł: 27

Cytuj:
for (i=0; i<20; i++)

Nie wiem jaki jest zamysł ale wydaje mi się że tu masz babola.
a powinno być tak;
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sie 2017, o 11:28 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1080
Pomógł: 73

tonygryps napisał(a):
Cytuj:
for (i=0; i<20; i++)

Nie wiem jaki jest zamysł ale wydaje mi się że tu masz babola.
a powinno być tak;
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Nic podobnego



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sie 2017, o 11:34 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27225
Lokalizacja: Szczecin
Pomógł: 1041

kubSON17 napisał(a):
Chciałem napisać kod który powoduje że po wciśnięciu switcha dioda zaczyna migać 10 razy po czym gaśnie i tak w kółko.


kubSON17 napisał(a):
ku mojemu zdziwieniu za każdym następnym naciśnięciem switcha dioda znowu wykonuje cykl świecenia.


No to albo się kolega zdecyduje co to znaczy "w kółko" ;) albo precyzyjniej opisz co chciałeś uzyskać ... bo przecież z tego co opisałeś w tych dwóch zdaniach to masz swoje "w kółko" ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sie 2017, o 11:35 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1080
Pomógł: 73

kubSON17 napisał(a):

Może ktoś wytłumaczyć mi dlaczego tak się dzieje? Albo czy ja coś źle rozumuję.


Jak masz podłączona diodę do mikrokontrolera? anodą czy katodą?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sie 2017, o 11:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Hmm.
Jezeli dobrze rozumiem pytanie, to nie musisz zerować " i " ,
ponieważ kiedy program wchodzi w pętlę for to z marszu zaczyna od " i=0 ".
Pozdrawiam

------------------------ [ Dodano po: 4 minutach ]

Dla ścisłości dodam : za każdym obiegiem pętli. Nie tylko pierwszym.

------------------------ [ Dodano po: 8 minutach ]

Jeszcze ważna informacja.
Edytuj post i wklej kod w " syntaks C ".



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sie 2017, o 11:57 
Offline
Nowy

Dołączył(a): 08 sie 2017
Posty: 3
Pomógł: 0

Faktycznie napisałem to mało zrozumiale. Dobrze zauważył Daro69, NIE MUSZĘ ZEROWAĆ uint8_t i. Na początku programu i=0 ale po zakończniu pętli for powinna mieć wartość i=20 więc kolejne naciśnięcie switcha nie powinno spowodować załączenie funkcji for (ja tak to rozumuję).
Wygląda na to że po zakończeniu pętli for uint8_t się zeruje i jest możliwe uruchomienie pętli.
Program działa poprawnie i tak jak chciałem, ale myślałem że po zakończeniu pętli for czyli po 10 mignięciach diody LED będę musiał napisać linię kodu który spowoduje wyzerowanie uint8_t.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sie 2017, o 12:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Dla przykładu:
Jak się zachowa " i ".
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

? :)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sie 2017, o 12:14 
Offline
Użytkownik

Dołączył(a): 10 lip 2015
Posty: 334
Pomógł: 32

Gdybyś zapisał to tak jak pokazuję poniżej, to pętla for by się już za drugim razem nie wykonała.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


W przeciwnym wypadku kod dochodzi do pętli for i ją wykonuje. Zauważ co jest wykonywane przy wejściu w tą pętlę: "for (i=0; i<20; i++) " Jak widać na samym początku zmienna globalna "i" jest zerowana.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sie 2017, o 10:12 
Offline
Nowy

Dołączył(a): 08 sie 2017
Posty: 3
Pomógł: 0

Dzięki bardzo za wytłumaczenie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO