Dotazy začátečníka

Odpovědět
Pivrnec78
Příspěvky: 41
Registrován: 30 dub 2017, 15:25

Re: Dotazy začátečníka

Příspěvek od Pivrnec78 » 07 úno 2018, 11:32

I když se zdá na pohled zápis se SELECT CASE / CASE jednodušší (přehlednější), tak má výsledný návh celého mého menu "Pouzitá pamet = 1440 bytu z 2048", kdežto za použití příkazu IF a postupného rozepsání má stejné menu jen "1293 bytu z 2048" ... ono i těch skoro 150 bytu může někdy chybět nebo je mohu použít jinak, takže asi nic zjednodušovat nebudu ...

DavidO
Příspěvky: 530
Registrován: 01 kvě 2013, 21:27

Re: Dotazy začátečníka

Příspěvek od DavidO » 07 úno 2018, 11:39

V jednotlivých case smí být napsaná hodnota jen z té proměnné, která je na začátku v select case (nebo jinak, testuje se ta proměnná proti těm hodnotám, jiná proměnná ne), takže jestli je potřeba testovat i něco dalšího, pak asi takhle:

Kód: Vybrat vše

case 1
  serout C.2,N2400,("Menu2")
  if enter = 1 then goto menu2
case 2
  serout C.2,N2400,("Menu2")
  if enter = 1 then goto menu3
U toho původního zápisu to může být vnořené:

Kód: Vybrat vše

if b27 = 1 then
  serout C.2,N2400,("Menu2")
  if enter = 1 then goto menu2
endif

DavidO
Příspěvky: 530
Registrován: 01 kvě 2013, 21:27

Re: Dotazy začátečníka

Příspěvek od DavidO » 07 úno 2018, 22:19

Jo ale teďka koukám na ten původní kód; jestli se vždycky testuje ten enter (až na první menu), tak spíš takhle:

Kód: Vybrat vše

serout C.2,N2400,(254,128)
if b27 = 0 then  
  serout C.2,N2400,("Menu1")
elseif enter = 1 then
  select case b27
  case 1
    serout C.2,N2400,("Menu2")
  case 2
    serout C.2,N2400,("Menu3")
 ... atd. jak je potřeba
  endselect
endif 
a nejspíš by to šlo ještě zlepšit uložením těch MenuX textů do EEPROM, konverzí hodnoty v b27 na index začátku toho textu a pak jeho vypsání, asi takhle (píšu nasucho, takže to možná není úplně dobře):

Kód: Vybrat vše

EEPROM 0, 4, 9, 17, 27 ; pozice zacatku jednotlivych retezcu
EEPROM 4, "Menu1Menicko2Menatecko3" ; retezce namlacene hned za sebe. Musi to zacinat na adrese odpovidajici poctu retezcu + 1
serout C.2,N2400,(254,128)
if enter = 1 OR b27 = 0 then ; tj. pro b27 nula me enter nezajima, kdyz b27 neni nula, tak musi byt enter = 1, aby se to udelalo.
  read b27,b28 ; precte z EEPROM pozici zacatku b27-teho retezce
  b29 = b28 + 1
  read b29,b30 ; precte z EEPROM pozici zacatku (b27+1)-ho retezce
  b30 = b30 - 1 ; a tu pozici zacatku dalsiho pouzijeme jako konec predchoziho, jen se musi odecist jednicka
  for b31 = b28 to b30 ; cyklus pres vsechna pismena retezce
    read b30,b31 ; prectu pismeno
    serout C.2,N2400,(b31) ; poslu pismeno ven
  next b30
endif
(pár proměnných by jistě šlo ušetřit, tady jsem vzal pokaždé další)
Naposledy upravil(a) DavidO dne 07 úno 2018, 22:45, celkem upraveno 1 x.

Pivrnec78
Příspěvky: 41
Registrován: 30 dub 2017, 15:25

Re: Dotazy začátečníka

Příspěvek od Pivrnec78 » 07 úno 2018, 22:31

No, ono se enter zatím na první pozici netestuje, ale až to bude hotové, tak se testovat asi bude taky ...

DavidO
Příspěvky: 530
Registrován: 01 kvě 2013, 21:27

Re: Dotazy začátečníka

Příspěvek od DavidO » 07 úno 2018, 22:50

Aha. Tak tím se to ještě trošku zjednoduší, ale princip zůstane stejný. Jo a v mém předchozím příspěvku jsem zapomněl na ta goto, ty si tam přimysli ;)

Pivrnec78
Příspěvky: 41
Registrován: 30 dub 2017, 15:25

