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



Teraz jest 8 kwi 2026, o 11:58


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 4 sty 2017, o 21:01 
Offline
Nowy

Dołączył(a): 10 gru 2016
Posty: 3
Pomógł: 0

Witam, jestem początkujący w kwestii programowania.
Napisałem program który ma , po wciśnięciu przycisku zmieniać diodę. Wciskam świeci czerwona, wciskam znowu świeci żółta ,wciskam trzeci raz to świeci zielona.
Będę chciał rozbudować ten program żeby zamiast zaświecających się diod zmieniały sie efekty świecenia (coś takiego jak w lampkach choinkowych).

Wiem ,że problem jest w miejscu kiedy wcisnę przycisk to wartość zmienia się na '1' i tam zostaje,zamiast przechodzić dalej . Nie wiem tylko jak się uporać żeby między "else if"
były jakieś funkcje sprawdzające czy funkcja 'opcja' się nie zmieniła.

Z góry dziękuje za pomoc.


Kod:
#include <avr/io.h>
#include <util/delay.h>

int opcja; //zmienna zapisująca numer opcji

int main (void)
{
   DDRD |= (1<<PD0) | (1<<PD1) | (1<<PD2) ; //porty wyjściowe

   DDRC &= ~(1<<PC5); //porty wejściowe
   PORTC |= (1<<PD5);

   _delay_ms(500);

   while(1)
   {

      opcja = 0;

      if( !(PINC &(1<<PC5)) ) //zmiana o 1 przy wciśnięciu
      {
         opcja++;
      }


      if(opcja == 1)
      {
         PORTD |= (1<<PD0);

      }
      else if(opcja == 2)
      {
         PORTD |= (1<<PD1);

      }
      else if(opcja == 3)
      {
         PORTD |= (1<<PD2);

      }






   }
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 sty 2017, o 21:03 
Offline
Użytkownik

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

Przenieś zmienną "opcja" przed pętlę główną bo cały czas ją zerujesz....

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: 4 sty 2017, o 21:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
Kol.Jarecki przez niedopatrzenie nie wykasował zmiennej " opcja " po while(1).
Co do kodu; raz że bez eliminacji drgań tylko śmignie tymi plusami, a dwa - po każdym ++ "dopisujesz" świecenie na innym PIN'ie nie kasując poprzedniego.

Pozdr.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 sty 2017, o 23:12 
Offline
Użytkownik

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

kicajek napisał(a):
Kol.Jarecki przez niedopatrzenie nie wykasował zmiennej " opcja " po while(1).


O masz, faktycznie :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sty 2017, o 13:35 
Offline
Nowy

Dołączył(a): 10 gru 2016
Posty: 3
Pomógł: 0

Przerobiłem program i działa. Oczywiście jak sie spodziewałem działa bardzo nieprecyzyjnie jednak ciężko wymagać więcej od tak prostego programu.
Wszystkie uwagi okazały się trafne i pomogły.
Dziękuje za rady.

Kod:
#include <avr/io.h>
#include <util/delay.h>

int opcja; //zmienna zapisująca numer opcji

int main (void)
{
   DDRD |= (1<<PD0) | (1<<PD1) | (1<<PD2) ; //porty wyjściowe

   DDRC &= ~(1<<PC5); //porty wejściowe
   PORTC |= (1<<PD5);

   _delay_ms(500);

   while(1)
   {


        if( !(PINC &(1<<PC5)) )
        {
           _delay_ms(20);
      if( !(PINC &(1<<PC5)) ) //zmiana o 1 przy wciśnięciu
       {
         _delay_ms(100);
         opcja++;
       }
        }

      if(opcja == 1)
      {
         PORTD |= (1<<PD0);
         PORTD &= ~(1<<PD1);
         PORTD &= ~(1<<PD2);

      }
      else if(opcja == 2)
      {
         PORTD |= (1<<PD1);
         PORTD &= ~(1<<PD0);
         PORTD &= ~(1<<PD2);
      }
      else if(opcja == 3)
      {
         PORTD |= (1<<PD2);
         PORTD &= ~(1<<PD1);
         PORTD &= ~(1<<PD0);

      }

      if( opcja > 3)
             {
            opcja = 0;
             }






   }
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sty 2017, o 13:53 
Offline
Moderator
Avatar użytkownika

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

batafa napisał(a):
Przerobiłem program i działa.


Panie kolego jesteś nowy na forum, więc grzecznie proszę - popraw kody źródłowe w tym wątku zgodnie z instrukcją forum

topic7402.html

ok ?

_________________
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: 5 sty 2017, o 14:10 
Offline
Nowy

Dołączył(a): 10 gru 2016
Posty: 3
Pomógł: 0

Następnym razem wstawię post wedle wskazówek , dziękuję za podpowiedź ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sty 2017, o 14:21 
Offline
Moderator
Avatar użytkownika

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

Posty można edytować i poprawić

_________________
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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