Obsluha tlačítka

CZMartin_k
Příspěvky: 61
Registrován: 29 kvě 2014, 17:04

Re: Obsluha tlačítka

Příspěvek od CZMartin_k »

Jasně, to sem dám určitě i video.
Zkoušel jsem ještě k tomu připojit LCD display, podle návodu jsem ho připojil a programoval, jenže to neni podle mojich představ...
Text, co tam zadávám je pouze na jednom řádku a nepodařilo se mi tam dát text na druhý, třetí a čtvrtý řádek (mám LCD 4x20) a navíc jak tam vůbec přidám nějaké proměnné, aby mi to ukazovalo nějaký status?
program, co mám:

Kód: Vybrat vše


	
	EEPROM 0,("Projektor nocni oblohy") 
		
	gosub init 			
	
main:		
	let b1 = 1 			
	gosub wrins 		
		 	
	let b1 = 12 		
	gosub wrins 		
	 		
	For b0 = 0 to 15		
		read b0, b1       
		gosub wrchr       
	Next b0
	
	pause 400		
	goto main 		
	end

init:
	let pinsB = 0 		
	let b3 = 0 		
	let dirsB = 252   	
	pause 200 			
	let pinsB = 48    	
	pulsout B.3,1 		
	pause 10 			
	pulsout B.3,1 	
	pulsout B.3,1 		
	let pinsB = 32    	
	pulsout B.3,1 	
	pulsout B.3,1 	
	let pinsB = 128   
	pulsout B.3,1 	
	let b1 = 14 		
	gosub wrins 	
	return
	
wrchr: 
	let pinsB = b1 & 240	
	high B.2 			
	pulsout B.3,1 		
	let b2 = b1 * 16       	
	let pinsB = b2 & 240    
	high B.2 			
	pulsout B.3,1 		
	return
	
wrins: 
	let pinsB = b1 & 240    
	pulsout B.3,1 		
	let b2 = b1 * 16       	
	let pinsB = b2 & 240   	
	pulsout B.3,1 		
	high B.2 			
	return
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Obsluha tlačítka

Příspěvek od AlesH »

Pohledal jsem trochu na internetu a pokud to dobře chápu, tak ty LCD displeje se ovládají posíláním příkazových kódů (pomocí "gosub wrins"). Seznam základních řídicích kódů je např. na stránce http://www.ddmjihlava.cz/elektro/navody/picaxe_03.html . Takže např. b1=1 (a pak "gosub wrins") znamená "smaž LCD a nastav kurzor na 1. pozici", b1=12 znamená "skryj kurzor" ... atd. Pro posuny kurzoru slouží kódy 128 (1. řádek), 192 (2. řádek), 160 (3. řádek) a 224 (4. řádek). Pro posílání hodnot na LCD musíš ty hodnoty převést na ASCII kódy a ty pak poslat na LCD přes proměnnou b1 a volání "gosub wrchr". Převod čísel na ASCII kódy lze v PICAXE Basicu udělat například příkazem "bintoascii". Další informace jsou v PICAXE PDF manuálech a také např. na http://galia.fc.uaslp.mx/~cantocar/micr ... FACING.HTM nebo na https://student.sps-prosek.cz/~valero08 ... /jenda.bas .
CZMartin_k
Příspěvky: 61
Registrován: 29 kvě 2014, 17:04

Re: Obsluha tlačítka

Příspěvek od CZMartin_k »

Ty LCD jsou celkem těžký. Jinak jsi nemusel k vůli mně hledat na netu, já jen myslel, že to víš a stručně bys mi to popsal svými slovy, ale nevadí a děkuji. S nima ještě budu chvíli zápasit. Ale teď dělám ovládání sedmisegmentovky s obvodem 4026 a nechce se mi to nahrát do procesoru. Je chyba na tom řádku "for b1 = b0", b1 je proměnná přímo pro ten cyklus a b0 je proměnná do který se zapíše mód, který je spuštěn (prostě to počítá stisky tlačítka) a pokud zmáčknu tlačítko třeba 5x, tak potřebuju, aby se před skokem na ten mód 5 ještě zobrazila 5 na sedmisegmentovém display, nevěděl by jsi, co s tím? C.0 - resetuje obvod 4026 a C.4 jsou hodiny.

Kód: Vybrat vše

if b0 = 1 then 
    pulsout C.0, 10
    for b1 = b0
      pulsout C.4, 10
    mext b1
    goto red
//EDIT:
Já jsem debil :D už mi to funguje :)

Kód: Vybrat vše

if b0 = 1 then 
    pulsout C.0, 10
    for b1 = 0 to b0
      pulsout C.4, 10
    next b1
    goto red
  endif
CZMartin_k
Příspěvky: 61
Registrován: 29 kvě 2014, 17:04

Re: Obsluha tlačítka

Příspěvek od CZMartin_k »

Ohledně toho displaye si nevím rady s tím "let pinsB, let dirsB", toto konfuguruje všechny B packy, ale display mám jen na B.2 - b.7 a na B.0 aB.1 mám potenciometry, jak to "let pinsB, let dirsB" přepsat, aby to neovládalo tyto 2 piny?

