 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
toncibalonci Član

Pridružen-a: Pet 03 Avg 2007 21:12 Prispevkov: 331 Aktiv.: 1.52 Kraj: Dravograd
|
Objavljeno: Ned Maj 11, 2008 10:37 pm Naslov sporočila: Debounce |
|
|
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 |
|
 |
program_er Član


Pridružen-a: Sob 08 Mar 2008 13:47 Prispevkov: 2173 Aktiv.: 10.33 Kraj: Maribor (Pohorje)
|
Objavljeno: Ned Maj 11, 2008 10:52 pm Naslov sporočila: |
|
|
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 |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.01
|
Objavljeno: Ned Maj 11, 2008 11:48 pm Naslov sporočila: |
|
|
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 |
|
 |
toncibalonci Član

Pridružen-a: Pet 03 Avg 2007 21:12 Prispevkov: 331 Aktiv.: 1.52 Kraj: Dravograd
|
Objavljeno: Tor Maj 13, 2008 1:07 am Naslov sporočila: |
|
|
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 |
|
 |
jurem Član


Pridružen-a: Tor 02 Dec 2003 15:53 Prispevkov: 408 Aktiv.: 1.72 Kraj: Ljubljana
|
Objavljeno: Sre Maj 14, 2008 12:07 am Naslov sporočila: |
|
|
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 |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3360 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Sre Maj 14, 2008 9:42 am Naslov sporočila: Jaz sem naredil tako, in dela dobro: |
|
|
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 |
|
 |
toncibalonci Član

Pridružen-a: Pet 03 Avg 2007 21:12 Prispevkov: 331 Aktiv.: 1.52 Kraj: Dravograd
|
Objavljeno: Sre Maj 14, 2008 10:37 pm Naslov sporočila: |
|
|
Hvala Vilko,tvoja verzija mi bo zelo koristila. Jaz sem to naredil bolj po "kmečko" ampak vseeno dela. |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3360 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Sre Maj 14, 2008 10:48 pm Naslov sporočila: No |
|
|
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 |
|
 |
toncibalonci Član

Pridružen-a: Pet 03 Avg 2007 21:12 Prispevkov: 331 Aktiv.: 1.52 Kraj: Dravograd
|
Objavljeno: Sre Maj 14, 2008 11:14 pm Naslov sporočila: |
|
|
Poglej malo višje. 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 |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3360 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Čet Maj 15, 2008 5:30 am Naslov sporočila: Priporočam |
|
|
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 |
|
 |
toncibalonci Član

Pridružen-a: Pet 03 Avg 2007 21:12 Prispevkov: 331 Aktiv.: 1.52 Kraj: Dravograd
|
Objavljeno: Čet Maj 15, 2008 11:08 pm Naslov sporočila: |
|
|
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" !  |
|
Nazaj na vrh |
|
 |
toncibalonci Član

Pridružen-a: Pet 03 Avg 2007 21:12 Prispevkov: 331 Aktiv.: 1.52 Kraj: Dravograd
|
Objavljeno: Pet Maj 16, 2008 1:05 am Naslov sporočila: |
|
|
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 |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3360 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Pet Maj 16, 2008 7:06 am Naslov sporočila: Takole |
|
|
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 |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3360 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Pet Maj 16, 2008 7:14 am Naslov sporočila: Pa še to |
|
|
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 |
|
 |
toncibalonci Član

Pridružen-a: Pet 03 Avg 2007 21:12 Prispevkov: 331 Aktiv.: 1.52 Kraj: Dravograd
|
Objavljeno: Pon Maj 19, 2008 8:15 pm Naslov sporočila: |
|
|
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 |
|
 |
|
|
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
|