Dotazy začátečníka 2

Odpovědět
Uživatelský avatar
Dex
Administrátor
Příspěvky: 897
Registrován: 16 úno 2013, 14:26

Re: Dotazy začátečníka 2

Příspěvek od Dex » 14 zář 2018, 13:59

Do kamene s tím! :D
"all your robots are belong to us"
robodoupe.cz | rxd.cz | codetory.cz

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

Re: Dotazy začátečníka 2

Příspěvek od jova » 15 zář 2018, 00:40

Děkuji moc za obšírnou odpověď. Tohle jsou základy které mi jako laikovy chybí. Na svou obhajobu musím říct, že samozřejmě gosub ve svém programu, o kterém mluvím, běžně používám, k elseif jsem zatím "programátorsky" nedozrál :oops: Ještě to nějak zkusím zjednodušit a učesat, ale mám obavy, že se tam bez těch příkazů goto neobejdu. Zřejmě budu muset upřednostnit délku před kvalitou :(

Uživatelský avatar
gilhad
Příspěvky: 161
Registrován: 29 kvě 2015, 00:36

Re: Dotazy začátečníka 2

Příspěvek od gilhad » 15 zář 2018, 02:23

Jen bych k te delce podotknul, co uz jsem nekde psal u Arduina - pokud je oddelena programova a datova pamet, a program se mi do te programove vejde, tak me vlastne nezajima zda zabira 10% pameti, nebo zda zbyva jen posledni volny byte a netreba optimalizovat velikost. Az mi bude byt jeden byte chybet, tak samozrejme velikost mudu muset resit, ale do te doby me nezajima, kolik programove pameti lezi ladem nevyuzito. Do te doby je pro me dulezitejsi citelnost kodu, prehlednost, v kritickych pripadech mozna i rychlost, ale urcite ne delka.

(Ale ono se ucesanim kodu a jeho dobrou organizaci casto usetri spousta pameti jen tak mimochodem.) Predcasna optimalizace je korenem vseho zla :)

Osobne radim - sedni si na to "elseif" jeste dnes a dej tomu ten potrebny cas (ono to fakt neni slozite) a sam uvidis, ze je to zatracene uzitecna vec :)

icalan
Příspěvky: 4
Registrován: 29 říj 2018, 11:39

Dotazy začátečníka 2

Příspěvek od icalan » 02 lis 2018, 10:18

dobrý den,
poradil by mi někdo co je tam za chyby - nejspíše tam něco chybí

Kód: Vybrat vše

rem RC ovladani autobusu picaxe 20M2
start:
for b2 = 0 to 30
 pulsin C.7,w6 rem nacteni jizdy
 pulsin C.6,w5 rem nacteni zataceni
 pulsin C.5,w4 rem nacteni venkovni
 pulsin C.4,w3 rem nacteni  svetla sm.
 if w6 <152 and w6> 148 then high B.3 high B.4  else low B.4 low B.3  endif rem brzdova svetla
 if w6>152then goto jizda vpred
 if w6<148 then goto jizda vzad
  goto dal
jizda v pred:
 low C.2 rem vypnuti zpetecky
 let w2=w6 -150*15 rem uprava rozsahu
 goto jizda
jizda vzad:
 high C.2 rem zapnuti zpetecky
 low w2=w6-150*-5 rem uprava rozsahu
jizda:
 pwmout C.3,255,w0 rem nastaveni pulzu
