www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Interupti in debouncing

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.68
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Tor Jul 07, 2015 3:43 pm    Naslov sporočila:  Interupti in debouncing Odgovori s citatom

Za vas imam nekaj vprašanj
Delam z LPC1769 xpresso pa me mučijo interrupti in debouncanje.

1. Kako pri interruptih debouncati tiste špice, ki nastanejo ob preklaplanju npr. tipke. Našel sem nekaj primerov toda vsak ima svoj interrupt in kr neke svoje timerje ni nekako splošno narejeno.
Sedaj imam narejeno takole:

Koda:
void EINT3_IRQHandler(void){

   if((LPC_GPIOINT -> IO0IntStatF) & (1 << UPTIPKA_PIN)){
      LPC_GPIOINT -> IO0IntClr |= (1 << UPTIPKA_PIN);
      flagIO1 = 1;
   }
   if((LPC_GPIOINT -> IO0IntStatF) & (1 << MENUTIPKA_PIN)){
      LPC_GPIOINT -> IO0IntClr |= (1 << MENUTIPKA_PIN);
      LCDPocisti();
      MainMenu();
      flagIO2 = 1;
   }
}


2. Kako je pravilno narediti interrupte za več tipk, ker tole zgoraj mi ne dela najbolj prav, zatika se pri preklapljanju tipk, prvo naj bi bila tipka menu kasneje pa tipka up ampak up ne deluje vedno se nekje zatika

3. Kateri interrupt je pravzaprav za detekcijo start up sistema. Žele bi da se nek interrupt postavi ko se sistem prižge. Je možno? Ja vem postavi eno spremenljivko na začetek programa toda verjetno obstaja nek drug način tudi.

_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
TilenS
Član
Član



Pridružen-a: Čet 24 Nov 2005 12:29
Prispevkov: 556
Aktiv.: 2.50

PrispevekObjavljeno: Tor Jul 07, 2015 4:02 pm    Naslov sporočila:   Odgovori s citatom

Ne delam z LCP tako, da govorim to bolj na splošno.

1. Če ti zunanji signal proži interupt potem najbolje, da že kar zunaj čim bolje filtriraš signal.

2. Za tipke sploh ne uporabim interupta ampak kar lepo klasičen vhod in štejem preklope. Šele ko pridem do določenega števila preklopov smatram, da je signal čist in tipka sklenjena. Lahko greš tudi v časovno filtriranje, če želiš tu pa ponavadi rabiš še kakšen interupt za osnovni takt sistema (system clock).

3. Zakaj bi sploh želel interupt ob startu sistema za takšno enostavno stvar? Kot si že rekel, lepo postavi eno spremenljivko in je oz. če je časovno kritično izvedi to takoj po vstopu procesorja v main().

_________________
LP Tilen
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jure94
Član
Član



Pridružen-a: Sre 05 Maj 2010 17:11
Prispevkov: 433
Aktiv.: 2.56
Kraj: Jesenice / Lj

PrispevekObjavljeno: Tor Jul 07, 2015 4:06 pm    Naslov sporočila:   Odgovori s citatom

Za točno tvoj primer ne vem, lahko pa probaš takole:
Ko se sproži interrupt poženeš timer, seveda najprej preveriš, če je timer mogoče že prižgan, da ga ne resetiraš (v primeru, da to ni 1. interrupt) .
Timer lahko nastaviš, da sproži overflow interrupt. V tem interruptu potem pogledaš, če je tipka pritisnjena.
Še en primer:
Tipka se ustali po 1ms. Ko pritisneš tipko, se sproži ext interrupt (eint v tvojem primeru) v katerem najprej preveriš, ali timer že dela. Če dela ne narediš nič. Če pa ne, pa vklopiš timer, ki je nastavljen, da sproži overflow interrupt čez naprimer 1,5ms. V timer interruptu pa potem pogledaš, če je pin na 0 (ali 1 odvisno od vezave tipke). Seveda to deluje dobro samo v primeru, da je pritisnjena največ 1 tipka.
Za debouncing več tipk na enkrat lahko uporabiš več timerjev ali pa rešiš kako drugače.

Za lažji debugging lahko uporabiš LED. V delu kode, ki ti ne deluje prižigaš in ugašaš različne LED in vidiš točno, kje se ti zatakne. Vmes daš še kakšen delay pa je za debugging to odlično.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
TECHNIC
Član
Član



Pridružen-a: Tor 31 Okt 2006 11:18
Prispevkov: 582
Aktiv.: 2.75
Kraj: Senovo

PrispevekObjavljeno: Tor Jul 07, 2015 5:13 pm    Naslov sporočila:   Odgovori s citatom

Kaj pa periodično preverjanje pritisnjenjih tipk, recimo na vsake 10 do 100 ms? V rutini preverjaš ali je tipka pritisnjena ali ne. Če je pritisnjena, povečuješ neko spremenljivko in ko večja od X (ki pomeni, da je bila tipka držana za X klicev funkcije) se odločiš, da je zagotovo pritisnjena.

