Hlídání délky stisku tlačítka
-
- Příspěvky: 85
- Registrován: 02 úno 2014, 02:12
Hlídání délky stisku tlačítka
Zdravím všechny zúčastněné.
Měl bych takovej dotaz...
Potřebuju vytvořit program (20M2) , který mi bude hlídat délku stisku tlačítka.
Měl by fungovat tak, že na 2 výstupy bude připojenej motor s převodovkou (přes H most).
Na jednom vstupu bude tlačítko. Pokud tlačítko zmačknu, tak se roztočí motor jedním směrem a bude se točit po celou dobu stisku. Když tlačítko pustím, tak potřebuju ten čas kterej bylo zmačklý uložit do paměti (RAM). Po několika sekundách se motor roztočí zpět na tu samou dobu co se točil předtím. V podstatě do stejný polohy, jako byl na začátku. Vím že pokud tam není snímání polohy, tak přesnost navrácení bude +-, ale to mi nevadí. Nějak nevím jak začít, poradí někdo?
Na tuhle samotnou fci by stačil i 08M2, ale jelikož těch fcí bude ve finále víc, proto 20M2.
Díky moc všem
Měl bych takovej dotaz...
Potřebuju vytvořit program (20M2) , který mi bude hlídat délku stisku tlačítka.
Měl by fungovat tak, že na 2 výstupy bude připojenej motor s převodovkou (přes H most).
Na jednom vstupu bude tlačítko. Pokud tlačítko zmačknu, tak se roztočí motor jedním směrem a bude se točit po celou dobu stisku. Když tlačítko pustím, tak potřebuju ten čas kterej bylo zmačklý uložit do paměti (RAM). Po několika sekundách se motor roztočí zpět na tu samou dobu co se točil předtím. V podstatě do stejný polohy, jako byl na začátku. Vím že pokud tam není snímání polohy, tak přesnost navrácení bude +-, ale to mi nevadí. Nějak nevím jak začít, poradí někdo?
Na tuhle samotnou fci by stačil i 08M2, ale jelikož těch fcí bude ve finále víc, proto 20M2.
Díky moc všem
Re: Hlídání délky stisku tlačítka
Ahoj. Podobné věci se už řešily i tady na fóru. Dá se to najít přes políčko "Hledej" vpravo nahoře. Abys ale mohl přímo začít, tak odpovím obecně (a stejně jako před pár týdny v jiném zdejším tématu).
Pokud Ti stačí rozlišení a přesnost cca na celé vteřiny, tak u PICAXE řady M2 lze využít interní proměnnou "time" (ta se automaticky inkrementuje vždy po jedné vteřině).
Obecně a univerzálně lze čas pomocí PICAXE odměřovat například podmíněnou smyčkou s definovanou dobou cyklu (třeba 0,1 sec pomocí "pause 100"). Ve smyčce se bude inkrementovat nějaká proměnná, takže po vyskočení ze smyčky (podmínkou např. na změnu stavu vstupního pinu po uvolnění připojeného tlačítka) bude proměnná obsahovat změřený čas (musí se ošetřit aby proměnná "nepřetekla"). Ta hodnota se pak může použít v další smyčce k řízení motoru a odměřování času po "desetinách sekundy". Rozlišení i přesnost lze nastavit hodnotou za "pause". Nebude to nic moc přesného, ale pro běžné použití by to mělo vyhovovat.
Pokud Ti stačí rozlišení a přesnost cca na celé vteřiny, tak u PICAXE řady M2 lze využít interní proměnnou "time" (ta se automaticky inkrementuje vždy po jedné vteřině).
Obecně a univerzálně lze čas pomocí PICAXE odměřovat například podmíněnou smyčkou s definovanou dobou cyklu (třeba 0,1 sec pomocí "pause 100"). Ve smyčce se bude inkrementovat nějaká proměnná, takže po vyskočení ze smyčky (podmínkou např. na změnu stavu vstupního pinu po uvolnění připojeného tlačítka) bude proměnná obsahovat změřený čas (musí se ošetřit aby proměnná "nepřetekla"). Ta hodnota se pak může použít v další smyčce k řízení motoru a odměřování času po "desetinách sekundy". Rozlišení i přesnost lze nastavit hodnotou za "pause". Nebude to nic moc přesného, ale pro běžné použití by to mělo vyhovovat.
-
- Příspěvky: 85
- Registrován: 02 úno 2014, 02:12
Re: Hlídání délky stisku tlačítka
Díky Aleši. No já hledal, ale jediný co jsem našel je tohle viewtopic.php?f=14&t=226&p=1191&hilit=d ... isku#p1191 a tam toho moc není...
Na vteřiny je to moc hrubě, desetiny by šly. Jak prosím vypadá "podmíněná smyčka" ? Mohl bys sem hodit aspoň náznak? Díky.
Na vteřiny je to moc hrubě, desetiny by šly. Jak prosím vypadá "podmíněná smyčka" ? Mohl bys sem hodit aspoň náznak? Díky.
Re: Hlídání délky stisku tlačítka
Souslovím "podmíněná smyčka" mám na mysli programovou smyčku, která se ukončí po splnění nějaké podmínky (například po uvolnění stisku tlačítka). Níže posílám základní ukázkový příklad (je to jen část Tvého zadání, jen princip měření času).
Kód: Vybrat vše
#picaxe 20M2
#no_data
symbol cas = w0 ; pocitadlo casu (doby stisknuti tlacitka)
symbol tlacitko = pinB.0 ; definice pinu kam je pripojeno tlacitko
do
do loop while tlacitko=0 ; cekame na zacatek stisku tlacitka
cas = 0 ; nulujeme citac casu
do
inc cas ; zvysime pocitadlo casu
pause 100 ; odmerujeme casovou jednotku (100ms)
loop while tlacitko=1 ; cekame na konec stisku tlacitka
; v promenne cas je doba stisknuti tlacitka
sertxd("Tlacitko bylo stisknuto ",#cas," desetin vteriny",CR,LF)
; dale muzeme "cas" vyuzit pro odmerovani doby jine udalosti
pause 5000
loop ; nekonecna smycka
-
- Příspěvky: 85
- Registrován: 02 úno 2014, 02:12
Re: Hlídání délky stisku tlačítka
Zatím díky, snad se o víkend dostanu k vyzkoušení.
-
- Příspěvky: 85
- Registrován: 02 úno 2014, 02:12
Re: Hlídání délky stisku tlačítka
Tak jsem program vytvořil, ale tradičně má pár mušek, s kterýma bych potřeboval pomoci...
Je tam pár úprav proti původnímu zadání (třeba PWM, ke snížení otáček, "trochu jinak piny" a jenom malej detail 08M2... ) , ale k těm mouchám:
Když po zapnutí zmačknu první tlačítko swset a nastavím čas, tak to vypadá, že je všechno ok. Pokud ale nejdřív přepnu spínač in1, tak mi to za chvíli v simulaci napíše přeplnění. Je to řádkem 82... Potřebuju prostě funkci když (po zapnutí) není nastavenej čas, tak aby to při sepnutí spínače in1 nedělalo nic...
Další tuning bych viděl v tom, že by si to čas pamatovalo i po vypnutí napájení (čímž by se asi vyřešila i ta první moucha), takže zápis do EEPROM. Mohl byste na to please někdo kouknout odborným okem? Díky moc předem.
Je tam pár úprav proti původnímu zadání (třeba PWM, ke snížení otáček, "trochu jinak piny" a jenom malej detail 08M2... ) , ale k těm mouchám:
Když po zapnutí zmačknu první tlačítko swset a nastavím čas, tak to vypadá, že je všechno ok. Pokud ale nejdřív přepnu spínač in1, tak mi to za chvíli v simulaci napíše přeplnění. Je to řádkem 82... Potřebuju prostě funkci když (po zapnutí) není nastavenej čas, tak aby to při sepnutí spínače in1 nedělalo nic...
Další tuning bych viděl v tom, že by si to čas pamatovalo i po vypnutí napájení (čímž by se asi vyřešila i ta první moucha), takže zápis do EEPROM. Mohl byste na to please někdo kouknout odborným okem? Díky moc předem.
Kód: Vybrat vše
#picaxe 08M2
' PICAXE 08M2 polohovani motoru
' 25.6.2014
init:
low C.2
low C.1
low C.0
pullup %11000 'nastaveni pullup odporu na C.3 a C.4
pause 200
symbol swset = pinC.4 'tlacitko nastaveni
symbol in1 = pinC.3 'spinac polohovani
symbol vystup = C.2 'vystup PWM
symbol Re2 = C.1 'vystup Re2
symbol Re1 = C.0 'vystup Re1
symbol cas = w0
symbol odpocet= w1
pause 200
smycka:
if swset=1 then
pause 50
gosub nastaveni
pause 50
elseif in1=1 then
pause 50
gosub polohovani
pause 50
endif
pause 100
goto smycka
nastaveni:
do loop while swset=0 'zacatek stisku tlacitka na C.4
pause 50
PWMOUT vystup,150,100 'zapne PWM na C.2
pause 50
high Re1 'zapne Re1 na C.0
pause 50
do
inc cas 'do w0 pricte 1
pause 100
loop while swset=1 'dokud je stisknute tlacitko na C.4 pricita 100 ms
pause 50
low Re1 'vypne Re1 na C.0
pause 2000
high Re2 'zapne Re2 na C.1
pause 50
odpocet=0 ;vynuluje w1
navrat:
inc odpocet ;do w1 pricte 1
pause 100
IF odpocet<cas THEN goto navrat ;pokud je w1 mensi nez w0 skoci na navrat
pause 50
low Re2 'vypne Re2 na C.1
pause 50
PWMOUT vystup,OFF 'vypne PWM na C.2
pause 50
Return
polohovani:
IF cas=0 THEN goto smycka ;pokud neni nastaven cas skoci na smycka
do loop while in1=0 'zapnuti spinace polohovani
pause 50
PWMOUT vystup,150,100 'zapne PWM na C.2
pause 50
high Re1 'zapne Re1
pause 50
odpocet=0
poloha1:
inc odpocet ;do w1 pricte 1
pause 100
IF odpocet<cas THEN goto poloha1 ;pokud je w1 mensi nez w0 skoci na poloha1
pause 50
low Re1 'vypne Re1 na C.0
pause 50
do loop while in1=1 'ceka na vraceni spinace
pause 50
high Re2 'zapne Re2 na C.1
pause 50
odpocet=0
poloha0:
inc odpocet ;do w1 pricte 1
pause 100
IF odpocet<cas THEN goto poloha0 ;pokud je w1 mensi nez w0 skoci na poloha0
pause 50
low Re2 'vypne Re2 na C.1
pause 50
PWMOUT vystup,OFF 'vypne PWM na C.2
pause 50
Return
end
Re: Hlídání délky stisku tlačítka
Ahoj. To "přeplnění" nastává proto, že dojde k příliš velkému počtu volání "gosub" bez "return". Z podprogramů, volaných pomocí "gosub" se nikdy nesmí vyskakovat pomocí "goto <někam ven z podprogramu>" ale vždy jedině pomocí "return". Ve Tvém případě tedy lze tomu "přeplnění" zabránit úpravou kódu např. takto:
S EEPROM se v PICAXE pracuje pomocí příkazů "read" a "write", takže pro načtení uložené hodnoty je možno použít např. vložený kód:
Pro uložení nastavené hodnoty pak stačí po ukončení stisku tlačítka dát ten příkaz "write", např. takto:
Aby to ale celé správně fungovalo, tak v programu ještě musí být vhodně umístěno nulování proměnné "cas", např. těsně po začátku stisku tlačítka "swset":
Kód: Vybrat vše
...
polohovani:
if cas=0 then
return ; tady nesmi byt "goto ven"
endif
...
Kód: Vybrat vše
...
read 0, word cas ; zkusime nacist "cas" z EEPROM (z pozice 0)
if cas>65000 then
cas = 0 ; nevim, jestli jsou v nepouzite EEPROM na zacatku nuly nebo jednicky, tak timhle to osetrime
endif
smycka:
...
Kód: Vybrat vše
...
loop while swset=1 'dokud je stisknute tlacitko na C.4 pricita 100 ms
write 0, word cas ; ulozime "cas" do EEPROM (na pozici 0)
...
Kód: Vybrat vše
...
nastaveni:
do loop while swset=0 'zacatek stisku tlacitka na C.4
cas = 0 ; tady musime "cas" vynulovat, aby se nepricital k predchozi zaznamenane hodnote
...
-
- Příspěvky: 85
- Registrován: 02 úno 2014, 02:12
Re: Hlídání délky stisku tlačítka
Díky Aleši, ty nikdy nezklameš. Večer to snad potuním.