dal: rem zapenana svetela
 if w4 > 190 then b1=b1+1 endif
 if w4 < 110 then b1=b1-1 endif
 if b1 = 7 then b1=3
 let b1=b1 min 
 if b1 > 0 then high B.0 high B.3 else low B.0 low B.3 endif rem parkovaci svetla
 if b1 = 2 OR b1=3 then high B.7 else low B.7 endif  rem vnitrni svetla
 if b1 = 3 then high B.1 lov B.6  endif rem potkavaci svetla
 if b1 = 4 then hiht B.6 lov B.5 endif rem zadní mlhová
 if b1 = 5 then high B.5 else low B.2 endif rem dalkova
 if b1 = 6 then high B.2 else low B.5 endif rem mlhova
 if w3 > 160 and w3 <190 then b0=0 endif rem vypínaní směrovek
 if w5 > 145 and w5 <155 then b0=0 endif
 if w3 > 155 then b0=1 endif rem  smerovky leva
 if w3 < 190 then b0=2 endif rem  smerovky prava
 if w3 > 190 then b0=3 endif rem vystrazne smerovky
 next b2
 if b0 = 0 then low C.0 low C.1 endif
 if b0 = 1 then toggle C.0 endif
 if b0 = 2 then toggle C.1 endif
 if b0 = 3 then toggle C.0 toggle C.1 endif
 goto start


děkuji

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

Re: Dotazy začátečníka 2

Příspěvek od DavidO » 02 lis 2018, 13:20

Podle mě první chyba je, že jsi dotaz napsal do tohohle už tak zapleveleného vlákna s nicneříkajícím názvem, no ale budiž.

Zdá se mi, že tam především chybí čtení chybových hlášek kompilátoru!!! - tedy na straně uživatele. V tom kódu máš řadu syntaktických chyb, které kompilátor jasně označuje a vůbec by ses na ně nemusel tady ptát. Dokonce už v editoru jsou minimálně 4 chyby vidět, protože jsou jinak obarvené.

Také chybí říct nám, pro které Picaxe to je.

V kódu samotném chybí po syntaktické stránce mezera (a přitom několik dalších přebývá), několik odřádkování (nebo přiřazovacích příkazů) v podmíněných příkazech, ukončení podmíněného příkazu a v několika příkazech definovat požadovaný stav před měřením. Kromě toho tam jsou chyby ve výrazech v přiřazovacích příkazech a řada překlepů.

A nakonec z aplikačního pohledu nejspíš chybějí dvoje závorky a nějaký kód, který by využil proměnné, do kterých se něco přiřazuje (aniž by se s tím nyní dál pracovalo).

Uživatelský avatar
jrt
Příspěvky: 1343
Registrován: 17 úno 2013, 17:13

Re: Dotazy začátečníka 2

Příspěvek od jrt » 02 lis 2018, 14:35

Po opravě všech vašich překlepů a chybné syntaxe příkazů prošel program kontrolou bez chyb

Kód: Vybrat vše

; RC ovladani autobusu picaxe 20M2
#picaxe 20M2
start:
for b2 = 0 to 30
 
 pulsin C.6,1,w5
 pulsin C.5,1,w4 ; nacteni venkovni
 pulsin C.4,1,w3 ; nacteni  svetla sm.
 if w6 <152 and w6> 148 then high B.3 high B.4  else low B.4 low B.3  endif ; brzdova svetla
 if w6>152 then goto jizda_vpred
 if w6<148 then goto jizda_vzad
  goto dal
jizda_vpred:
 low C.2 ; vypnuti zpetecky
 let w2=w6-150*15 ; uprava rozsahu
 goto jizda
jizda_vzad:
 high C.2 ; zapnuti zpetecky
 let w2=w6-150*5 ; uprava rozsahu
jizda:
 pwmout C.3,255,w0 ; nastaveni pulzu
dal: ; zapenana svetela
 if w4 > 190 then
 b1=b1+1 endif
 if w4 < 110 then
 b1=b1-1 endif
 if b1 = 7 then
 b1=3
 endif
 ;let b1=b1 min 
 if b1 > 0 then high B.0 high B.3 else low B.0 low B.3 endif ; parkovaci svetla
 if b1 = 2 OR b1=3 then high B.7 else low B.7 endif  ; vnitrni svetla
 if b1 = 3 then high B.1 low B.6  endif ; potkavaci svetla
 if b1 = 4 then high B.6 low B.5 endif ; zadní mlhová
 if b1 = 5 then high B.5 else low B.2 endif ; dalkova
 if b1 = 6 then high B.2 else low B.5 endif ; mlhova
 if w3 > 160 and w3 <190 then
 b0=0 endif ; vypínaní směrovek
 if w5 > 145 and w5 <155 then
 b0=0 endif
 if w3 > 155 then
 b0=1 endif ;  smerovky leva
 if w3 < 190 then
 b0=2 endif ;  smerovky prava
 if w3 > 190 then
 b0=3 endif ; vystrazne smerovky
 next b2
 if b0 = 0 then low C.0 low C.1 endif
 if b0 = 1 then toggle C.0 endif
 if b0 = 2 then toggle C.1 endif
 if b0 = 3 then toggle C.0 toggle C.1 endif
 goto start
