Zdravim
Potřeboval bych poradit. Potřebuji nějak udělat aby mi tlačítko reagovalo kdykoliv a nevím jak na to. Dělám v Bascomu, pokud se najde někdo kdo by mi pomohl, byl bych moc rád. Jde mě o to, že chcu po stisku tlačítka přeskočit na další podprogram, jenže nevím jak udělat abych se nemusel trefovat přesně v tu dobu kdy mam napsaný příkaz na kontrolu tlačítka. Nějak udělat to jít musí ne? Třeba nějakej blikač, ledky běží doprava a to se mě nelibi, tak stisknu tlačítko a ledky hned začnou běžet doprava, např..
Fórum › Mikrokontroléry
Tlačítko
Nejak nechapu ten priklad cos uved, ale asi jsi mel na mysli ze pobezi doleva, kdyz bezi doprava
Na toto se pouziva tzv externi preruseni. Muzes si na nem, u avr, nastavit reakci na nabeznou nebo sestupnou hranu.
Jak je tomu u PICu, ARMu, aj. netusim. Koukni do datasheetu k MCU, ktery chces pouzit
Tak jsem to zkoušel, ale mám další problém. Když vyvolám přerušení tak mě stejně vždy dokončí ten rozjetej proces. Ale já bych potřeboval aby mi to hned přeskočilo. Příklad, mám instrukci na 60 řádcích a ve třetině stisknu tlačítko, s tím že nechcu čekat než to dokončí. Jde to njak udělat?
to jde prave dost tezko .. leda bys dokazal prepsat navratovou adresu na jine misto..
nebo zalezi na tom jak vypada ten kod.. jestli nenahodit jen nejaky flag ktery by to prerusil
da se to udela relativne jednoduse, ale bude to vypadat desne
v preruseni si nastav nejaky priznak
treba sepnuto = 1
pote v probihajicim procesu musis tento priznak kontrolovat, pokud je nahozen, proces ukoncit, priznak vymazat a zacit proces druhy
@dawe
dej priklad co delas, jestli ty ledky tak tam je to jednoduche
jestli neco jineho tak nevim co presne napsat
pro zmenu smeru blikani ledek (viz tvuj priklad) treba tohle, jenom velice hruby nastrel
obsluha_ext_preruseni ()
{
if smer==vlevo
smer = vpravo
else smer = vlevo
}
hlavni_cyklus()
{
if smer==vlevo
port=hodnota_pro_levy_smer
else
port=hodnota_pro_pravy_smer
}
tohle si pred kazdym zapisem na port zkoukne hodnotu vlajky smer a podle toho se zaridi, vlajka smer se zmeni pri stisku tlacitka ve funkci obsluhy ext preruseni
V těchto programech s blikajícími ledkami zaberou nejvíc času čekací smyčky "wait".
Podprogram, i když má šedesát řádků, trvá bez čekacích smyček v řádu mikrosekund.
Proto pokud chceme rychlou reakci na tlačítko, stačí tlačítko testovat v krátkých intervalech uvnitř těchto smyček.
Když zjistíme stisknuté tlačítko, vrátíme se do hlavního programu a tam se rozhodne, který podprogram dál zavolat.
Je to samozřejmě jedno z více možných řešení.
Přikládám stručný příklad
Tlacitko Alias Pind.6
Dim State As Bit
Dim I As Word
Do
If Tlacitko = 0 Then
Toggle State
Waitms 100
End If
If State = 0 Then
Gosub Blik1
Else
Gosub Blik2
End If
While Tlacitko = 0 : Wend
Loop
End
'----------------------------------------------------------
Blik1:
Do
Incr Portb
'čekej 2000 ms a testuj tlačítko
For I = 1 To 2000
Waitms 1
If Tlacitko = 0 Then Exit Do
Next
Loop
Return
Snažím se udělat následující: Porty A,B,C výstup na LEDky, na každým pinu budou asi dvě přes tranzistor, Port A červený, port B zelený, port C modrý, to se ještě uvidí. ALe k samotnému programu. Chtěl bych asi tohle, zapnu zařízení svítí mi jen signalizační LED zapnuto. Stisknu tlačítko, rozjede se první program - blikají všechny červený (PortA), stisknu podruhé - druhej podprog. blikají všechny zelený (PortB), tlačítko potřetí, třetí podprog - bliká PortC tudíž modrý ledky. No a čtvrtej podprog běhá kruh doprava přes všechny barvy. No a teď řeším problém jak to ovládat tím tlačítkem. Na tohle jsem asi fakt uplnej mauglí, ale co bych chtěl, jsem v tomhle začátečník. Takže nějaké další nápady jak na realizaci? :-). Dělám na ATmega32 a zatím zkousím v Bascomu, už jsem vyzkoušel fůru různejch variant, ale pořád to není ono. Největší problém je v tom čtvrtym podprog. protože to je asi na 100 řádcích i s waitama a neumím se tu vůbec vymotat. Za každou radu budu vděčnej.
ovladani tlacitkem
obsluha_preruseni
{
//nastal stisk tlacitka, predpoklad je ze mas odfiltrovane zakmity
rezim = rezim+1
if rezim > maximalni_pocet_rezimu pak rezim=prvni_rezim_jaky_chces_mit
}
no a v hlavnim programu pak pred zapisem na port zkontrolujes hodnotu promenne rezim a podle toho se zaridis
treba vypnes ledky na portu a zacnes pracovat s portem b, dtto port c
pro program 4 bych zvolil 4B promennou (long, dword), treba stav_led, nastavil prvni bit na 1, ostatni na 0 a pak jenom shiftoval vlevo (nasobil 2)
potom port a by byl prvnich 8 bitu (port a = stav_led)
port b druhych 8 bitu (port b = stav_led shiftr 8) - nevim jak je to v basicu
port c tretich 8 bitu (port c = stav_led shiftr 16)
jakmile dosahnes hodnoty 16 777 216 nastavis onu promennou stav_led na 1 (zacinas od zacatku)
beru to tak ze nemas barvy na stridacku
pokud ano, resil bych to asi tabulkou
Podívej se sem, uvidíš tam kód i simulaci.
http://www.mp222.wz.cz/Global/bascom.swf.html
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Tlacitko so)t — založil gerry
Tlačítko C — založil Fíkus
Tlacitko a kopirovani — založil
Nefunkční tlačítko — založil Jan Grygerek
Focus na tlacitko — založil ja
Moderátoři diskuze