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 

Debounce
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
toncibalonci
Član
Član



Pridružen-a: Pet 03 Avg 2007 21:12
Prispevkov: 331
Aktiv.: 1.52
Kraj: Dravograd

PrispevekObjavljeno: Ned Maj 11, 2008 10:37 pm    Naslov sporočila:  Debounce Odgovori s citatom

Kako lahko najbolj enostavno naredim ,da mi bo pri pritisku na tipko ( z debounce ukazom) zagorela npr. dioda na P2.0 , če pa držim tipko npr. 3 sek pa neka druga dioda? Hvala
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
program_er
Član
Član



Pridružen-a: Sob 08 Mar 2008 13:47
Prispevkov: 2173
Aktiv.: 10.33
Kraj: Maribor (Pohorje)

PrispevekObjavljeno: Ned Maj 11, 2008 10:52 pm    Naslov sporočila:   Odgovori s citatom

Z Debounce bolj težko. Če bi hotel, bi moral na začetku konfigurirati ukaz debounce, koliko časa naj preverja. V tvojem primeru (3 sec) bi bil:
Config Debounce = 3000
Samo to bi potem veljalo za vse debounce ukaze v programu. Ti kar lepo z If-End naredi.

_________________
Upanje ni del naše projektne strategije.
Member of Trisat - 1. Slovenian satellite running new fault tolerant aerospace processor.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo MSN Messenger - naslov
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.01

PrispevekObjavljeno: Ned Maj 11, 2008 11:48 pm    Naslov sporočila:   Odgovori s citatom

Sem ti že zadnjič napisal, da preberi tistih 6 strani tem o AVR, LPC, x51.

Tule je bilo podobno: http://www.elektronik.si/phpBB2/viewtopic.php?t=9971
Samo malo prilagodi zadevo za svoje potrebe.

do
gosub Preveri_t
gosub VklopiIzh
loop

VklopiIzh:
if Tipka=1 && 10<Stevec<50
vklopi P2.0
else if Tipka=1 && 51<Stevec<200
izklopi P2.0
vklopi P2.1
Stevec=150 (da ostaneš notri)
end if
return

V Sprejeta pa Stevec = Stevec+1 in predelaj Sprejeta , da ne čaka, da spustiš tipko.
LP,
Igor

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
toncibalonci
Član
Član



Pridružen-a: Pet 03 Avg 2007 21:12
Prispevkov: 331
Aktiv.: 1.52
Kraj: Dravograd

PrispevekObjavljeno: Tor Maj 13, 2008 1:07 am    Naslov sporočila:   Odgovori s citatom

Naredil sem takole. Če samo pritisneš tipko zagori P1.0 dioda,če pa držiš tipko pa P1.7 dioda. A sem preveč zakompilciral??
Koda:
Dim Stevec As Byte
Stevec = 0

Do
Gosub Tipka
Loop

Tipka:
If P3.0 = 0 Then
Waitms 50
If P3.0 = 0 Then
Goto Steje
Else
Goto Kratka

Steje:
Incr Stevec
If Stevec > 10 Then
Gosub Dolga

End If
End If
End If
Return

Kratka:
P1.0 = 0
Wait 1
P1.0 = 1
Return

Dolga:
P1.7 = 0
Wait 1
P1.7 = 1
Stevec = 0
Return
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jurem
Član
Član



Pridružen-a: Tor 02 Dec 2003 15:53
Prispevkov: 408
Aktiv.: 1.72
Kraj: Ljubljana

PrispevekObjavljeno: Sre Maj 14, 2008 12:07 am    Naslov sporočila:   Odgovori s citatom

Oj,

poglej si članek, ki ga najdeš tukaj.

Članek je sicer namenjen AVR-jem, ampak princip pa lahko mirno uporabiš tudi v Bascom-8051

Lp
Jure
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3359
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Sre Maj 14, 2008 9:42 am    Naslov sporočila:  Jaz sem naredil tako, in dela dobro: Odgovori s citatom

Jaz sem naredil tako, in dela dobro:

Naredil sem časovni avtomat (timer), ki ga vklopim ali izklopim s pritiskom na tipko.
Zadeva vklaplja in izklaplja bojler pod kuhinjskim koritom.
Nalogo sem zastavil tako:
Če je pritisk na tipko kratek, naj se bojler vklopi za 15 minut.
Če držim tipko eno sekundo, naj se bojler vklopi za 30 minut
Če držim tipko dve sekundi, naj se bojler vklopi za 60 minut in končam z
če držim tipko tri sekunde, naj se bojler vklopi za 120 minut.

Če je bojler vlopljen, ko pritisnem tipko, naj se izklopi.

V ta namen potrebujem merilnik časa, in uporabi časovno prekinitev, (timer interrupt).
Delal sem za AT89C2051 in z resonatorjem 12 MHz.
Če krmilim časovno prekinitev tako:
Koda:
' Nastavimo timer interrupt:
' Če je frekvenca krislata f je timerenota 12/f
' Do prekinitve pride po
'      1 timerenot   krat vrednost load pri mode je  2
'     32 timerenot   krat vrednost load pri mode je  0
'    256 timerenot   krat vrednost load pri mode je  1
Config Timer0 = Timer , Gate = Internal , Mode = 0
On Timer0 Titi
Load Timer0 , 250
Enable Timer0
Start Timer0
Enable Interrupts

Zadeva velja seveda za mikroprocesorje družine 8051, za AVR je podobno, a drugače.
Na ta način se dobi prekinitev v času ki je 1/125 sekunde. Če torej hočemo sekundo, si moramo pomagati s števcem, ki bo štel do 125:

Koda:
Do
   ' upravljanje s časom
   If Tistevec > 125 Then
      Tistevec = Tistevec - 125
      Incr Sekunde
      If Sekunde > 59 Then
         Sekunde = Sekunde - 60
         If Minute <> 0 Then
            Decr Minute
         End If
      End If
.... nadaljevanje glavne programske zanke
loop


Kot vidite, štejem minute proti ničli vse dokler ne pride do nič. Ta števec krmili rele. Če je ta števec na 0, je rele izklopljen, če ni na nič, je rele vkloljen:
Koda:
   ' krmiljenje releja in diode
   If Minute <> 0 Then
      Set Rele : Reset Dioda
   Else
      Reset Rele : Set Dioda
   End If

(Dioda je optični pokazatelj stanja naprave)

In sedaj še odtipavanje tipke:
Ko pritisnem na tipko, pritisk zaznam z Debounce, izklopim rele, če je vklopljen oziroma vklopim za 15 minut, če je izklopljen. To naredim posredno tako, da postavim števec minute na določeno vrednost:
Koda:
   ' Odtipavanje tipke:
   Config Debounce = 25
   Debounce Tipka , 0 , Tipkarut
   Goto Izzatipkarut
   Tipkarut:
      If Minute = 0 Then
         Minute = 15
         Sekunde = 0
         Tistevec = 0
      Else
         Minute = 0
      End If
   Izzatipkarut:

Koda:
  ' Sedaj Pa še Preverjamo , Koliko časa Je Tipka Pritisnjena:
   If Tipka = 0 And Minute <> 0 And Sekunde = 1 Then
      Minute = 30
   End If
   If Tipka = 0 And Minute <> 0 And Sekunde = 2 Then
      Minute = 60
   End If
   If Tipka = 0 And Minute <> 0 And Sekunde = 3 Then
      Minute = 120
   End If
Loop


No, in da bo kompletno, še prekinitveni podprogram:

Koda:
Titi:
Load Timer0 , 250
Incr Tistevec
Return

_________________
Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
toncibalonci
Član
Član



Pridružen-a: Pet 03 Avg 2007 21:12
Prispevkov: 331
Aktiv.: 1.52
Kraj: Dravograd

PrispevekObjavljeno: Sre Maj 14, 2008 10:37 pm    Naslov sporočila:   Odgovori s citatom

Hvala Vilko,tvoja verzija mi bo zelo koristila. Jaz sem to naredil bolj po "kmečko" ampak vseeno dela.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3359
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Sre Maj 14, 2008 10:48 pm    Naslov sporočila:  No Odgovori s citatom