Kód: Vybrat vše

init:
	let pinsB = 0 		
	let b3 = 0 		
	let dirsB = 252   	
	pause 200 			
	let pinsB = 48    	
	pulsout B.3,1 		
	pause 10 			
	pulsout B.3,1 	
	pulsout B.3,1 		
	let pinsB = 32    	
	pulsout B.3,1 	
	pulsout B.3,1 	
	let pinsB = 128   
	pulsout B.3,1 	
	let b1 = 14 		
	gosub wrins 	
	return
	
wrchr: 
	let pinsB = b1 & 240	
	high B.2 			
	pulsout B.3,1 		
	let b2 = b1 * 16       	
	let pinsB = b2 & 240    
	high B.2 			
	pulsout B.3,1 		
	return
	
wrins: 
	let pinsB = b1 & 240    
	pulsout B.3,1 		
	let b2 = b1 * 16       	
	let pinsB = b2 & 240   	
	pulsout B.3,1 		
	high B.2 			
	return
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Obsluha tlačítka

Příspěvek od AlesH »

Protože "let pinsB" pracuje jen s piny, které jsou nastaveny na výstup (output), tak ve Tvém případě stačí upravit "let dirsB" tak, aby piny 0 a 1 nastavil jako vstupní. Pak už se jich příkazy "let pinsB" nebudou týkat. Tyto příkazy je přehlednější zapisovat v binární formě čísel (místo dekadické). Nastavit piny B.0 a B.1 jako vstupní a zbytek portu B jako výstupní tedy lze příkazem "let dirsB %11111100" (ekvivalentem je "let dirsB 252"). Příkazy "let pinsB" by už pak nemělo být třeba upravovat (pokud máš LCD připojen tak, jak demo program očekává). Vlastně i celý původní program by měl být OK, protože tam už je uveden ten "let dirsB 252".
CZMartin_k
Příspěvky: 61
Registrován: 29 kvě 2014, 17:04

Re: Obsluha tlačítka

Příspěvek od CZMartin_k »

Tak díky moc, když se to už nemusí nějak upravovat, je tu supr :) Zítra mám celý projekt už odevzdávat ve škole, ale je vtom háček. Před 3 týdnama jsem odpálil 50W RGB LED diodu koupenou z Ebaye, tak sjem si koupil novou za 200,- Kč a ona mi ještě nepřišla :-(.
CZMartin_k
Příspěvky: 61
Registrován: 29 kvě 2014, 17:04

Re: Obsluha tlačítka

Příspěvek od CZMartin_k »

tak dioda mi už konečně přišla. Zkusil jsem nahrát program do procesoru a nic a v simulaci mi běží jen program "tlacitko", ale měly by fungovat u verze XM2 až 4 programy současně, ne? Nevěděl by jsi, co s tím?

Kód: Vybrat vše

init:
b0 = 0
b1 = 0

tlacitko:                             ;Hlídá tlačítko na vstupu C.6 a při každém stisknutí 
do
  if pinC.6 = 1 then                  ;uloží do proměnné b0 hodnotu + 1
    let b0 = b0 + 1
    do
      pause 200
    loop while pinC.6 = 1    
  endif
loop

potenciometry:                        ;Hlidá potenciometry na vstupech C.1, B.0, B.1 a ukládá 
do                                    ;je do proměnné a do další proměnné se hodnota dělí  
  readadc C.1, b26                    ;a násobí třemi pro větší rozsah čísla
  let w11 = b26 * 3 max 1023
  let b23 = b26 / 3
  
  readadc B.0, b25
  let w10 = b25 * 3 max 1023
  let b22 = b25 / 3
  
  readadc b.1, b24
  let w9 = b24 * 3 max 1023
  let b21 = b24 / 3
loop

mody:                                 ;Podle počtu stisku tlačítek, které jsou uložené  
do                                    ;v proměnné b0 tento program vybere mód, který                                     
  pulsout C.0, 10                     ;má být spuštěn.Vyšle signál do LED displaye na reset
    for b1 = 0 to b0                  ;Podle počtu stisku tlačítek, které jsou uložené 
      pulsout C.4, 10 
      pause 50                ;do proměnné  b0 se provede tento cyklus s pulzem  
    next b1                           ;na hodiny dekodéru  s čítačem pro LED display
                                        
  if b0 = 1 then 
    goto red
  endif
  
  if b0 = 2 then 
    goto green
  endif  
  
  if b0 = 3 then
    goto blue
  endif
  
  if b0 = 4 then 
    goto red_blik
  endif
  
  if b0 = 5 then 
  goto green_blik
  endif  
  
  if b0 = 6 then
  goto blue_blik
  endif

  if b0 = 7 then 
    goto red_pwm
  endif
  
  if b0 = 8 then 
    goto green_pwm
  endif  
  
  if b0 = 9 then
    goto blue_pwm
  endif
    
  
  if b0 > 9 then
    b0 = 0                    
  endif
loop

;Tady začínají jednotlivé módy

;1.
red:
if b0 > 1 then 
  pwmout c.5, off
  goto mody
endif
pwmout c.5, b24, w10
pause 50
goto red

;2.
green:
if b0 > 2 then 
  pwmout c.3, off
  goto mody
endif
pwmout c.3, b24, w10
pause 50
goto green

;3.
blue:
if b0 > 3 then 
  pwmout c.2, off
  goto mody
endif
pwmout c.2, b24, w10
pause 50
goto blue

;4.
red_blik:
if b0 > 4 then mody 
low c.5
pause svit
high c.5
pause zhasni
goto red_blik

;5.
green_blik:
if b0 > 5 then mody
low c.3
pause svit
high c.3
pause zhasni
goto green_blik

;6.
blue_blik:
if b0 > 6 then mody
low c.2
pause svit
high c.2
pause zhasni
goto blue_blik

;7.
red_pwm:
for b1 = 0 to 1023 step b25
  if b0 > 7 then mody
  pwmout c.5, b26, b1
  pause svit
next b1
  
for b1 = 1023 to 0 step -b25
  if b0 > 7 then mody
  pwmout c.5, b26, b1
  pause svit
next b1
goto red_pwm

;8.
green_pwm:
for b1 = 0 to 1023 step b25
  if b0 > 8 then mody
  pwmout c.3, b26, b1
  pause svit
next b1
  
for b1 = 1023 to 0 step -b25
  if b0 > 8 then mody
  pwmout c.3, b26, b1
  pause svit
next b1
goto green_pwm

;9.
blue_pwm:
for b1 = 0 to 1023 step b25
  if b0 > 9 then mody
  pwmout c.2, b26, b1
  pause svit
next b1
  
for b1 = 1023 to 0 step -b25
  if b0 > 9 then mody
  pwmout c.2, b26, b1
  pause svit
next b1
goto blue_pwm
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Obsluha tlačítka

Příspěvek od AlesH »

Pro "multitasking" je u PICAXE řady M2 naprosto nezbytné, aby ty další paralelní části byly označeny návěštími "start1:", "start2:" a případně i "start3:" (podle nich systém pozná, kde končí jeden paralelní blok a začíná další). Ve tvém případě tedy bude nejlepší návěští "potenciometry:" přejmenovat na "start1:" a před návěští "mody:" vložit návěští "start2:" (protože na "mody" se odkazuješ v další části programu)). Návěští "tlacitko:" může zůstat tak jak je (protože návěští "start0:" není povinné a program vezme to první, jaké najde).

