Skocz do zawartości

[C] Zaprogramowania przycisku


Pomocna odpowiedź

Napisano

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

Zrób tak żeby działało, czyli żeby po wciśnięciu i puszczeniu przycisku silnik nadal się kręcił...

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

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ć?

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

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.

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

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ąć ?

    ISR (INT0_vect)
   {
        if(a) a = 0;
        else a = 1;
   }
   int main()
   {
       while(1)
       {       
           if (a)
           {  //wlacz  }
           else
           { //wylacz }
       }
   }

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ś.

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