Gondolom a megszakitasos megoldasra gondolsz
Arduino alatt prellegés kivédése...
Egy jó tanár nem egy megoldást ad:). Itt volt
- sima gombfigyelés a hibáival.
- adott ideig nyomva legyen...
És még van:
- külső HW-es rásegítés
- TIMER alapú
- INT alapú
- és néhány trükkös egyéb megoldás. De ezek későbbi leckék részei.
Ezek oka: tanuld meg, hogy mikor, melyik megoldásnak mi az előnye, mi a hátránya. És mikor melyik használható... Erről a gondolkodásmódról (is) szól a tanfolyam...
- sima gombfigyelés a hibáival.
- adott ideig nyomva legyen...
És még van:
- külső HW-es rásegítés
- TIMER alapú
- INT alapú
- és néhány trükkös egyéb megoldás. De ezek későbbi leckék részei.
Ezek oka: tanuld meg, hogy mikor, melyik megoldásnak mi az előnye, mi a hátránya. És mikor melyik használható... Erről a gondolkodásmódról (is) szól a tanfolyam...
igen, csak egy pecabot kell, nem a halRobert írta:Egy jó tanár nem egy megoldást ad:). Itt volt
- sima gombfigyelés a hibáival.
- adott ideig nyomva legyen...
És még van:
- külső HW-es rásegítés
- TIMER alapú
- INT alapú
- és néhány trükkös egyéb megoldás. De ezek későbbi leckék részei.
Ezek oka: tanuld meg, hogy mikor, melyik megoldásnak mi az előnye, mi a hátránya. És mikor melyik használható... Erről a gondolkodásmódról (is) szól a tanfolyam...
Pecabot!
Mit szólsz?

Kód: Egész kijelölése
/*
Nyomogomb - antiprell - IF + For
Demonstracios program
60 nap alatt arduino tanfolyam része
(c) TavIR http://avr.tavir.hu
*/
byte osszeg; // számláló
void setup(){
pinMode(6, INPUT); // Input switch
pinMode(7, OUTPUT); // Output LED
digitalWrite(6, HIGH); //Pull-up
}
void loop() {
osszeg = 0;
for(int i=0;i<5;i++) // Pár szór meg ismételjük az olvasást
{
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
}
if (osszeg > 0) { // Ha akár 1*1-et olvas, azt még nem fogadjuk el
delay(900);
}
delay (100);
digitalWrite(7, HIGH);
osszeg = 0;
for(int i=0;i<5;i++)
{
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
}
if (osszeg > 0) { // Ha akár 1*1-et olvas, azt még nem fogadjuk el
delay(900);
}
delay (100);
digitalWrite(7, LOW);
}Szokásos kérés:
_Csak az eddig (a tanfolyamon) megszerzett tudással!_
Ez a tanfolyami kérdések során áll fenn.
A szorzótábla után nem a trigonometria jön!
Bár aki a haladó részen van, néha kénytelen ezt is megtenni....
_Csak az eddig (a tanfolyamon) megszerzett tudással!_
Ez a tanfolyami kérdések során áll fenn.
A szorzótábla után nem a trigonometria jön!
Bár aki a haladó részen van, néha kénytelen ezt is megtenni....
A hozzászólást 1 alkalommal szerkesztették, utoljára Robert 2012. július 28. szombat, 16:01-kor.
/*
Nyomogomb - antiprell - IF COPI - PASTE
Demonstracios program
60 nap alatt arduino tanfolyam része
(c) TavIR http://avr.tavir.hu
*/
byte osszeg; // számláló
void setup(){
pinMode(6, INPUT); // Input switch
pinMode(7, OUTPUT); // Output LED
digitalWrite(6, HIGH); //Pull-up
}
void loop() {
osszeg = 0;
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
if (osszeg > 0) { // Ha akár 1*1-et olvas, azt még nem fogadjuk el
delay(900);
}
delay (100);
digitalWrite(7, HIGH);
osszeg = 0;
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
if (osszeg > 0) { // Ha akár 1*1-et olvas, azt még nem fogadjuk el
delay(900);
}
delay (100);
digitalWrite(7, LOW);
}

