Witam. Próbuję stworzyć układ oparty na uC Atmega8 i klawiaturze. Ma to być coś w rodzaju sterownika, który po wpisaniu prawidłowego PINU uruchamia silnik (oparty będzie pewnie na mostku, ale to inna sprawa). Żeby sprawdzić, czy takie coś ma prawo działać zbudowałem sobie szybko układ: dioda podłączona do PC5, przyciski podłączone do PB0, PB1 i PB2 (po wciśnięciu zwierają te porty do masy). Kod:
Po wciśnięciu przycisków w odpowiedniej kolejności - PB0-> PB1-> PB2 program wpada do kolejnych " if'ów ". Po każdym wciśnięciu przycisku program ma zapamiętać pin na stanie niskim, bo po puszczeniu przycisku wróciłby do stanu wysokiego i przy kolejnym przejściu programu warunek if nie byłby już spełniony. Rozumując w ten sposób, po wciśnięciu przycisków w odpowiedniej kolejności zapala się dioda na 3 sekundy, po czym porty ustawiane są z powrotem na wejście z podciągnięciem do jedynki i zabawa zaczyna się od nowa.
Problem polega na tym, że układ raz reaguje, raz nie. Przyciskam przyciski w zadanej kolejności i raz reaguje odrazu, raz za jakiś czas, a raz w ogóle. Na początku do głowy przyszła mi sprawa drgań styków, ale w jaki sposób one mogą burzyć jego pracę, skoro ich efektem jest jakby interpretacja przez program załóżmy kilkudziesięciu przyciśnięć przycisku. Skoro tak, to u mnie nie powinno to przeszkadzać, bo zależy mi tylko na tym, żeby nie wypaść z danego "if'a" jeśli już program się w nim znajdzie po odpowiednim wpisaniu przycisku.
Jeśli ktoś ma jakiś pomysł to będę bardzo wdzięczny. A jeśli podobny temat był już gdzieś poruszany to z góry przepraszam.
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#define LED1_ON_ENABLE DDRC |= (1<<5)
#define LED1_ON PORTC |= (1<<5)
#define LED1_OFF PORTC &=~ (1<<5)
main()
{
DDRB &=~ (1<<0);
DDRB &=~ (1<<1);
DDRB &=~ (1<<2); //PB0, PB1 oraz PB2 ustawione
PORTB |= (1<<0); //jako wejście z
PORTB |= (1<<1); //podciągnięciem do VCC
PORTB |= (1<<2);
LED1_ON_ENABLE; //ustawienie pinu z diodą na wyjście
while(1)
{
if(!(PINB & (1<<0))) //jesli przyciśnięty został 1. przycisk
{
_delay_ms(80);
PORTB &=~ (1<<0); //to po zwolnieniu przycisku zapamiętaj ten pin na stanie niskim
if(!(PINB & (1<<1))) //przycisk 2. analogicznie jak 1.
{
_delay_ms(80);
PORTB &=~ (1<<1);
if(!(PINB & (1<<2))) //przycisk 3. analogicznie jak 1. i 2.
{
_delay_ms(80);
LED1_ON; //zapal diode
_delay_ms(3000); //odczekaj 3 sekundy
PORTB |= (1<<0); //wróć porty
PORTB |= (1<<1); //do ustawień
PORTB |= (1<<2); //początkowych
}
else
{
_delay_ms(80);
LED1_OFF; //dioda zgaszona
}
}
else
{
_delay_ms(80);
LED1_OFF; //dioda zgaszona
}
}
else
{
_delay_ms(80);
LED1_OFF; //dioda zgaszona
}
}
}
Po wciśnięciu przycisków w odpowiedniej kolejności - PB0-> PB1-> PB2 program wpada do kolejnych " if'ów ". Po każdym wciśnięciu przycisku program ma zapamiętać pin na stanie niskim, bo po puszczeniu przycisku wróciłby do stanu wysokiego i przy kolejnym przejściu programu warunek if nie byłby już spełniony. Rozumując w ten sposób, po wciśnięciu przycisków w odpowiedniej kolejności zapala się dioda na 3 sekundy, po czym porty ustawiane są z powrotem na wejście z podciągnięciem do jedynki i zabawa zaczyna się od nowa.
Problem polega na tym, że układ raz reaguje, raz nie. Przyciskam przyciski w zadanej kolejności i raz reaguje odrazu, raz za jakiś czas, a raz w ogóle. Na początku do głowy przyszła mi sprawa drgań styków, ale w jaki sposób one mogą burzyć jego pracę, skoro ich efektem jest jakby interpretacja przez program załóżmy kilkudziesięciu przyciśnięć przycisku. Skoro tak, to u mnie nie powinno to przeszkadzać, bo zależy mi tylko na tym, żeby nie wypaść z danego "if'a" jeśli już program się w nim znajdzie po odpowiednim wpisaniu przycisku.
Jeśli ktoś ma jakiś pomysł to będę bardzo wdzięczny. A jeśli podobny temat był już gdzieś poruszany to z góry przepraszam.