Pouze řádek ;let b1=b1 min jsem musel z programu vyřadit (zaREMovat), protože u příkazu min vám chybí hodnota.
To ovšem nezaručuje, že program bude fungovat, jen to, že půjde nahrát do procesoru.
Porovnejte vaši i moji verzi programu, ať vidíte kde jste udělal chyby a kde se jednalo o pouhý překlep.
Zaměřte se taky na syntaxi příkazu if..then, někdy projde na jedné řádce, někdy je nutno řádek za then zalomit a pokračovat na novém.
jrt
hobbyrobot.cz, profirobot.cz
edurobot.cz, robodoupe.cz

icalan
Příspěvky: 4
Registrován: 29 říj 2018, 11:39

Re: Dotazy začátečníka 2

Příspěvek od icalan » 03 lis 2018, 12:28

Děkuji,jsem spíše modelář a zatím jsem používal picaxe 08 s již předepsanými programy, teď si defakto skládám vlastní z toho co se kde dočtu a moc tomu zatím nerozumím,tudíž jsem o tzv zalomování řadku nevěděl
zdá si mi že i při kopírování se udělali chyby misto
rem RC ovladani autobusu
#picaxe 20M2
vzniklo
rem RC ovladani autobusu picaxe 20M2
stejne jako let b1=b1 min 0 max 6
v pulsin C.7,1,w6 jsem já vynechal 1, moje chyba
nevim zda uprava programu
jizda_vzad:
high C.2 ; zapnuti zpatecky ( relé+světla přes tranzistor)
let w2=w6-150*5 ; uprava rozsahu
proti puvodnímu left w2=w6-150*-5 kde je chyba let w2=w6-150*-5 ; uprava rozsahu ^
Syntax error on line 19 at/before position 22
Error: syntax error
w6 bude mít rozsah 80 - 220 kde střed 150, matematicky vychází při hodnotách pod 150 bude hodnota w2= -1,-2 .... s*-5 se hodnota - mela otočit na +

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

Re: Dotazy začátečníka 2

Příspěvek od DavidO » 03 lis 2018, 16:03

jrt píše:
02 lis 2018, 14:35
Zaměřte se taky na syntaxi příkazu if..then, někdy projde na jedné řádce, někdy je nutno řádek za then zalomit a pokračovat na novém.
Jen doplnění - to vyplývá z toho, že ten podmíněný příkaz má více různých variant. Varianta na jednom řádku je určená pro skoky, neumožňuje else větev a nemá koncový endif. Varianta na více řádkách umožňuje else a vyžaduje endif, ale skok se nedá zapsat jen tím názvem návěští. Editor v některých případech dokáže v jednořádkovém zápisu rozpoznat, že to je na jeden řádek napsaná ta varianta, co má být na víc řádkách, ale není geniální, aby to poznal správně všude (a navíc to i může být nejednoznačné).

Varianta na jednom řádku je určená výhradně pro skok, kdy za then následuje skok (goto, gosub, exit), pro goto se smí napsat rovnou návěští a nemusí se tam to goto psát. Tahle jednořádková varianta se neukončuje endif a nemůže tam být else ani nic jiného, než skok.