Nyomogomb - antiprell - IF COPI - PASTE
Demonstracios program
60 nap alatt arduino tanfolyam része
(c) TavIR http://avr.tavir.hu
*/
byte osszeg; // számláló
void setup(){
pinMode(6, INPUT); // Input switch
pinMode(7, OUTPUT); // Output LED
digitalWrite(6, HIGH); //Pull-up
}
void loop() {
osszeg = 0;
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
if (osszeg > 0) { // Ha akár 1*1-et olvas, azt még nem fogadjuk el
delay(900);
}
delay (100);
digitalWrite(7, HIGH);
osszeg = 0;
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
if (osszeg > 0) { // Ha akár 1*1-et olvas, azt még nem fogadjuk el
delay(900);
}
delay (100);
digitalWrite(7, LOW);
}
Prell
Huncut vagy !
Megvárod míg lezajlik a prell , és ha stabil a kontakt akkor fogadod el lenyomott gomb ként .
Gratu , ez nagyon tettszik !
Megvárod míg lezajlik a prell , és ha stabil a kontakt akkor fogadod el lenyomott gomb ként .
Gratu , ez nagyon tettszik !
Kefeur
upp
Kicsit felhozom a temat, ma akadtam erre a szoftveres megoldasra 
http://arduino.cc/playground/Code/Bounce
http://arduino.cc/playground/Code/Bounce
Re: upp
Egy nagyon kényelmes módszert ad a bemenetek prellmentes kezelésére. Még ismétlő funkciója is van beépítve, tehát a nyomva tartott gomb léptethet gyorsan valamit beállításnál.fodor99 írta:Kicsit felhozom a temat, ma akadtam erre a szoftveres megoldasra
http://arduino.cc/playground/Code/Bounce
Sajnos nem jó benne a pergésmentesítő logika.
Kód: Egész kijelölése
int Bounce::debounce() {
uint8_t newState = digitalRead(pin);
if (state != newState ) {
if (millis() - previous_millis >= interval_millis) {
previous_millis = millis();
state = newState;
return 1;
}
}
return 0;
}Kód: Egész kijelölése
void loop() {
osszeg = 0;
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
osszeg += digitalRead(6); // Összegezzük a beolvasott értéket.
delay (5);
if (osszeg > 0) { // Ha akár 1*1-et olvas, azt még nem fogadjuk el Ezért jobb kapu48-é, mert ő egy tartományban többször vesz mintát, és nem enged meg benne eltérést.
Ez már majdnem tökéletes, annyi vele gond, h ha az ELSŐ olvasás volt a zavartüske és utána minden ugyanúgy áll, akkor még egy teljes ciklusnyit (5*5ms-et) vár, mire elfogadja, mint valós érték. Tehát a szükségesnél nagyobb a késleltetése. Ez persze csak néhány alkalmazásnál számít, a led ki/bekapcsolására tökéletes.
A teljesen korrekt megoldás pedig valami olyan lenne, amikor addig csúsztatjuk a beolvasó ablakot, míg nem talál n db egyező mintát. Ennek a mintavétele lehet (időzítéses) megszakítás-vezérelt, de a Bounce-féle megoldás is jó, tehát belül nézegetjük a millis() függvényt.
(igény esetén rittyentek egy példa kódot)
Korrekt megoldás:
- INT alapon 1 msecenként kiugrasz körbenézni (Millis, időzítés, INT alapon fut).
Ha a gomb = 1 megnyomva=megnyomva+1, max 5
Ha a gomb = 0 megnyomva=megnyomva-1, min 0
5 msec a válaszidő. Ha közben vagyok, 1..4, akkor prellegés van.
Ezt viszont a millis() eljárásba kell beleírnod - utólag!
DE: ekkor nem használhatsz interruptban való figyelést, mert a millis() szintén megszakítás alapú és áll addig!!!!
- INT alapon 1 msecenként kiugrasz körbenézni (Millis, időzítés, INT alapon fut).
Ha a gomb = 1 megnyomva=megnyomva+1, max 5
Ha a gomb = 0 megnyomva=megnyomva-1, min 0
5 msec a válaszidő. Ha közben vagyok, 1..4, akkor prellegés van.
Ezt viszont a millis() eljárásba kell beleírnod - utólag!
DE: ekkor nem használhatsz interruptban való figyelést, mert a millis() szintén megszakítás alapú és áll addig!!!!