Re: Dotazy začátečníka

Příspěvek od Pivrnec78 » 11 úno 2018, 09:58

Tak vkládání do paměti a vytahování z paměti je pro mne zatám "Španělská vesnice" ...

jova
Příspěvky: 267
Registrován: 16 pro 2013, 11:40

Re: Dotazy začátečníka

Příspěvek od jova » 11 úno 2018, 11:30

Když nad tím tak přemýšlím, není mi jasné jak to tvé menu vlastně bude vizuálně vypadat.
Já když dělám menu, tak ho mám na několik řádků a vybírám si v nich "listováním" a "zvýrazňuji" vybranou položku: https://www.youtube.com/watch?v=yHgWzmte52E tobě se budou měnit jednotlivé položky v rámci jedné řádky?
To vkládání do paměti a vytahování má hlavně výhodu v tom, že paměť má samostatné oddíly a jejich zaplnění se nepočítá do délky programu. Takže když do ní nahraješ ten text menu, ušetříš spousty místa na vlastní program. Osobně to už nepoužívám, je to pro mě "nepřehledný" způsob výpisu a moc tím neušetřím. Raději si to menu obdobným způsobem uložím do paměti LCD řízeným PICAXE 20M2 a vyvolám ho už pak přímým odkazem pomocí jednoho čísla.
Tady je ukázka jak by to mohlo vypadat u tebe když se to nahraje přímo do procesoru:

Kód: Vybrat vše

Menu uložené v paměti. Dá se to napsat i všechno za sebe třeba od adresy 0, já to rozdělil pro větší přehlednost. Na první pozici menu je vždy mezera kterou pak dále využívám, viz výběr, tak ať tě to neplete, počítá se jako jeden znak.

eeprom 0, (" nastav cas")  ; 0=_, 1=n, 2=a... 10=s
eeprom 11,(" nastav zvoneni")  ; 11=_, 12=n, 13=a... 25=i
eeprom 26,(" nastav hodiny")
eeprom 40,(" konec")
... 
výpis na LCD:

serout C.1, baud, (254,128)	;pozice 1. řádku na LCD
for b38=0 to 10:read b38,b39:serout C.1, baud,(b39)next b38  	; for b38 určí od které pozice v paměti (první písmeno daného textu) do kterého (poslední písmeno) se budou vybírat znaky viz:  0=_, 1=n, 2=a... 10=s
if vyber=3 then serout C.1, baud, (254,128) : serout C.1, baud, (">") endif 	  ; tady provádím výběr pomocí proměnné "vyber" a šipky ">" + odkazu "if" níže. Proto mám vlastní text menu z kraje odsazený o 1 mezeru.
 
serout C.1, baud, (254,192)
for b38=11 to 25:read b38,b39:serout C.1, baud,(b39)next b38
if vyber=2 then serout C.1, baud, (254,192) : serout C.1, baud, (">") endif 

serout C.1, baud, (254,148)
for b38=26 to 39:read b38,b39:serout C.1, baud,(b39)next b38
if vyber=1 then serout C.1, baud, (254,148) : serout C.1, baud, (">") endif 

serout C.1, baud, (254,212)
for b38=40 to 45:read b38,b39:serout C.1, baud,(b39)next b38
if vyber=0 then serout C.1, baud, (254,212) : serout C.1, baud, (">") endif 

Výběr a odskok do další části programu:
if tl.menu=0 and vyber=3 then serout C.1, baud,(254,1) : goto nastavdatu endif	  ;jestliže se stiskne tl. menu a proměnná vyber=3, maže se LCD a provede odskok na další část programu
if tl.menu=0 and vyber=2 then serout C.1, baud,(254,1) : goto nastavzvoneni endif
if tl.menu=0 and vyber=1 then serout C.1, baud,(254,1) : goto srovnani endif
if tl.menu=0 and vyber=0 then serout C.1, baud,(254,1) : goto start endif  



Pivrnec78
Příspěvky: 41
Registrován: 30 dub 2017, 15:25

Re: Dotazy začátečníka

Příspěvek od Pivrnec78 » 11 úno 2018, 20:08

Zatím mám toto (zatím toto je celý můj program):

Kód: Vybrat vše

rem drží = listuje nahoru / dolů - menu ovládání kusé nádraží - proměnná na seriový LCD
rem vše na jednu proměnnou
rem Pouzitá pamet = 1263 bytu z 2048

#picaxe 08M2

symbol menu = b27

symbol cekej = 400			; pauza - na zákmity a listování