No pa kar korajžno pokaži, kaj si naštrikal!
_________________
Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
toncibalonci
Član
Član



Pridružen-a: Pet 03 Avg 2007 21:12
Prispevkov: 331
Aktiv.: 1.52
Kraj: Dravograd

PrispevekObjavljeno: Sre Maj 14, 2008 11:14 pm    Naslov sporočila:   Odgovori s citatom

Poglej malo višje. Rolling Eyes Namesto diod sem dal za kratek pritisk branje eproma,za daljši pa pisanje eproma. Seveda pri prekinitvi lahko lažje nastaviš čas.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3359
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Čet Maj 15, 2008 5:30 am    Naslov sporočila:  Priporočam Odgovori s citatom

Priporočam, da se naučiš uporabljati timer. Ko ga enkrat obvladaš, ga uporabljaš povsod in ti olajša delo.

vsakokrat, ko programiraš wait, tedaj mikroprocesor nič ne dela, tudi tipke ne odtipava. In to je lahko moteče.

Seveda, če imaš namen večkrat kaj programirati. Če potrebuješ samo izpit ali seminarsko nalogo, je cilj programiranja popolnoma nekaj drugega.

_________________
Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
toncibalonci
Član
Član



Pridružen-a: Pet 03 Avg 2007 21:12
Prispevkov: 331
Aktiv.: 1.52
Kraj: Dravograd

PrispevekObjavljeno: Čet Maj 15, 2008 11:08 pm    Naslov sporočila:   Odgovori s citatom

Seveda imam namen večkrat kaj programirati,le naučiti se še moram veliko,časa imam pa več kot premalo,zato poteka vse bolj počasi. Nisem v skupini "seminarska-izpit" ! Shame on you
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
toncibalonci
Član
Član



Pridružen-a: Pet 03 Avg 2007 21:12
Prispevkov: 331
Aktiv.: 1.52
Kraj: Dravograd

PrispevekObjavljeno: Pet Maj 16, 2008 1:05 am    Naslov sporočila:   Odgovori s citatom

Spet problem. Uporabil sem Vilkonov program,kratek pritisk bere eprom,dolgi pritisk piše eprom. Zakaj pa mi ko tipkam številke,le te kar sam zapisuje v eprom? Če pritisnem npr. 3 se ta kar sama shrani v eprom brez da bi pritisnil tipko za vpis. Tipkovnica je matrična.
Koda:
$crystal = 12000000

Config Timer0 = Timer , Gate = Internal , Mode = 0
On Timer0 Timer0isr Nosave
Enable Interrupts
Enable Timer0
Start Timer0
Load Timer0 , 250

Dim Tistevec As Byte
Tipka Alias P3.0
Dim Preveri As Byte
Dim Vrednost As Byte
Dim Cifra As Integer
Dim Pom As Byte
Dim Ee_adr As Byte
Cifra = 0

'-------------------------------------------------------------------------------
Config Sda = P1.5
Config Scl = P1.2
'-------------------------------------------------------------------------------

Kolona1 Alias P2.5
Kolona2 Alias P2.4
Kolona3 Alias P2.3

'-------------------------------------------------------------------------------

Stolp1 Alias P2.2
Stolp2 Alias P2.1
Stolp3 Alias P2.0
Stolp4 Alias P2.6
'-------------------------------------------------------------------------------


Do

Debounce Tipka , 0 , Nekaj , Sub

Gosub Preveri_t

Pom = Cifra / 100
Pom = Lookup(pom , Stevilke)
P0 = Pom
P1.4 = 0
Waitms 2
P1.4 = 1
Pom = Cifra Mod 100
Pom = Pom / 10
Pom = Lookup(pom , Stevilke)
P0 = Pom
P1.3 = 0
Waitms 2
P1.3 = 1
Pom = Cifra Mod 10
Pom = Lookup(pom , Stevilke)
P0 = Pom
P1.0 = 0
Waitms 2
P1.0 = 1

Nekaj:

If Tipka = 1 Then
      Tistevec = 0
   Else
       Gosub Beri_ee
      If Tistevec > 125 Then
         Gosub Pisi_ee
         End If

   End If

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



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3359
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Pet Maj 16, 2008 7:06 am    Naslov sporočila:  Takole Odgovori s citatom

