Prell

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
evildodo
Pákabűvész
Hozzászólások: 213
Csatlakozott: 2009. február 4. szerda, 7:00

Prell

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

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!
Geht nicht, Gibt's nicht!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

2x beolvasod valahol a főrutinban. és ha ugyanaz a kettő, akkor vagy megnyomott, vagy elengedett...

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
A kozbenso feladatok hossza ~0,5...2 msec.
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

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

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
Avatar
evildodo
Pákabűvész
Hozzászólások: 213
Csatlakozott: 2009. február 4. szerda, 7:00

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

Sziasztok!
Lehetséges az hogy egy fóliabillentyűzetnek 200ms-os prell-je legyen?

5V rendszer, GND-re vált, 10K felhúzó, + 100nF kondi a gombokkal párba
Geht nicht, Gibt's nicht!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Ha el van a felület oxidálódva. De ez akkor is nagyon brutális. A Prell 5-10 msec körül van....
Avatar
DOGMAN
Chipgyilok
Hozzászólások: 293
Csatlakozott: 2006. augusztus 27. vasárnap, 6:00

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

Én a következő kóddal zárom ki a prellt (ha nem kell ismétlődő gombnyomás funkció):

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
Ez megnyomás után egyszer lefuttatja a szubrutint, és addig nem csinál semmit mígy el nem engedem a gombot
Avatar
SirLeslie
Pákabűvész
Hozzászólások: 247
Csatlakozott: 2005. április 14. csütörtök, 6:00

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

DOGMAN írta:...
Ez megnyomás után egyszer lefuttatja a szubrutint, és addig nem csinál semmit mígy el nem engedem a gombot
Ez miért jobb a Bitwait-nál? (komolyan kérdezem)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Bonyolultabb :) .
Avatar
DOGMAN
Chipgyilok
Hozzászólások: 293
Csatlakozott: 2006. augusztus 27. vasárnap, 6:00

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

nemtom, :D az az igazság, hogy nem is olvastam el az előzőeket csak a témaindítót...
És ezt én kreáltam magamtól azért jobb :lol:
Avatar
SirLeslie
Pákabűvész
Hozzászólások: 247
Csatlakozott: 2005. április 14. csütörtök, 6:00

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

DOGMAN írta:nemtom, :D az az igazság, hogy nem is olvastam el az előzőeket csak a témaindítót...
És ezt én kreáltam magamtól azért jobb :lol:

Javagyúúúgy ;-)
Avatar
gerry
Chipgyilok
Hozzászólások: 252
Csatlakozott: 2005. október 11. kedd, 6:00

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

DOGMAN írta:Én a következő kóddal zárom ki a prellt (ha nem kell ismétlődő gombnyomás funkció):

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
Ez megnyomás után egyszer lefuttatja a szubrutint, és addig nem csinál semmit mígy el nem engedem a gombot
Hasonlóan csináltam meg az infratávirányító prellt teljesen jól működik!
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

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

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.
Válasz küldése