symbol vstup = pinC.4			; "+"
symbol vystup = pinC.3			; "-"
symbol enter = pinC.1			; enter

pause 3500

start:
serout C.2,N2400,(254,1)		; mazání displeje
let b27 = 2

hlavni_m:				; 0 - 3
if vstup = 1 then				; když na C.4 je high ("1")
  pause cekej				; počkej na zákmity
  inc menu					; přičti 1
  endif
if vystup = 1 then			; když na C.3 je high ("1")
  pause cekej				; počkej na zákmity
  dec menu					; odečti 1
  endif
if menu = 4 then
  let menu = 0
  endif
if menu = 255 then
  let menu = 3
  endif
serout C.2,N2400,(254,128)		; přesunout na začátek 1 řádku
if menu = 0 then
  serout C.2,N2400,(" S T O P  . . . ")
  endif
if menu = 1 then
  serout C.2,N2400,("Kuse stanoviste ")
  if enter = 1 then
    let menu = 10
    goto stan_kusa
    endif
  endif
if menu = 2 then
  serout C.2,N2400,("Trat. stanoviste")
  if enter = 1 then
    let menu = 20
    goto stan_trat
    endif
  endif
if menu = 3 then
  serout C.2,N2400,("Priv.N. trat.st.")
  if enter = 1 then
    let menu = 40
    goto PN
    endif
  endif
goto hlavni_m

stan_kusa:				; 10 - 18
if vstup = 1 then				; když na C.4 je high ("1")
  pause cekej				; počkej na zákmity
  inc menu					; přičti 1
  endif
if vystup = 1 then			; když na C.3 je high ("1")
  pause cekej				; počkej na zákmity
  dec menu					; odečti 1
  endif
if menu = 19 then
  let menu = 10
  endif
if menu = 9 then
  let menu = 18
  endif
serout C.2,N2400,(254,192)		; přesunout na začátek 2 řádku
if menu = 10 then
  serout C.2,N2400,("pos z S1 do K ")
  endif
if menu = 11 then
  serout C.2,N2400,("pos z S2 do K ")
  endif
if menu = 12 then
  serout C.2,N2400,("pos z S3 do K ")
  endif
if menu = 13 then
  serout C.2,N2400,("pos z S4b do K")
  endif
if menu = 14 then
  serout C.2,N2400,("pos z K do S1 ")
  endif
if menu = 15 then
  serout C.2,N2400,("pos z K do S2 ")
  endif
if menu = 16 then
  serout C.2,N2400,("pos z K do S3 ")
  endif
if menu = 17 then
  serout C.2,N2400,("pos z K do S4b")
  endif
if menu = 18 then
  serout C.2,N2400,(" ...  Zpet    ")
  if enter = 1 then
    goto start
    endif
  endif
goto stan_kusa

stan_trat:				; 20 - 34
if vstup = 1 then				; když na C.4 je high ("1")
  pause cekej				; počkej na zákmity
  inc menu					; přičti 1
  endif
if vystup = 1 then			; když na C.3 je high ("1")
  pause cekej				; počkej na zákmity
  dec menu					; odečti 1
  endif
if menu = 35 then
  let menu = 20
  endif
if menu = 19 then
  let menu = 34
  endif
serout C.2,N2400,(254,192)		; přesunout na začátek 2 řádku
if menu = 20 then
  serout C.2,N2400,("Vj z Trat do S1 ")
  endif
if menu = 21 then
  serout C.2,N2400,("Vj z Trat do S2 ")
  endif
if menu = 22 then
  serout C.2,N2400,("Vj z Trat do S3 ")
  endif
if menu = 23 then
  serout C.2,N2400,("pos z S1 do Se  ")
  endif
if menu = 24 then
  serout C.2,N2400,("pos z S2 do Se  ")
  endif
if menu = 25 then
  serout C.2,N2400,("pos z S3 do Se  ")
  endif
if menu = 26 then
  serout C.2,N2400,("pos z S4a do Se ")
  endif
if menu = 27 then
  serout C.2,N2400,("pos z Se do S1  ")
  endif
if menu = 28 then
  serout C.2,N2400,("pos z Se do S2  ")
  endif
if menu = 29 then
  serout C.2,N2400,("pos z Se do S3  ")
  endif
if menu = 30 then
  serout C.2,N2400,("pos z Se do S4a ")
  endif
if menu = 31 then
  serout C.2,N2400,("Odj z S1 do Trat")
  endif
if menu = 32 then
  serout C.2,N2400,("Odj z S2 do Trat")
  endif
if menu = 33 then
  serout C.2,N2400,("Odj z S3 do Trat")
  endif
