Skocz do zawartości

[C] Zmiana działania programu jednym przyciskiem


soban

Pomocna odpowiedź

Witam wszystkich.

Mam mały problem odnośnie programu w C. Może to głupie ale uczę się dopiero tego języka i nie mogę znaleźć odp. na moje pytanie.

Jak narazie doszedłem do programu który na przemian zapala dwie diody w określonym czasie:

/*
* main.c
*
*  Created on: 2012-03-07
*  Autor: Maciej Sobański
*  Migacz
*/
#include <avr/io.h>
#include <util/delay.h>

// definicje dla preprocesora

// dioda LED
#define LED1_PIN (1<<PC7)		 	// definicja pinu do którego podłączona jest dioda                           
#define LED2_PIN (1<<PC5)             // definicja pinu do którego podłączona jest dioda
#define LED1_TOG PORTC ^= LED1_PIN	// makrodefinicja – zmiana stanu diody
#define LED2_TOG PORTC ^= LED2_PIN	// makrodefinicja – zmiana stanu diody
// ********************************************************* 1-sza wersja
int main(void)
{
// ****** inicjalizacja *********
DDRC |= LED1_PIN;		// kierunek pinu PC7 – wyjściowy
DDRC |= LED2_PIN;		// kierunek pinu PC5 – wyjściowy
// ****** pętla główna programu  *********
;while(1)
{
		LED1_TOG;		 //Gasi Diode 1
		_delay_ms(200); //Czeka 1s
		LED1_TOG;   	 //Zapala Diode 1
		LED2_TOG;		 //Gasi Diode 2
		_delay_ms(200); //Czeka 1s
		LED2_TOG;		 //Zapala Diode 2
}
}


Chodzi o to żeby program działał na zasadzie lampki rowerowej czyli, za pomocą jednego przycisku (np podpiętego pod PD0) zmieniał funkcję świecenia się diod. Dajmy na to przykład. Wciskam raz świeci się jedna dioda, wciskam drugi raz świecą się dwie, wciskam jeszcze raz i świecą się na przemian jak w programie wyżej.

Bardzo proszę o pomoc.

Link do komentarza
Share on other sites

Robisz coś takiego:

int main(void)
{
 ...
 //inicjalizacja 
 ...
 char stan =0;
 while(1)
 {
   if (Nacisnietoklawisz())
   {
     stan++;
     if (stan>2) stan=0; //czyli stan może przyjąć wartość 0,1 lub 2
   }
   if (stan==0)
   {
     //tutaj co ma sie dziac przy stanie 0 - bez naciśnięcia klawisza lub co trzecie..
   }
   else if (stan==1)
   {
     //tutaj co ma sie dziac przy stanie 1 -po jednym naciśnięciu klawisza
   }
   else
   {
      // w pozostalych przypadkach - gdy stan jest 2 - po dwóch naciśnięciach klawisza
   }
 }
}

Czyli klawiszem ustawiasz kolejne stany zmiennej stan, a potem w pętli sprawdzasz jaki masz stan i odpowiednio regulujesz świecenie diod

  • Lubię! 1
Link do komentarza
Share on other sites

stan++; 

Co to oznacza? Bo w programie wyskakuje mi przez to błąd?

Mirek nie pokazał co ma w funkcji Nacisnietoklawisz(). A to bardzo istotne ze względu na: Drgania styków przycisku tym bardziej, że nie piszesz, abyś miał eliminację sprzętową.

Miałem kiedyś (na swojej płytce - początki programowania BASCOM) z tym problem i właśnie zastanawiałem się nad tym. Teraz pracuję z płytką EvB 4.3 firmy And-Tech bo postanowiłem NAUCZYĆ SIĘ języka C, no i powiem Ci, że choć nie widzę tam niczego takiego jak w twoim linku, to dioda pracuje jak najbardziej poprawnie bez żadnych problemów.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

To zwiększenie zmiennej STAN o 1.

Pokaż jaki błąd.

[ Dodano: 08-03-2012, 15:55 ]

... no i powiem Ci, że choć nie widzę tam niczego takiego jak w twoim linku, to dioda pracuje jak najbardziej poprawnie bez żadnych problemów.

Magiczny BASCOM załatwiał pewnie ten problem za Ciebie ... fizyki nie da się przeskoczyć 🙂

W C masz pełną kontrolę nad prawie wszystkim, ale za to nieco więcej obowiązków.

Link do komentarza
Share on other sites

dondu - jest napisane takie coś : 'stan' undeclared (first use in the function), Line breakpoint: main.c [line: 33]

[ Dodano: 08-03-2012, 15:58 ]

Magiczny BASCOM załatwiał pewnie ten problem za Ciebie ... fizyki nie da się przeskoczyć 🙂

Jak pracowałem z BASCOM'em to właśnie wyskakiwał "ten błąd", teraz programuję w C i nic takiego nie ma ;]

Link do komentarza
Share on other sites

Oj, musisz łyknąć jakąś książkę lub kurs.

http://mikrokontrolery.blogspot.com/p/ksiazki-dla-ciebie.html

http://kursc.forbot.pl/

To oznacza, że masz nie zadeklarowaną zmienną - w kodzie Mirka jest ona zadeklarowana: char stan =0;

[ Dodano: 08-03-2012, 16:00 ]

... teraz programuję w C i nic takiego nie ma ;]

Ten cud (a właściwie jego brak) objawi się i niechybnie Ciebie zaskoczy jeżeli się nie zabezpieczysz - link podałem - filmik jest, algorytmy itp także - nic tylko czytać i stosować 🙂

Link do komentarza
Share on other sites

Korzystam z książki : ) MIKROKONTROLERY AVR JĘZYK C - PODSTAWY PROGRAMOWANIA Mirosław Kardaś

Wystarczyło dodać do prgramu taką linijkę :

	while(1)
{
	if( KEY_DOWN )     //klawisz wciśnięty?
	{
_delay_ms(80);     //czas drgania styków
if( KEY_DOWN )     //klawisz nadal wciśnięty?
{
	LED1_TOG;    //zmiana stanu diody LED
	_delay_ms(200);    //pauza 200ms  
}
}
}

Przy okazji po co dodano to 200ms na końcu programu??

Link do komentarza
Share on other sites

Wystarczyło dodać do prgramu taką linijkę :
....
_delay_ms(80);     //czas drgania styków
....
}
}

Oczywiście to załatwia problem i w Twoim przypadku prawdopodobnie Ci wystarczy.

Jak już dojdziesz do programów, gdzie delay() nie będziesz mógł stosować zaglądnij tutaj: EPP: Drgania styków - zmora początkujących

[ Dodano: 08-03-2012, 16:07 ]

Przy okazji po co dodano to 200ms na końcu programu??

Zastanów się co będzie się działo z LEDem, gdy tego opóźnienia nie będzie.

Link do komentarza
Share on other sites

Ma czekać 200ms aby nie wiem? Odczekać to drganie styków podczas puszczania przycisku?

W tym algorytmie eliminację drgań styków załatwia _delay_ms(80). Ten drugi delay(200) jest do tego abyś mógł zaobserwować zmiany LED na przeciwny.

Mam wrażenie, że nie czytasz ani książki, ani tego artykułu z linku który Ci podałem. To dobra książka więc sugeruję, żebyś zamiast się spieszyć czytał dokładnie i powoli źródła wiedzy, by z każdym drobiazgiem na forum tematu nie zakładać.

Powodzenia! 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.