Arduino alatt prellegés kivédése...

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
fodor99
DrótVégénSzéndarab
Hozzászólások: 23
Csatlakozott: 2012. március 24. szombat, 6:00

Hozzászólás Szerző: fodor99 »

Utananeztem mert erdekelt a tema.
Gondolom a megszakitasos megoldasra gondolsz :) illetve a "hardware"-es megoldasra :))) mikor elektronikaval oldja meg az ember.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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...
Avatar
fodor99
DrótVégénSzéndarab
Hozzászólások: 23
Csatlakozott: 2012. március 24. szombat, 6:00

Hozzászólás Szerző: fodor99 »

Robert í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...
igen, csak egy pecabot kell, nem a hal :)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Pecabot!

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);
}
Mit szólsz?
:wink:
Avatar
fodor99
DrótVégénSzéndarab
Hozzászólások: 23
Csatlakozott: 2012. március 24. szombat, 6:00

Hozzászólás Szerző: fodor99 »

ez mar inkabb egy hal a sok kozul :)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Szokásos kérés:

_Csak az eddig (a tanfolyamon) megszerzett tudással!_ :oops:
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.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

/*
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);
}
8)
Avatar
kefeur
Tranzisztorgyógyász
Hozzászólások: 187
Csatlakozott: 2008. február 17. vasárnap, 7:00

Prell

Hozzászólás Szerző: kefeur »

Huncut vagy ! :D
Megvárod míg lezajlik a prell , és ha stabil a kontakt akkor fogadod el lenyomott gomb ként .
Gratu , ez nagyon tettszik ! :)
Kefeur
Avatar
fodor99
DrótVégénSzéndarab
Hozzászólások: 23
Csatlakozott: 2012. március 24. szombat, 6:00

upp

Hozzászólás Szerző: fodor99 »

Kicsit felhozom a temat, ma akadtam erre a szoftveres megoldasra :)

http://arduino.cc/playground/Code/Bounce
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Direkt nem volt _még_. Kezdőként ezzel eltűnik a mi az oka/miért kérdése...
Avatar
fodor99
DrótVégénSzéndarab
Hozzászólások: 23
Csatlakozott: 2012. március 24. szombat, 6:00

Hozzászólás Szerző: fodor99 »

Robert írta:Direkt nem volt _még_. Kezdőként ezzel eltűnik a mi az oka/miért kérdése...
okes ertem, csak azert irtam be ide mert ezt titulaltuk "halado" agnak :)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Tényleg :)

Akkor a haladóba belefér..... :P
Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00

Re: upp

Hozzászólás Szerző: macsek »

fodor99 írta:Kicsit felhozom a temat, ma akadtam erre a szoftveres megoldasra :)

http://arduino.cc/playground/Code/Bounce
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.
Sajnos nem jó benne a pergésmentesítő logika. :( Kár, mert amúgy szép és használható kód.

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;
	
}
Ezt kéne ötvözni kapu48 megoldásával:

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 
A Bounce-ban levő elvi hiba az, hogy a várakozás letelte után vesz EGY mintát és azt használja. Az az egy minta pedig lehet épp egy zavartüske.
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)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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!!!!
Válasz küldése