Mínusová hodnota a picaxe

smekac
Příspěvky: 25
Registrován: 13 úno 2016, 15:48

Re: Mínusová hodnota a picaxe

Příspěvek od smekac » 19 říj 2017, 19:06

Nápad nám dal kolega programátor, který pro nás dělal program pro seriový port. V podstatě program čeká na "pt-" pokud nepřijde - (timeout), tuto část přeskočí a automaticky předpokládá "pt" ;-)

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

Re: Mínusová hodnota a picaxe

Příspěvek od Dex » 19 říj 2017, 19:35

Jasně, tak teď už to chápu, ovšem pánové tohle už ani není hack, to je prostě pořádná prásárnička, že to tak musím napsat :lol:
"all your robots are belong to us"
robodoupe.cz | rxd.cz | codetory.cz

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

Re: Mínusová hodnota a picaxe

Příspěvek od AlesH » 19 říj 2017, 19:39

OK, díky za objasnění principu programu. Pokud bude vysílač pořád dokola posílat pomalu se měnící číslo, tak to asi bude funkční a použitelné (nebude vadit, že přijímač občas nějaké číslo vynechá [nezachytí a nezpracuje]).

P.S. (edit): Ovšem po podrobnějším prozkoumání se domnívám, že program dělá úplně totéž s kladnými i zápornými čísly (je jedno jaké má číslo znaménko a výstup "pwmout" vždy odpovídá absolutní hodnotě čísla). Je to správně? Pokud ano, pak vůbec nemělo smysl rozlišovat znaménka a prostě by stačilo vždy čekat na "pt" a následné číslo nechat automaticky vyhodnotit jako kladné.

Už jste ten program zkoušeli v praxi? A fungovalo to podle očekávání?

smekac
Příspěvky: 25
Registrován: 13 úno 2016, 15:48

Re: Mínusová hodnota a picaxe

Příspěvek od smekac » 19 říj 2017, 21:06

Samozdřejmě tam část chybí :lol: kolega neposlal všechno, chybí tam jen příkaz low / high pinu na kterém je relé přepínající polaritu. ;) kompletní program je vyzkoušený a funguje dle očekávání. Jak píšeš je tam riziko že to nezachytí všechny hodnoty což nevadí, ale účel to plní. Jak budu mít možnost ukážu video...

smekac
Příspěvky: 25
Registrován: 13 úno 2016, 15:48

Re: Mínusová hodnota a picaxe

Příspěvek od smekac » 28 říj 2017, 16:11

Vzhledem k to mu že doba pokročila a mohl jsem vše reálně otestovat, zde je k nahlédnutí finální program ;-)

Kód: Vybrat vše

setfreq m16

symbol znak_A = b0
symbol znak_B = b1
symbol znak_C = b2
symbol nasobitel = b3

symbol pomerny_tah_kladny = w2
symbol pomerny_tah_zaporny = w3
symbol pomerny_tah = w4

nasobitel = 5

