|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
drVrh Član
Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.66 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Tor Jul 07, 2015 3:43 pm Naslov sporočila: Interupti in debouncing |
|
|
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 |
|
|
TilenS Član
Pridružen-a: Čet 24 Nov 2005 12:29 Prispevkov: 556 Aktiv.: 2.49
|
Objavljeno: Tor Jul 07, 2015 4:02 pm Naslov sporočila: |
|
|
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 |
|
|
jure94 Član
Pridružen-a: Sre 05 Maj 2010 17:11 Prispevkov: 433 Aktiv.: 2.54 Kraj: Jesenice / Lj
|
Objavljeno: Tor Jul 07, 2015 4:06 pm Naslov sporočila: |
|
|
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 |
|
|
TECHNIC Član
Pridružen-a: Tor 31 Okt 2006 11:18 Prispevkov: 582 Aktiv.: 2.73 Kraj: Senovo
|
Objavljeno: Tor Jul 07, 2015 5:13 pm Naslov sporočila: |
|
|
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 |
|
|
drVrh Član
Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.66 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Tor Jul 07, 2015 7:20 pm Naslov sporočila: |
|
|
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č.
_________________ 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 |
|
|
TECHNIC Član
Pridružen-a: Tor 31 Okt 2006 11:18 Prispevkov: 582 Aktiv.: 2.73 Kraj: Senovo
|
Objavljeno: Tor Jul 07, 2015 8:11 pm Naslov sporočila: |
|
|
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 |
|
|
drVrh Član
Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.66 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Sre Jul 08, 2015 7:44 am Naslov sporočila: |
|
|
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 |
|
|
drVrh Član
Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.66 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Sre Jul 08, 2015 12:07 pm Naslov sporočila: |
|
|
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 |
|
|
S53DZ Član
Pridružen-a: Čet 28 Apr 2011 9:27 Prispevkov: 951 Aktiv.: 6.01 Kraj: Ljubljana
|
Objavljeno: Sre Jul 08, 2015 12:22 pm Naslov sporočila: |
|
|
Morda ti kaj pomaga, jaz sem anti-debounce tipke naredil v CPLD takole:
Opis: |
|
Velikost datoteke: |
47.42 KB |
Pogledana: |
6 krat |
|
|
|
Nazaj na vrh |
|
|
jure94 Član
Pridružen-a: Sre 05 Maj 2010 17:11 Prispevkov: 433 Aktiv.: 2.54 Kraj: Jesenice / Lj
|
Objavljeno: Sre Jul 08, 2015 12:44 pm Naslov sporočila: |
|
|
Č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 |
|
|
Riven Član
Pridružen-a: Ned 16 Dec 2012 18:33 Prispevkov: 194 Aktiv.: 1.40 Kraj: Vojnik
|
Objavljeno: Pet Jul 10, 2015 8:16 am Naslov sporočila: |
|
|
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 |
|
|
igor_k Član
Pridružen-a: Pon 19 Jul 2004 11:44 Prispevkov: 992 Aktiv.: 4.45 Kraj: Rače
|
Objavljeno: Pet Jul 10, 2015 10:57 am Naslov sporočila: |
|
|
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 |
|
|
Riven Član
Pridružen-a: Ned 16 Dec 2012 18:33 Prispevkov: 194 Aktiv.: 1.40 Kraj: Vojnik
|
Objavljeno: Pet Jul 10, 2015 2:58 pm Naslov sporočila: |
|
|
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 . Č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 |
|
|
Jan Član
Pridružen-a: Sob 10 Jun 2006 14:19 Prispevkov: 313 Aktiv.: 1.44 Kraj: Dolenjska
|
Objavljeno: Pet Jul 10, 2015 7:52 pm Naslov sporočila: |
|
|
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 |
|
|
drVrh Član
Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.66 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Sob Jul 11, 2015 1:37 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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: 80 dni
Powered by phpBB © 2001, 2005 phpBB Group
|