Takole, na hitro vidim sledeče, kar mislim, da je narobe:


Koda:
Do

Debounce Tipka , 0 , Nekaj , Sub

Gosub Preveri_t

....  Ukazi ....  bi morali biti verjetno zaključeni z Loop, saj se sedaj
začne podprogram:


Nekaj:

If Tipka = 1 Then
      Tistevec = 0
   Else
       Gosub Beri_ee
      If Tistevec > 125 Then
         Gosub Pisi_ee
         End If

   End If
... Podprogram bi moral biti verjetno zaključen z Return in ne Loop
  ... ali pa pri debounce ne bi smel biti parameter , SUB

Loop

.. In ne vidim podprograma  Preveri_t


Tudi ne vidim, kje se Tistevec postavlja na 0.

In zelo nevarno je uporabiti Nosave pri deklaraciji interrupt podprograma.
Le tega tudi ne vidim, kaj je v njem. Čim je v njem kak IF stavek ali kaka spremenljivka, ki ni tipa bajt, se Nosave ne smre uporabljati, razen, če poznaš interne potrebe po registrih mikroprocesorja in v svojem prekinitvenem podprogramu sam poskrbiš za njih reševanje na stack in nazaj

_________________
Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3359
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Pet Maj 16, 2008 7:14 am    Naslov sporočila:  Pa še to Odgovori s citatom

Pa še to, (videl naknadno)

v debounce podprogramu pišeš:

Koda:
Nekaj:
If Tipka = 1 Then
      Tistevec = 0
   Else
       Gosub Beri_ee
      If Tistevec > 125 Then
         Gosub Pisi_ee
         End If

   End If


Ta podprogram ne bo dočakal if Tipka = 1.
ta podprogram se starta, ko tipka preskoči na 0 in potem takoj zapusti. Pravilno je, da v tem podprogramu postaviš tištevec na 0, toda preverjanje, ali je tipka pritisnjena eno sekundo je potrebno narediti v glavnem programu:

Koda:
Nekaj:
    Tistevec = 0
 return

v glavnem programu pa
    if Tistevec = 125 and tipka = 0 then
       potem veš, da je tipka pritisnjena celo sekundo.

sicer pa bi moral se bolj poglobiti v program, da bi videl kaj delaš. Pa toliko časa nimam, mislim, da boš že sam se skopal ven s tem, kar sem ti pomagal.

_________________
Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
toncibalonci
Član
Član



Pridružen-a: Pet 03 Avg 2007 21:12
Prispevkov: 331
Aktiv.: 1.52
Kraj: Dravograd

PrispevekObjavljeno: Pon Maj 19, 2008 8:15 pm    Naslov sporočila:   Odgovori s citatom

Spet malo časa za Bascom in spet me nekaj j***. Kot sem že napisal bi rad z kratkim pritiskom na tipko prebral eprom , z dalšim pa vpisal podatek. Spodnji program sicer dela in zame zadostuje,vseeno pa bi rad vedel kako bi lahko naredil brez tiste pavze "waitms 20" in z uporabo debounce? Vilko mi je sicer pokazal (hvala Vilko) ampak mi nekako ne potegne. Če se komu da še malo razlagat? Hvala
Koda:
$crystal = 12000000

Config Timer0 = Timer , Gate = Internal , Mode = 0
On Timer0 Timer0isr
Load Timer0 , 250
Enable Timer0
Start Timer0
Enable Interrupts
Start Timer0

Dim Stevec As Byte
Tipka Alias P3.0

Do

If Tipka = 1 Then
Stevec = 0

Else
Waitms 20
If Tipka = 0 Then
Gosub Steje

Else
P3.5 = 0
Waitms 100
P3.5 = 1
End If
End If

Steje:
If Stevec > 125 Then
P3.7 = 0
Wait 2
P3.7 = 1
End If

Loop


Timer0isr:
load timer,250
Incr Stevec
Return
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51 Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
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: 493 dni


Powered by phpBB © 2001, 2005 phpBB Group