Rutino ti kliče overflow interrupt timerja recimo.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.68
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Tor Jul 07, 2015 7:20 pm    Naslov sporočila:   Odgovori s citatom

Naj še malo bolj opišem pravzaprav kaj delam, želim imeti menu na GLCD, in imam za meni narejeno eno tipko s katero vstopiš v meni, iz bilo katerega stanja LPC-ja, zato interrupt.
Z drugo tipko pa se pomikaš med meniji, in imam narejeno tako da interupt postavi flagIO1 na 1 ko je pritisnjena, v switch case stavku pa gledam kolikokrat je bila pritisnjena tipka ali 1x 2x 3x tako se pomikam po meniju ko pride do 5x se števec resetira in gre ponovno iz 1. Zato je nemogoče periodično preverjanje tipk z štetjem flagIO1.
In problem je ravno v tem ker mi špica proži interupt in posledično mojo flagIO1, najboljši primer je zadevo res rešiti nekako s timerji ampak še nisem tako daleč. Very Happy

_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
TECHNIC
Član
Član



Pridružen-a: Tor 31 Okt 2006 11:18
Prispevkov: 582
Aktiv.: 2.75
Kraj: Senovo

PrispevekObjavljeno: Tor Jul 07, 2015 8:11 pm    Naslov sporočila:   Odgovori s citatom

Po mojem mnenju se to še vedno da naresti s periodičnim preverjanjem tipk. Lahko šteješ čas pritisnjene tipke v tej polling funkciji. Če je čas med 50 in 200 ms recimo, se odločiš za veljaven pritisk.

Takole imam jaz tole rešeno, funkcijo kličem na vsakih ~10 ms.
http://pastebin.com/uMPDsBEb

Upam, da tole zgoraj kaj pomaga. Če imaš kakšna vprašanja, kar.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.68
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Sre Jul 08, 2015 7:44 am    Naslov sporočila:   Odgovori s citatom

OK če damo zadevo z debouncingom malo na stran.

Kako bi rešil recimo tole, imamo dve tipki UP in MENU ob startu se ti pojavi začetni zaslon, s tipko MENU vstopimo v drug zaslon UP na začetnem zaslonu se ignorira.
Ko pridemo v drugi zaslon, moramo z UP tipko prestavljati kurzor gor.

Rešeno je takole, ampak se pojavi problem, ko si začetnem zaslonu se ob pritiskanju tipke UP ne zgodi nič kar je prav. Ob pritisku MENU tipke vstopiš v MENU, ampak sedaj ne moreš postavljati kurzor gor, tipka UP se ne odziva.
Kot vidite lahko bi postavil oz. kllical funkcijo MainMenu iz prvega IF kjer preverja za tipko UP toda bi bilo možno priti v drugi zaslon MENU tudi s to tipko.

Kaj je pravzaprav napaka, da ko pokliče tipka MENU funkcijo MainMenu(), je tam if stavek ki preveri kakšno je stanje FlagIO1 (tipka up), in ker seveda ni postavljena vrže ven. Kako bi naredil nekakšno zanko, ki bi v MainMenu čakala na flagIO1 da se postavi.

Koda:
void EINT3_IRQHandler(void){

   if((LPC_GPIOINT -> IO0IntStatF) & (1 << UPTIPKA_PIN)){
      LPC_GPIOINT -> IO0IntClr |= (1 << UPTIPKA_PIN);
                //LCDPocisti();
      //MainMenu();
      flagIO1 = 1;
   }else{
      if((LPC_GPIOINT -> IO0IntStatF) & (1 << MENUTIPKA_PIN)){
         LPC_GPIOINT -> IO0IntClr |= (1 << MENUTIPKA_PIN);
         LCDPocisti();
         MainMenu();
         flagIO2 = 1;
      }
   }
}

_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.68
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Sre Jul 08, 2015 12:07 pm    Naslov sporočila:   Odgovori s citatom

Sedaj sem zgornjo zadevo rešil tako imam posebej funkcijo za kurzorje.

Zdaj pa bi rad rešil ta debounce, pa ga ima narejenega tako, da mi šteje interrupt, in mi samo takrat izvede ko je interrupt števec = 1 ostalo ignorira oz. postavi števec na 0.

Pa mi še vedno ne dela.

Koda:
void EINT3_IRQHandler(void){

   if((LPC_GPIOINT -> IO0IntStatF) & (1 << UPTIPKA_PIN)){
      counter1++;
      if(counter1 == 1){
         _delay_ms(150);
         LPC_GPIOINT -> IO0IntClr |= (1 << UPTIPKA_PIN);
         //LCDPocisti();
         //MainMenu();
         flagIO1 = 1;
         Kurzor();

      }else{
         counter1 = 0;
      }
   }
.......}

_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
S53DZ
Član
Član



Pridružen-a: Čet 28 Apr 2011 9:27
Prispevkov: 951
Aktiv.: 6.05
Kraj: Ljubljana

PrispevekObjavljeno: Sre Jul 08, 2015 12:22 pm    Naslov sporočila:   Odgovori s citatom

Morda ti kaj pomaga, jaz sem anti-debounce tipke naredil v CPLD takole:


debounce-bgen18.jpg
 Opis:
 Velikost datoteke:  47.42 KB
 Pogledana:  6 krat

debounce-bgen18.jpg


Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
jure94
Član
Član



Pridružen-a: Sre 05 Maj 2010 17:11
Prispevkov: 433
Aktiv.: 2.56
Kraj: Jesenice / Lj

PrispevekObjavljeno: Sre Jul 08, 2015 12:44 pm    Naslov sporočila:   Odgovori s citatom

Če to kaj pomaga, preberi tole:
http://www.ikalogic.com/de-bouncing-circuits/
Mogoče lahko smao dodaš zunanji kondenzator in pogledaš na osciloskopu, če je signal vredu. Če bo vhod v uC vredu ne potrebuješ softwarske rešitve.
Za najbolj robustno delovanje pa narediš oboje.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Riven
Član
Član



Pridružen-a: Ned 16 Dec 2012 18:33
Prispevkov: 194
Aktiv.: 1.41
Kraj: Vojnik

PrispevekObjavljeno: Pet Jul 10, 2015 8:16 am    Naslov sporočila:   Odgovori s citatom

V večini embedded primerov se uporablja "strojna" rešitev in ne programske. Zakaj?
Ker RC filter zraven tipke in kakšen schmit trigger prideta dosti dosti manj kot programski del kode.

Zavedati se je namreč treba da je dolžina kode (št. vrstic kode) drastično podraža izdelek. Zato je ceneje in lažje narediti enostavni RC filter. Najbolje da tipko povežeš na osciloskop in pogledaš koliko uS oz. verjetno kar mS potrebuješ da se tipka ustali. Nato usvariš RC filter, ki ti filtrira večje preklope stikala, glede na prej omenjen čas.

Drugače pa sam programsko rešim problem tako, da kot je že nekdo omenil, povečujem random števec. Števcu nastavim treshold in po tem tresholdu preverim če je tipka še vedno pritisnjena.
Slabost te rešitve je, da je od stikala do stikala odvisna ta treshold meja in moraš eksperimentirat z nastavitvami. Ko v osnovi nastaviš tisto mejo pa tako ali tako imaš ponavadi iste tipke in za ostalo narediš enako.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igor_k
Član
Član



Pridružen-a: Pon 19 Jul 2004 11:44
Prispevkov: 992
Aktiv.: 4.47
Kraj: Rače

PrispevekObjavljeno: Pet Jul 10, 2015 10:57 am    Naslov sporočila:   Odgovori s citatom

Zanimivo razmišljanje.
Meni se zdi programska rešitev cenejša, kot RC filter. Da bi teh 15 minut dela in par vrstic kode bilo tako drago? Mogoče, če delaš nekaj kosov, samo pri večjih serijah pa sigurno ni.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Riven
Član
Član



Pridružen-a: Ned 16 Dec 2012 18:33
Prispevkov: 194
Aktiv.: 1.41
Kraj: Vojnik

PrispevekObjavljeno: Pet Jul 10, 2015 2:58 pm    Naslov sporočila:   Odgovori s citatom

Ponavadi če proizvajaš celotnen hardver in softver, je softver plačan po vrsticih kode. Seveda se špara kjer se lahko, tako da čim manj kode Smile. Če je tole masovno se sicer malo poceni, ampak ne tolko kot se poceni RC člen.

RC člen je reda par centov če proizvajaš masovno artikel.

Najbolje je seveda oboje, dejansko pa potreješ samo eno rešitev in se tudi odločiš samo za eno.
Za doma je seveda vseeno, ko pa enkrat dobiš cenike na mizo, si boš pa hitro premislil in iskal bližnjice (zmanjšanje kode). Programiranje mikrokontrolerjev je kar drag biznis (narašča z vrsticom kode).
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jan
Član
Član



Pridružen-a: Sob 10 Jun 2006 14:19
Prispevkov: 313
Aktiv.: 1.44
Kraj: Dolenjska

PrispevekObjavljeno: Pet Jul 10, 2015 7:52 pm    Naslov sporočila:   Odgovori s citatom

Debounce-a pri branju klasičnih tipk se najažje znebiš s ponavljajočim branjem
tipke (polling). Interval med posameznimi branji pa izbereš nekje 50 ms,
kar pride 20 krat na sekundo. Človek takega zamika ne opazi.

Uporaba prekinitev za branje tipka pa sploh ni potrebna, razen če ni kakšnega
drugega posebnega razloga.

Jan
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.68
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Sob Jul 11, 2015 1:37 pm    Naslov sporočila:   Odgovori s citatom

Sedaj imam reseno z dvakratnim debouncanjem.
1. Ko se mi prozi interupt prvic ugasnem interupt in ga na koncu spet postavim
2. Ce slucajno je nihanje tipke daljse od trajanja vklopa in izklopa tipke pa ima stevec ki se poveca ob prozenju interupta in obravnava pritisk tipke le ce je stevec = 1. Ostalo zanemari.

Da serijska proizvdonja 250000 kosov ....

_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group