if menu = 34 then
  serout C.2,N2400,(" ...  Zpet      ")
  if enter = 1 then
    goto start
    endif
  endif
goto stan_trat

PN:					; 40 - 44
if vstup = 1 then				; když na C.4 je high ("1")
  pause cekej				; počkej na zákmity
  inc menu					; přičti 1
  endif
if vystup = 1 then			; když na C.3 je high ("1")
  pause cekej				; počkej na zákmity
  dec menu					; odečti 1
  endif
if menu = 45 then
  let menu = 40
  endif
if menu = 39 then
  let menu = 44
  endif
serout C.2,N2400,(254,192)		; přesunout na začátek 2 řádku
if menu = 40 then
  serout C.2,N2400,(" PN do S1 ")
  endif
if menu = 41 then
  serout C.2,N2400,(" PN do S2 ")
  endif
if menu = 42 then
  serout C.2,N2400,(" PN do S3 ")
  endif
if menu = 43 then
  serout C.2,N2400,(" PN do S4b")
  endif
if menu = 44 then
  serout C.2,N2400,(" ...  Zpet")
  if enter = 1 then
    goto start
    endif
  endif
goto PN
Zatím to nedělá nic jiného, než že se to zobrazuje na displeji.
Až budu mít chuť a čas, bude jednotlivé podmenu po stisku "enter" něco dělat ... asi pošle po sériové lince na jiný MPU hodnotu proměnné a tam se rozhodne, co bude dál ...
Ale zatím to není pro mne až tak důležité, tak to je nyní "na vedlejší koleji".

DavidO
Příspěvky: 530
Registrován: 01 kvě 2013, 21:27

Re: Dotazy začátečníka

Příspěvek od DavidO » 13 úno 2018, 14:15

Pivrnec78 píše:
11 úno 2018, 09:58
Tak vkládání do paměti a vytahování z paměti je pro mne zatám "Španělská vesnice" ...
Ber to jako jinou paměť, která nezabírá místo programu ani proměnným, ale daň za to je jiný způsob přístupu k datům. U Picaxe se do té paměti ukládá příkazem EEPROM kam, co (při kompilaci, konstanty) a WRITE kam, co (za běhu, proměnné) a čte do proměnné příkazem READ odkud, kam. Akorát v tomhle případě to je trochu opruz, protože READ umí číst jen byte a tedy si ten řetězec musíš přečíst ručně po jednotlivých písmenech, nejde to udělat celé najednou (to je ten můj cyklus for b31 = ...]

Pivrnec78
Příspěvky: 41
Registrován: 30 dub 2017, 15:25

Re: Dotazy začátečníka

Příspěvek od Pivrnec78 » 21 úno 2018, 09:20

Takže já příkazem "EEPROM" určím, co uloží do paměti např:

Kód: Vybrat vše

EEPROM 0, ("Kuse stanoviste ")
EEPROM 16,("Trat. stanoviste")
EEPROM 32,("Priv.N. trat.st.")
A určuju vždy pouze 1. pozici při zápisu textu ...
a když to chci vytáhnout, tak po jednotlivých znacích, takže nejdřív napíšu kam to chci ... serout C.2,N2400,(254,128) a pak určím co chci ... takže v případě 1. textu bude "FOR" 0 až 15, u 2. 16 až 31 a u 3. 32 až 47 a tím určím který znak má "vytáhnout" a poslat ...
A tím Vaším read b38,b39 určuju tzv "co - kam" ... takže for b38 = 0 to 15 mě "vybere" jednotlivé znaky textu a příkazem read b38, b39 právě určím to "co - kam" a do b39 mi ukládá postupně jednotlivé znaky textu a právě to b39 já přenáším na displej ...
No a já mu určím, že znak (písmeno) z pozice "0" přijde zobrazit na pozici "128", ale zobrazí další znak z pozice "1" na pozici "128+1" ... tedy na "129"?

Takže chápu-li to správněměl bych pro 1. text napsat toto:

Kód: Vybrat vše

serout C.2,N2400,(254,128)
for b38 = 0 to 15
read b38,b39
serout C.2, N2400,(b39)
next b38
a pro 2. text toto:

Kód: Vybrat vše

serout C.2,N2400,(254,128)
for b38 = 16 to 31
read b38,b39
serout C.2, N2400,(b39)
next b38
A ještě drobnost ... příkazy eeprom dávám normálně do programu až za start: nebo před - tam kde určuju proměnné a spol?
A další věc - kam až můžu do eeprom zapisovat? pro 08M2 až do 256 nebo více?

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host