Prell
Prell
Helo!
Prell ellen milyen megoldások vannak szofveres úton? A waitms-re sajnos nincs idő, mivel a proci multiban hajt 12db 7seg kijelzőt. 10k felhúzó-ellennállás rajta a kapcsoláson (gondolkodtam még a kisebben, mondjuk 4k7) és egy 100n kondit kötöttem párba a nyomógombbal.
A gomb Int-re kötve, és minden egyes nyomásra egyel nő az int alatt lévő változó érték. változó értékétől függően ugrik a megfelelő programrészre.
Tisztelettel!
Prell ellen milyen megoldások vannak szofveres úton? A waitms-re sajnos nincs idő, mivel a proci multiban hajt 12db 7seg kijelzőt. 10k felhúzó-ellennállás rajta a kapcsoláson (gondolkodtam még a kisebben, mondjuk 4k7) és egy 100n kondit kötöttem párba a nyomógombbal.
A gomb Int-re kötve, és minden egyes nyomásra egyel nő az int alatt lévő változó érték. változó értékétől függően ugrik a megfelelő programrészre.
Tisztelettel!
Geht nicht, Gibt's nicht!
2x beolvasod valahol a főrutinban. és ha ugyanaz a kettő, akkor vagy megnyomott, vagy elengedett...
Ha egyszerűsítesz:
A kozbenso feladatok hossza ~0,5...2 msec.
Ha egyszerűsítesz:
Kód: Egész kijelölése
dim megnyom as byte
.
.
.
.
.
if pingomb=1 then megnyom.0=1 else megnyom.0=0
.
.
.
.
if pingomb=1 then megnyom.1=1 else megnyom.1=0
.
.
.
.
if pingomb=1 then megnyom.2=1 else megnyom.2=0
.
.
.
.
.
if megnyom=0 then ' NINCS megnyomva
.
end if
if megnyom=&B00000111 then ' megnyomva
.
end if
'minden egyeb ertek PRELL
Szia!
Ha már úgy is MXben hajtasz kijelzőt, gondolom valami TIMER megszakítással, akkor ott is beolvashatod a gombokat, a prell időzítést meg a Timer megszakítás ideje adja. Általában INT-ből használom a gombokat, kb így:
Gomb1-2-...= PINxx
Gomb1_old, Gomb1_akt...=bit
If Gomb1 = 0 Then '(testre záródó gombnál)
If Gomb1_old = 1 Then
Set Gomb1_akt
Set Nyomott
End If
End If
If Gomb2 = 0 Then
If Gomb2_old = 1 Then
Set Gomb2_akt
Set Nyomott
End If
End If
Gomb1_old=Gomb1
Gomb2_old=Gomb2
.......
Természetesen, ha a gombok egy porton sorban vannak, akkor sokkal gyorsabb/egyszerűbb néhány byte-művelettel az AKT (eredmény) bitek kialakítása. Az AKT bit=1, ha megnyomták a gombot, Neked kell törölni. A gomb fizikai szint bemenetét persze beolvashatod a Gomb1....PIN bitből, ha kell valamiért (autorepeat-hez pl.) A Nyomott=bit=1-et pl. csipogáshoz szoktam használni (bármit nyomott, 1-lesz)
Nem árt még egy ilyen rutin, pl. menüváltáskor, hogy az addigi benyomkodott (bebillent) bitek eltünjenek:
(rátenyerelés, össze-vissza nyomkodás)
AKT_NULL:
Reset Gomb1_akt
Reset Gomb2_akt
......
Return
Ha már úgy is MXben hajtasz kijelzőt, gondolom valami TIMER megszakítással, akkor ott is beolvashatod a gombokat, a prell időzítést meg a Timer megszakítás ideje adja. Általában INT-ből használom a gombokat, kb így:
Gomb1-2-...= PINxx
Gomb1_old, Gomb1_akt...=bit
If Gomb1 = 0 Then '(testre záródó gombnál)
If Gomb1_old = 1 Then
Set Gomb1_akt
Set Nyomott
End If
End If
If Gomb2 = 0 Then
If Gomb2_old = 1 Then
Set Gomb2_akt
Set Nyomott
End If
End If
Gomb1_old=Gomb1
Gomb2_old=Gomb2
.......
Természetesen, ha a gombok egy porton sorban vannak, akkor sokkal gyorsabb/egyszerűbb néhány byte-művelettel az AKT (eredmény) bitek kialakítása. Az AKT bit=1, ha megnyomták a gombot, Neked kell törölni. A gomb fizikai szint bemenetét persze beolvashatod a Gomb1....PIN bitből, ha kell valamiért (autorepeat-hez pl.) A Nyomott=bit=1-et pl. csipogáshoz szoktam használni (bármit nyomott, 1-lesz)
Nem árt még egy ilyen rutin, pl. menüváltáskor, hogy az addigi benyomkodott (bebillent) bitek eltünjenek:
(rátenyerelés, össze-vissza nyomkodás)
AKT_NULL:
Reset Gomb1_akt
Reset Gomb2_akt
......
Return
Én a következő kóddal zárom ki a prellt (ha nem kell ismétlődő gombnyomás funkció):
Ez megnyomás után egyszer lefuttatja a szubrutint, és addig nem csinál semmit mígy el nem engedem a gombot
Kód: Egész kijelölése
If Nyomogomb= 1 Then
If Prell = 0 then
Prell = 1
Gosub Nyomogomb szubrutin
End If
Else
Prell = 0
End If
Hasonlóan csináltam meg az infratávirányító prellt teljesen jól működik!DOGMAN írta:Én a következő kóddal zárom ki a prellt (ha nem kell ismétlődő gombnyomás funkció):
Ez megnyomás után egyszer lefuttatja a szubrutint, és addig nem csinál semmit mígy el nem engedem a gombotKód: Egész kijelölése
If Nyomogomb= 1 Then If Prell = 0 then Prell = 1 Gosub Nyomogomb szubrutin End If Else Prell = 0 End If
Ha már a bonyolúúútnál tartunk íme egy:
-------------------
Dim Gomb_rot As Byte 'SW shiftreg
Dim Mask As Byte 'Mennyi bit legyen aktiv, hogy kapcsoljon?
Dim Repeat_ct As Byte
Dim Seged As Byte 'Csak ugy kell
Const Repeat_ido = 5 'Ennyi nyomott ciklus utan ismetel
Dim Gomb_akt As Bit 'Elvezerelt gombnyomasra bebilleno
Dim Gombertek As Bit 'Prellmentesitett gombkijarat
Gomb_be Alias Pinc.0
Config Portc = Input
Eleje:
Gomb_rot = 0 'SW shiftreg nullazasa
Mask = &B00111111 'Pl. 6 raolvasas ha jo, akkor..jo
Repeat_ct = Repeat_ido 'Ha bekapcs kozben nyomna a gombot...
Olvasgatya:
If Gombertek = 1 Then 'Ha nyomja, autorepeat.
If Repeat_ct <> 0 Then Decr Repeat_ct 'Ha lehet, csokkentjuk
If Repeat_ct = 0 Then
Gomb_rot = 0 'Sokaig nyomta, repeat-elhet
Reset Gombertek 'Billegjen a repeat miatt
End If
End If
Rotate Gomb_rot , Left
If Gomb_be = 1 Then 'Nincs lenyomva
Repeat_ct = Repeat_ido 'Repeat ido ujratoltodik
Reset Gomb_rot.0 'Legalso bitbe a /gomb
Else
Set Gomb_rot.0 'Le van nyomva=1-es a SW shiftregbe
End If
Seged = Gomb_rot And Mask 'Betelt-e a pohar?
If Seged = Mask Then 'Be.
Set Gomb_akt 'Elvezerelt gomnyomasjelzo bebillent
Set Gombertek 'Statikus gombjelzo is bekapcs
End If
If Seged = 0 Then Reset Gombertek 'Elengedte a gombot vegre
Goto Olvasgatya
------------------------------------
Én az "Olvasgatya" gombbeolvasot betenném egy Timer megszakitasra, pl. 4MHz-ről Timer0=timer, prescale=1024 =kb 15Hz
A MASK azt adja meg, hogy hány azonos bitnek kell lenni, hogy elhiggyük az állapotot, ha girbe-gurba a bitfolyam, akkor a kimeneti "Gombertek" nem változik. Ha letelt az Autorepeat idő, akkor a leolvasás sebességével billentgeti a bitet. Sok gombnál, sok SW shiftreg kell persze.
-------------------
Dim Gomb_rot As Byte 'SW shiftreg
Dim Mask As Byte 'Mennyi bit legyen aktiv, hogy kapcsoljon?
Dim Repeat_ct As Byte
Dim Seged As Byte 'Csak ugy kell
Const Repeat_ido = 5 'Ennyi nyomott ciklus utan ismetel
Dim Gomb_akt As Bit 'Elvezerelt gombnyomasra bebilleno
Dim Gombertek As Bit 'Prellmentesitett gombkijarat
Gomb_be Alias Pinc.0
Config Portc = Input
Eleje:
Gomb_rot = 0 'SW shiftreg nullazasa
Mask = &B00111111 'Pl. 6 raolvasas ha jo, akkor..jo
Repeat_ct = Repeat_ido 'Ha bekapcs kozben nyomna a gombot...
Olvasgatya:
If Gombertek = 1 Then 'Ha nyomja, autorepeat.
If Repeat_ct <> 0 Then Decr Repeat_ct 'Ha lehet, csokkentjuk
If Repeat_ct = 0 Then
Gomb_rot = 0 'Sokaig nyomta, repeat-elhet
Reset Gombertek 'Billegjen a repeat miatt
End If
End If
Rotate Gomb_rot , Left
If Gomb_be = 1 Then 'Nincs lenyomva
Repeat_ct = Repeat_ido 'Repeat ido ujratoltodik
Reset Gomb_rot.0 'Legalso bitbe a /gomb
Else
Set Gomb_rot.0 'Le van nyomva=1-es a SW shiftregbe
End If
Seged = Gomb_rot And Mask 'Betelt-e a pohar?
If Seged = Mask Then 'Be.
Set Gomb_akt 'Elvezerelt gomnyomasjelzo bebillent
Set Gombertek 'Statikus gombjelzo is bekapcs
End If
If Seged = 0 Then Reset Gombertek 'Elengedte a gombot vegre
Goto Olvasgatya
------------------------------------
Én az "Olvasgatya" gombbeolvasot betenném egy Timer megszakitasra, pl. 4MHz-ről Timer0=timer, prescale=1024 =kb 15Hz
A MASK azt adja meg, hogy hány azonos bitnek kell lenni, hogy elhiggyük az állapotot, ha girbe-gurba a bitfolyam, akkor a kimeneti "Gombertek" nem változik. Ha letelt az Autorepeat idő, akkor a leolvasás sebességével billentgeti a bitet. Sok gombnál, sok SW shiftreg kell persze.