Gombkezelés - prell INT alapon

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

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

Sziasztok!

Megszakítás kezelésnél tartok éppen.

Egy gombnyomással szeretném a led-et be-kikapcsolni.
De van, hogy csak villan amíg nyomom, de néha úgy marad, gondolom a prel a gond.

Ezért belekerült ez:

Kód: Egész kijelölése

void blink()
{   
  int i;
  state = !state;
    //D13 LED kezelese
  digitalWrite(led, state);
  for (i=0; i<10; i++){
      Serial.println(i);
  }
}
Na, ezzel az van, hogy így is 3x lefut, tehát a 10 kevés. De ha többre veszem, mondjuk 50-re, akkor meg lefagy az egész :?

És nagyon vasárnap este van... Mit néztem el? :cry:

Köszi!
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 _teljes_ program sokat segítene a megértésben:(...
Avatar
volkov
DrótVégénSzéndarab
Hozzászólások: 45
Csatlakozott: 2012. november 10. szombat, 7:00

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

(ide nyitottam topicot?! mert a prell-es topicba akartam válaszolni.. :oops:)

Kód: Egész kijelölése

/* I2C thermo EXT1
 LM754/TCN75A sample
 60 nap alatt arduino tanfolyam
 (c) TavIR http://avr.tavir.hu  */
 
//wire fuggveny kell!
#include "Wire.h"
#include <LiquidCrystal.h>

//2 belso valtozo
int t,l;
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
int led = 13;
volatile int state = LOW;

 
void setup()
{
  //IIC kommunikacio inicializalas
  Wire.begin();
  lcd.begin(16, 2);
  pinMode(led, OUTPUT);
  attachInterrupt(1, blink, CHANGE);  
  Serial.begin(9600);
}

void blink()
{   //allapotvaltozas
  int i;
  state = !state;
    //D13 LED kezelese
  digitalWrite(led, state);
  for (i=0; i<10; i++){
    Serial.println(i);
  }
}

void loop()
{//A 72-es cimrol 2 byte-t kerunk
  Wire.requestFrom(72, 2);
  //ha nincs eszkoz, akkor itt all a program
  while(Wire.available())
  {
    //1. byte megerkezik: egesz fok
    t = Wire.read();
    //2. byte megerkezik: tort hofok
    l = Wire.read();
    //Egesz fok kiirasa
    lcd.setCursor(0, 0);
    lcd.print("Hofok = ");
    lcd.print(t);
    //a tortfok kiirasa
    if (l == 128 ) {
      lcd.print(".5");
      } else {
      lcd.print(".0");
    }  
  }
  delay(100);
}
Előzőleg a többi részt azért nem másoltam be, mert nincs köze (elvileg) a megszakításkezeléshez.

Hőmérő, LCD-n kiírva.
De fűt az LCD világítása, ezért gondoltam kikapcsolni, s ha már volt ilyen lecke, akkor megszakítással.
A hozzászólást 1 alkalommal szerkesztették, utoljára volkov 2012. december 16. vasárnap, 23:26-kor.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Prell és az INT két külön topic. Ezért bontottam meg.

volatile int state = LOW;
Ilyen nincs.
Int: 0...65535

ilyen sincs:
state = !state;



Szóval a _teljes_ prg nélkül érdekes a megoldás.....
Avatar
volkov
DrótVégénSzéndarab
Hozzászólások: 45
Csatlakozott: 2012. november 10. szombat, 7:00

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

Robert írta:Prell és az INT két külön topic. Ezért bontottam meg.

volatile int state = LOW;
Ilyen nincs.
Int: 0...65535

ilyen sincs:
state = !state;



Szóval a _teljes_ prg nélkül érdekes a megoldás.....
Most picit össze vagyok zavarva...

Mi az, hogy ilyen nincs?

A megszakítás részt, így ezt a két sort is 1:1-ben a #25-ös leckéből másoltam ki.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

A "volatile int state = LOW;" nem igazán szabványos.
INT esetén a tartomány és a állaptjelzés nem igazán van fedésben.
Bár a Low=0, High=1 jelentést valószínű a fordító lekezeli...


A kapcsolót ezért írtam. Túl egyszerű:) Prell megoldódik, ki/bekapcsolási állapot fix.
Ifeális a TIMER alapú lenne, hogy 10 msecenként olvasom, 5xH - magas, 5x alacsony - alacsony. Köztes állapot nyomás/elentgedés alatt vagy prell.
Arduino alatt a Debounce megoldás (Bascom alatt van ilyen :P .
Avatar
volkov
DrótVégénSzéndarab
Hozzászólások: 45
Csatlakozott: 2012. november 10. szombat, 7:00

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

Robert írta:A "volatile int state = LOW;" nem igazán szabványos.
INT esetén a tartomány és a állaptjelzés nem igazán van fedésben.
Bár a Low=0, High=1 jelentést valószínű a fordító lekezeli...


A kapcsolót ezért írtam. Túl egyszerű:) Prell megoldódik, ki/bekapcsolási állapot fix.
Ifeális a TIMER alapú lenne, hogy 10 msecenként olvasom, 5xH - magas, 5x alacsony - alacsony. Köztes állapot nyomás/elentgedés alatt vagy prell.
Arduino alatt a Debounce megoldás (Bascom alatt van ilyen :P .
Najó, teljesen elvesztettem a fonalat 8O

1.
Tehát ami van a leckében, megszakítás kezelés, az működik, csak nem szabványos?
(25-ös lecke, második példa, abban van a "volatile int state = LOW;" meg a "state = !state;")
Helyett logikai változó kéne?

2.
Az eredeti kérdésnél maradva, ha gombbal csinálok megszakítást, ott hogy védem ki a prellt? Gondolom amiatt fut le 3x a megszakítási rutin (mivel ha azt még jól fogtam fel, a delay nem megy megszakítás alatt, a "for" meg lefagy)

(kezd bedurvulni a tanfolyam, lehet sokat agyalni rajta.. tök jó!! :D)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Ha túl hosszúra veszed a For ciklust a megszakításban.
Akkor bejön a következő megszakítás mielőtt végzet volna, torlódik neked.

Próbáld másképpen megoldani a problémát!
Pl.: Az első INT_ben lekezeled, a következő 3-10-ben nem csinálsz semmit.
8)
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. december 17. hétfő, 13:34-kor.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Bizony. Logikai változót és a szám alakút nem illik egy kalap alá venni. Ám a fordító lekezeli/megérti. Igazán ennek a bit típus felelne meg. (0 vagy 1)

