Hlídání délky stisku tlačítka

Odpovědět
Pepa z depa
Příspěvky: 85
Registrován: 02 úno 2014, 02:12

Hlídání délky stisku tlačítka

Příspěvek od Pepa z depa »

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
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Hlídání délky stisku tlačítka

Příspěvek od AlesH »

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.
Pepa z depa
Příspěvky: 85
Registrován: 02 úno 2014, 02:12

Re: Hlídání délky stisku tlačítka

Příspěvek od Pepa z depa »

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.
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Hlídání délky stisku tlačítka

Příspěvek od AlesH »

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
Pepa z depa
Příspěvky: 85
Registrován: 02 úno 2014, 02:12

Re: Hlídání délky stisku tlačítka

Příspěvek od Pepa z depa »

Zatím díky, snad se o víkend dostanu k vyzkoušení.
Pepa z depa
Příspěvky: 85
Registrován: 02 úno 2014, 02:12

Re: Hlídání délky stisku tlačítka

Příspěvek od Pepa z depa »

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... :D ) , 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

	
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Hlídání délky stisku tlačítka

Příspěvek od AlesH »

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:

Kód: Vybrat vše

...
polohovani:
if cas=0 then
  return          ; tady nesmi byt "goto ven"
endif
...
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:

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:
...
Pro uložení nastavené hodnoty pak stačí po ukončení stisku tlačítka dát ten příkaz "write", např. takto:

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)
...
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

...
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
...
Pepa z depa
Příspěvky: 85
Registrován: 02 úno 2014, 02:12

Re: Hlídání délky stisku tlačítka

Příspěvek od Pepa z depa »

Díky Aleši, ty nikdy nezklameš. Večer to snad potuním.
Odpovědět