Dotazy začátečníka
Re: Dotazy začátečníka
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 ...
Re: Dotazy začátečníka
V jednotlivých
U toho původního zápisu to může být vnořené:
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
Kód: Vybrat vše
if b27 = 1 then
serout C.2,N2400,("Menu2")
if enter = 1 then goto menu2
endif
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
Re: Dotazy začátečníka
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:
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):
(pár proměnných by jistě šlo ušetřit, tady jsem vzal pokaždé další)
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
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
Naposledy upravil(a) DavidO dne 07 úno 2018, 22:45, celkem upraveno 1 x.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
Re: Dotazy začátečníka
No, ono se enter zatím na první pozici netestuje, ale až to bude hotové, tak se testovat asi bude taky ...
Re: Dotazy začátečníka
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 Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
Re: Dotazy začátečníka
Tak vkládání do paměti a vytahování z paměti je pro mne zatám "Španělská vesnice" ...
Re: Dotazy začátečníka
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:
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
Re: Dotazy začátečníka
Zatím mám toto (zatím toto je celý můj program):
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".
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
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".
Re: Dotazy začátečníka
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 = ...
]Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
Re: Dotazy začátečníka
Takže já příkazem "EEPROM" určím, co uloží do paměti např:
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:
a pro 2. text toto:
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?
Kód: Vybrat vše
EEPROM 0, ("Kuse stanoviste ")
EEPROM 16,("Trat. stanoviste")
EEPROM 32,("Priv.N. trat.st.")
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
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 další věc - kam až můžu do eeprom zapisovat? pro 08M2 až do 256 nebo více?