Ugyanez visszaköszön, mert mindent integerként definiálunk. Azaz pazaroljuk a helyet, mert lehet hogy csak 1...10-ig kell számnolni. Ez elfér 1 byte-ben is, míg mi 2-t használunk el. Ez PC-n még megbocsátható, majd az User vesz több memóriát, nagyobb processzort... AVR esetén meg "így járás esete forog fenn"...


Gomb és INT alatt nem tudod a prellt kivédeni. Kezelni tudod.
Túl gyors a processzor, így feldolgozza a jelsorozatot.
Vagy tegyél be mágneses kapcsolót (hall elemes), az nem prelleg :) .
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Esetleg méred a 2 megszakítás között eltelt időt.
És ha túl kicsi, az nem OK!

Bövebben: Processor Interrupts with Arduino
http://www.sparkfun.com/tutorials/326

:wink:
Avatar
volkov
DrótVégénSzéndarab
Hozzászólások: 45
Csatlakozott: 2012. november 10. szombat, 7:00

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

kapu48 írta:Esetleg méred a 2 megszakítás között eltelt időt.
És ha túl kicsi, az nem OK!

Bövebben: Processor Interrupts with Arduino
http://www.sparkfun.com/tutorials/326

:wink:
(delay-el probáltam várakozni, azzal nem volt jó, de) A linkelt megoldás szupi!

Működik! :)

Köszi! :wink:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Szegény Robert!
Most tépi a haját!
Miért tanítgat itt ingyen?
:(

Amíg megszakításban van a programod azt másik megszakítás nem tudja megszakítani!
A Delay is megszakításban futna. Várhatod.
:wink:
Avatar
volkov
DrótVégénSzéndarab
Hozzászólások: 45
Csatlakozott: 2012. november 10. szombat, 7:00

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

kapu48 írta:Szegény Robert!
Most tépi a haját!
Miért tanítgat itt ingyen?
:(

Amíg megszakításban van a programod azt másik megszakítás nem tudja megszakítani!
A Delay is megszakításban futna. Várhatod.
:wink:
Nem voltam egyértelmű.
A legelején próbáltam azzal. Utána jött a for ciklus de azzal fagytam le. Utána írtam ide.
De amúgy meg ebből tanulok a legtöbbet: a saját hibáimból.
:)
Válasz küldése