Pak už by to mělo fungovat. V simulátoru to sice občas není moc vidět, ale proměnné se opravdu mění tak, jakoby běžely všechny "starty" najednou.

Tento způsob "multitaskingu" funguje jen u řady M2, ale nikoliv u řady X2.
CZMartin_k
Příspěvky: 61
Registrován: 29 kvě 2014, 17:04

Re: Obsluha tlačítka

Příspěvek od CZMartin_k »

Zdravím, teď jsem neměl na tento projekt čas, jsem pořád v práci :-(. Ale zase teď začínám na něm dělat. Skončil jsem na tom, že mi furt běží jen jeden program a nejde ten "multitasking". Jednotlivé programy jsou označeny jako start1, start2, ... A v simulaci taky jede pouze ten první program a to je start1. Jinak už mám k tomuto projektu všechny věci a nakonec tam nebude jen 9 módů, ale bude jich hned 20 :-) a zatím jsem naprogramoval jen několik módů. Nevěděl by jsi náhodou, v čem je chyba? A používám řadu M2.

Děkuji moc :).
CZMartin_k
Příspěvky: 61
Registrován: 29 kvě 2014, 17:04

Re: Obsluha tlačítka

Příspěvek od CZMartin_k »

Z ničeho nic jsem to celé rozchodil a funguje i záhadně multitasking :-). Jen teda sedmi-segmentovka ukazuje o číslo víc, než je b0. Nevěděl by jsi, prosím?

Kód: Vybrat vše

start3: ;mody                         ;Podle počtu stisku tlačítek, které jsou uložené  
do                                    ;v proměnné b0 tento program vybere mód, který                                     
  pulsout C.0, 10                     ;má být spuštěn.Vyšle signál do LED displaye na reset
    for b1 = 0 to b0                  ;Podle počtu stisku tlačítek, které jsou uložené 
      pulsout C.4, 10                 ;do proměnné  b0 se provede tento cyklus s pulzem  
    next b1                           ;na hodiny dekodéru  s čítačem pro LED display
                                        
  if b0 = 1 then 
    goto red
  endif
  
  if b0 = 2 then 
    goto green
  endif  
  
  if b0 = 3 then
    goto blue
  endif
  
  if b0 = 4 then 
    goto red_blik
  endif
  
  if b0 = 5 then 
  goto green_blik
  endif  
  
  if b0 = 6 then
  goto blue_blik
  endif

  if b0 = 7 then 
    goto red_pwm
  endif
  
  if b0 = 8 then 
    goto green_pwm
  endif  
  
  if b0 = 9 then
    goto blue_pwm
  endif
    
  
  if b0 > 9 then
    b0 = 0                    
  endif
loop
Odpovědět