Příklady:
if b0>1 then konec je v pořádku.
if b0>1 then konec else zacatek chybně, protože jednořádkový if nemůže mít else (Error: Else without If)
if b0>1 then goto konec else goto zacatek endif chybně, protože jednořádkový if nemůže mít else (Error: Else without If)
if b0>1 then b1=5 chybně, protože b1 je proměnná a ne návěští (Error: Expected a label not the variable B1)
if b0>1 then let b1=5 chybně, protože to je přiřazení a tedy víceřádková varianta, která je zdrcnutá do jednoho řádku, ale chybí jí ukončení (Error: If without Endif)
if b0>1 then b1=5 endif chybně, protože b1 je proměnná a ne návěští (Error: Expected a label not the variable B1)
if b0>1 then let b1=5 endif projde, editor poznal, že za then není skok ale přiřazení, takže to je víceřádková varianta zdrcnutá do jedné řádky
if b0>1 then b1=5 else b1=7 endif chybně, protože b1 je proměnná a ne návěští (Error: Expected a label not the variable B1)
if b0>1 then let b1=5 else let b1=7 endif projde, poznalo se, že to je víceřádková varianta zdrcnutá do jedné řádky
if b0>1 then let b1=5 else b1=7 endif taky projde, ale je to ještě ošklivější, než předchozí (let je možné vynechat, akorát ne hned za then protože tam to bez příkazu očekává návěští)
(pozorování: editor nejspíš zkoumá, jestli za then je nějaký příkaz jiný než goto. Pokud ne, tak to je jednořádkový skok. Možná v něm bude vynechané goto, ale to je už pak nepodstatné.)

Dokumentace jasně uvádí 4 jednořádkové možnosti (všechny pouze pro skok) anebo víceřádkovou variantu, kde je blok kódu, ve kterém může být cokoli. Ale neuvádí jednořádkovou variantu, kde by bylo cokoli jiného, než skok. To, že občas projde jednořádková varianta s něčím jiným než skokem, není vlastně dobře.

Doporučuji tedy v případě ne-skoků psát zásadně variantu víceřádkovou.

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

Re: Dotazy začátečníka 2

Příspěvek od DavidO » 03 lis 2018, 16:19

icalan píše:
03 lis 2018, 12:28
w6 bude mít rozsah 80 - 220 kde střed 150, matematicky vychází při hodnotách pod 150 bude hodnota w2= -1,-2 .... s*-5 se hodnota - mela otočit na +
a co má být výstupem resp. přiřazeno do w2? Když je w6= 80, tak co? Co pro 149, pro 150, pro 151, pro 220?

Picaxe nezná záporná čísla (v dokumentaci: The microcontroller does not support fractions or negative numbers.). Občas se někam dá napsat mínus, ale je to v doplňku, tj. -1 je v proměnných bněco totéž co 255 a ve wněco 65535.
(Takže v béčkách je -128 = 128 a ve wéčkách -32768 = 32768 :lol: jo a taky neuznává priority operátorů, podle něj je 2+3*4 dvacet :roll:)

icalan
Příspěvky: 4
Registrován: 29 říj 2018, 11:39

Re: Dotazy začátečníka 2

Příspěvek od icalan » 03 lis 2018, 22:15

5 pulsin C.7,1,w6;nacteni jizdy signál z RC v rozsahu 80-220
15 let w2=w6-150*15 max 1023 ;uprava rozsahu při w6=150=) w2 =0(středová poloha jízda/motor stop) -jizda vpřed w6=151-150=1 *15 =) w2=15
19 let w2=w6-150*8 max 600 ;uprava rozsahu - jízda vzad(přepíná relé) w6=149-150*8 =)w2= 8 (jsem pochopil teď, že - ve výsledku je +)
21 pwmout C.3,255,w2
nikde jsem nevyděl takže jsem nevěděl -) " Takže v béčkách je -128 = 128 "
děkuji za informaci, je to v podstatě moje druhé programovaní ( to první bylo před 28 roky v basicu pro 8b počítače na střední)
Asi jsem rapl když jsem se do toho pustil po přečtení pár článku od ing Černého, připadlo mi to jednoduché.

Odpovědět

Kdo je online

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