Skocz do zawartości

[C] Zaprogramowania przycisku


matt90

Pomocna odpowiedź

Jak napisać w C, żeby po naciśnięciu przycisku włączył się silnik i działał cały czas? Ponowne naciśnięcie tego samego lub innego przycisku wyłącza silniki. Napisałem kod ale działa on tylko wtedy gdy przycisk jest wciśnięty, jak go puszczę to się wyłącza, a ja chcę żeby działał cały czas po naciśnięciu...

Link do komentarza
Share on other sites

Wiem, że można to zrobić przez XOR, ale nie o to mi chodzi. Chcę aby ten przycisk włączał cały układ, czyli czujniki i silniki, XOR zmieni mi tylko stan diody, a ja mam kilkanaście pętli w programie

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 może zacznij od pokazania programu... pytanie: "chcę coś takiego w moim programie ale nie działa tak tylko tak" nie wiele mówi. Niby chcesz pomocy, ale jak je udzielić?

Link do komentarza
Share on other sites

Mam tak napisaną obłsugę przycisku i wszystko działa tylko kiedy przycisk jest wciśnięty, jak puszczę wszystko się wyłącza, a powinno nadal działać..

while(1)
{
	if (wlacz()==true)
	{
	sharp_l();

	if (!(PORTD & _BV(PD2))
	{
		//czujniki, silniki
	}
}
Link do komentarza
Share on other sites

więc zrób zmienną globalną (koniecznie volatile) i ją xor'uj. Zmienna globalna i volatile bo obsługę przycisku w takim przypadku wypadało by wrzucić w przerwanie.

Link do komentarza
Share on other sites

Udało się 🙂 a jak teraz napisać żeby ponowne naciśniecie tego samego przycisku wyłączało wszystko?

Mam coś takiego:

ISR (INT0_vect)
{
if (!(PIND & przycisk))
{
	a =1;
}
}
int main()
{
while(1)
{		
	if (a==1)
	{  //czujniki, silniki   }
        }
}
Link do komentarza
Share on other sites

Nie robisz XOR'a na zmiennej a;

w momencie deklaracji a, zdefiniuj ją na zero, a w przerwaniu ją XOR'uj z jedynką. Efekt będzie taki, że po każdym wejściu w przerwanie nastąpi zmiana z 0 na 1 lub z 1 na 0. Standard przewiduje, że wartość 0 może być traktowana jako FALSE, natomiast każda inna jako TRUE. Więc wrzuć a (bez żadnych porównań) do if;a i będzie działać tak jak chcesz.

Mam jeszcze pytanie do tego warunku:

if (!(PIND & przycisk))

co zamierzasz dzięki temu osiągnąć ?

Link do komentarza
Share on other sites

tylko, skoro stosujesz przerwanie to pamiętaj o drganiach styków, i że musisz sie jakoś pozbyć tego problemu - programowo, lub w jakiś zewnętrzny sposób, kondensator czy coś.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.