start: 
rem RailWorks
rem ===============================================
serin C.4,N9600_16,("pt"),znak_A, znak_B, znak_C
;sertxd (#znak_A, znak_B, znak_C)

if znak_A = 45 then 
	high C.1 ;sepne rel? -> PT-
else if znak_A != 45 then
	low C.1 ;vypne rel? -> PT+
endif
rem ===============================================
serin C.4,N9600_16,("pt"),#pomerny_tah

if pomerny_tah > 0 then 
	pomerny_tah = pomerny_tah * nasobitel
	gosub generujPWM
endif
rem ===============================================
nula:
if znak_A = 0 AND znak_B = 0 AND znak_C = 0 OR pomerny_tah = 0  then
	low C.1
	low C.2
endif 
goto start

generujPWM:
	pwmout pwmdiv64, C.2, 155, pomerny_tah
return

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

Re: Mínusová hodnota a picaxe

Příspěvek od DavidO » 29 říj 2017, 21:06

Možná se teď opět projevím jako odporný hnidopich, ale nezdá se mi to.

Dovolím si pár připomínek:
  1. Nějak mám dojem, že to bude zpracovávat jen každý druhý poslaný příkaz (resp. přesněji řečeno z lichého použije znaménko, ze sudého číslo).
  2. Proměnné znak_A B a C budou obsahovat 0 jen když se tam explicitně pošle 'pt' a třikrát byte s hodnotou 0, nikoli číslice '0'. Takže ten test za návěštím nula: je podle mě špatně. A co hůř, manuál Picaxe říká o podmínkách:
    It is possible to add addditional 'and' or 'or' combinations but it is recommended not to mix both in a combined conditional.
    takže ten if by takhle napsaný prostě neměl být, kombinace AND a OR jsou nedoporučené.
  3. Pro příkaz pt0 to podle mě dopadne ještě hůř tak, že se do znak_A načte znak '0' (který má kód 48), pak to bude čekat na další dva přicházející bajty, které se uloží do znak_B a znak_C. Co v nich bude záleží na odpovědi na dotaz 3 níže, ale velmi pravděpodobně to nebudou dvě nuly. Takže vlastně opravuji bod jedna a hádám, že se to bude chovat ještě méně očekávaně, protože v případě poslání méně než trojciferné hodnoty to do A dá první cifru, do B ten oddělovač, do C 'p' z následujícího příkazu a pak ten druhý serin bude muset počkat až na třetí poslaný příkaz, protože čeká na sekvenci 'pt', ale na vstupu už to 'p' není, sežralo ho přiřazení do C, takže přeskáče všechen zbytek druhého příkazu a chytí se až na další.
  4. PWM bych raději vypínal pomocí PWMOUT C.2, OFF místo low C.2. Ale navíc mi připadá, že není potřeba explicitně rozlišovat jestli je nebo není nula, protože když by to byla nula, tak 0*nasobitel bude zase 0, takže pwmout by nastavil střídu 0 a tedy pwm přestal generovat (tedy snad, umím si představit takovou implementaci, že i s nulovou střídou by tam špička naběhla, ale tak blbě snad Picaxe není)
Zeptám se:
  1. Jaký přesně je ten formát, co přichází po lince? Z předcházející diskuse usuzuji, že chodí znaky 'p', 't' a pak číslo, které možná má na začátku znaménko '-' a pokud je číslo kladné, znaménko '+' nemá, je to tak?
  2. Kolik cifer má to číslo, proměnný počet podle hodnoty, např. jednu až tři nebo vždycky max počet a je to doplněné nulama (takže třeba hodnota 5 se pošle jako pt005)?
  3. Co je mezi jednotlivými poslanými příkazy? Nic, konec řádku, čárka/tečka/středník ... ? (nebo jinak, je v tom poslaném příkazu za číslem ještě něco dalšího?)
  4. Když se pošle nula jakože pro vypnutí, je nutné, aby bylo C.1 low?
Celkově - fakt to funguje??

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

Re: Mínusová hodnota a picaxe

Příspěvek od DavidO » 29 říj 2017, 21:50

Doplňuji připomínky:
5. Po ostestování, že A je 45 už není potřeba testovat, že není 45. Vše za else až do konce řádku vyhodit (tj.smazat if znak_A != 45 then)
6. Proměnné symbol pomerny_tah_kladny = w2 a symbol pomerny_tah_zaporny = w3 jsou zbytečné, v kódu se nepoužívají
7. nasobitel není potřeba držet v proměnné, může se to nadefinovat jako konstanta: #define nasobitel 5 (pozor, není tam znak =) a pak se to použije stejně jako dřív pomerny_tah * nasobitel ale proměnnou to nezabere

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

Re: Mínusová hodnota a picaxe

Příspěvek od DavidO » 29 říj 2017, 22:05

Můj pokus jak to napsat (předesílám, že Picaxe neprogramuju, tak tam může být nějaká syntaktická chyba, logicky by to ale správně být mělo)

Kód: Vybrat vše

setfreq m16

symbol precteny_znak = b0
symbol pomerny_tah = w1

rem Konstanty neni potreba drzet v promennych:
#define nasobitel 5
rem hodnoty znaku '-' a cislic '0' a '9'
#define minus 45
#define nula 48
#define devet 57

start: 
rem RailWorks
rem ===============================================
rem pockame na zacatek prikazu "pt" a precteme jeden znak za nim
serin C.4, N9600_16, ("pt"), precteny_znak

if precteny_znak = minus then 
	high C.1 ;sepne rel? -> PT-
	serin C.4, N9600_16, precteny_znak
else
	low C.1 ;vypne rel? -> PT+
end if

rem ===============================================
rem ted precteme cislo, prvni cifru uz mame nactenou v promenne
pomerny_tah = 0
do while precteny_znak >= nula and precteny_znak <= devet
	pomerny_tah = 10 * pomerny_tah + precteny_znak - nula 
	serin C.4, N9600_16, precteny_znak
loop 

pomerny_tah = pomerny_tah * nasobitel
pwmout pwmdiv64, C.2, 155, pomerny_tah

goto start
Pokud by nebyla pravda, že s nulovu střídou se pwm vlastně vypne, tak by místo posledních tří příkazů bylo tohle:

Kód: Vybrat vše

if pomerny_tah > 0 then
	pomerny_tah = pomerny_tah * nasobitel
	pwmout pwmdiv64, C.2, 155, pomerny_tah
else
	low C.1
	PWMOUT C.2, OFF
end if

goto start
přičemž pokud se nikdy nepošle záporná nula příkazem 'pt-0' ale vždycky jen 'pt0', tak low C.1 ani není potřeba, protože C.1 už dole je (nastavilo se tak když znak za pt nebyl mínus).

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

Re: Mínusová hodnota a picaxe

Příspěvek od AlesH » 30 říj 2017, 08:49

Pěkný rozbor. A pěkný návrh řešení.

Osobně si myslím, že smekacův program bude fungovat v "obvyklých situacích", což zřejmě bude "skoro vždy" (a ano, zpracovává jen každou druhou došlou hodnotu [sekvenci] a ano, je tam trochu zbytečného balastu).

Davidův návrh je zajímavý tím, že jako první v tomto tématu se pokouší zpracovat každou došlou sekvenci a rovnou vyhodnotit i znaménko. Podle mne by Davidův program teoreticky měl fungovat ve všech situacích, ale obávám se, že obecný "serin" v PICAXE je jen softwarové řešení sériové linky, bez hardwarového bufferu přicházejících znaků, takže je možné, že posloupnost "serinů" nestihne správně zpracovat bezprostředně po sobě jdoucí znaky v jedné sekvenci. V návrhu programu je sice mezi "seriny" jen velmi málo příkazů, ale podle mých zkušeností může zpracování i jen jediného řádku PICAXE programu trvat klidně i milisekundu, a to by pro softwarové zpracování posloupnosti na sérové lince při rychlosti 9600 bd už asi bylo moc dlouhé. S jistotou to ale nevím, muselo by se to prakticky vyzkoušet.

smekac
Příspěvky: 25
Registrován: 13 úno 2016, 15:48

Re: Mínusová hodnota a picaxe

Příspěvek od smekac » 30 říj 2017, 09:18

Ahoj,
musím uznat že příspěvek Davida je zajímavý a několik věcí jsem do programu zapracoval a dostal se tím asi na 2/3 původní délky programu, za což mu děkuji, samotného by mě to asi nenapadlo. Jak píše Aleš, podmínky na seriové lince budou skoro vždy "obvyklé" tedy se to předpokládá i v programu proto je možná z pohledu zkušenějších kolegů nedokonalý :)

K dotazům Davida:
1. je to jak píšeš ... příklad "LVN10LVS140LPV1560PT15 .... "
2. počet cifer je volitelný s tím, že hodnota se nedoplňuje do daného formátu tj. 5 je PT5 a 50 je PT50
3. mezi příkazy nic, posílají se jen čísla s "identifikátory" jako PT, LVN, LVS ... podle toho každé picaxe na seriové lince pozná která hodnota je pro něj a která ne
4. není, ale použil jsem ten pwmout C.1, OFF ;-)

Ano, tak jak jsem uvedl zdroják, tak to funguje :lol: :lol:

Odpovědět

Kdo je online

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