Dotazy začátečníka

Odpovědět
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Dotazy začátečníka

Příspěvek od AlesH »

Pak asi nezbývá nic jiného, než to "vypočítat". Klasická DEC->BCD konverze bohužel v PICAXE zabírá dvě proměnné. Pokud ale výsledek chceš dát do samostatné proměnné, můžeš ji použít i pro "mezivýsledek":

Kód: Vybrat vše

seconds = b0/10*16
seconds = b0//10+seconds
jova
Příspěvky: 362
Registrován: 16 pro 2013, 11:40

Re: Dotazy začátečníka

Příspěvek od jova »

Díky tohle zdá se bude ono, teď ještě napsat program pro nastavování otočným spínačem.
Jen tak mimochodem, celé to bude ovládat a řídit dobu kyvu vteřinového kyvadla u věžních hodin ;)
jova
Příspěvky: 362
Registrován: 16 pro 2013, 11:40

Re: Dotazy začátečníka

Příspěvek od jova »

Musel jsem to ještě trochu poupravit, v té původní variantě to nefungovalo, protože ta proměnná b0 se po prvním výpočtu změní.

Kód: Vybrat vše

let b1=b0
let hour    = b0/10*16 
let hour    = b1//10+hour
jova
Příspěvky: 362
Registrován: 16 pro 2013, 11:40

Re: Časový spínač pro dlouhé časy

Příspěvek od jova »

Už jsem se k tomu chystal dlouho, nakonec jsem zvolil variantu s Picaxem.
http://www.jova1.cz/ostatni/spinac/spinac.html
Programově to není žádný zázrak, ale alespoň jsem si vyzkoušel něco dalšího.
Naposledy upravil(a) jova dne 03 bře 2016, 14:54, celkem upraveno 1 x.
David
Příspěvky: 39
Registrován: 19 dub 2013, 18:05

Re: Dotazy začátečníka

Příspěvek od David »

Zdravím,
s pomocí kousku 20M2 zkouším ovládat světla na čtyřsvětlovém návěstidle a při "oživování" prvních dvou (zelené a červené) světel jsem narazil na níže uvedený zádhrel.
Při zapnutí napájení mikrokontroléru platí log.1 na pinu c.0 a svítí červená LED. To je v pořádku. Jestliže ale potom "omylem" stisknu jak tlačítko pro červené i tlačítko pro zelené světlo (log.1 na pinech c.0 i c.1), rozsvítí se i zelená LED a to je špatně. Je tedy v tomto případě možné nějak programově zajistit stav, kdy při stisku dvou a více tlačítek najednou nedojde k rozsvícení další/ch LED ? Přesněji, když stisknu jako první tlačítko pro červenou a hned poté i tlačítko pro zelenou (a naopak), nesmí se zelená (červená) LED rozsvítit.
Světel a tím i kombinací svitu LED (ve finále žárovek ve skutečném návěstidle) bude více.

Děkuji za případné rady či alespoň "nakopnutí".

David

REM Ovladani navestlidla v.0.1

stuj:
high b.0 ;cervena
low b.1 ;zelena
stop_stuj:
if pinc.1=1 then goto volno
goto stop_stuj

volno:
low b.0 ;cervena
high b.1 ;zelena
stop_volno:
if pinc.0=1 then goto stuj
goto stop_volno
Naposledy upravil(a) David dne 25 lis 2015, 19:09, celkem upraveno 1 x.
Uživatelský avatar
gilhad
Příspěvky: 264
Registrován: 29 kvě 2015, 00:36
Kontaktovat uživatele:

Re: Dotazy začátečníka

Příspěvek od gilhad »

Asi bych volil nasledujici postup (ale picaxe neumim, tak jen symbolicky):

Kód: Vybrat vše

stuj:
rozsvit cervenou, zhasni zelenou

dokud JE stisknuto cervene tlacitko, nedelej nic
pockej chvilku 

vahani:
pokud JE stisknuto cervene tlacitko, jdi na stuj
pokud JE stisknuto zelene tlacitko, jdi na jed
jdi na vahani

jed:
zhasni cervenou, rozsvit zelenou
dokud JE stisknuto zelene tlacitko, nedelej nic
pockej chvilku
jdi na vahani
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Dotazy začátečníka

Příspěvek od AlesH »

Další možností jak zajistit požadované chování je smyčka s postupným testováním tlačítek a zacyklení v příslušné sekci dokud je tlačítko stisknuto. Sekce je pak možno přidávat podle potřeby. Např. nějak takto:

Kód: Vybrat vše

#picaxe 20M2
#no_data
low b.1
high b.0
do
  if pinc.0=1 then
    low b.1
    high b.0
    do loop while pinc.0=1 ; cekani na konec stisku tlacitka
  endif
  if pinc.1=1 then
    low b.0
    high b.1
    do loop while pinc.1=1 ; cekani na konec stisku tlacitka
  endif
loop while pinc.0<2 ; nekonecna smycka
David
Příspěvky: 39
Registrován: 19 dub 2013, 18:05

Re: Dotazy začátečníka

Příspěvek od David »

Děkuji za nápovědu.

Návěstidlo bude mít celkem čtyři světla - červené, zelené, žluté a bílé.
Na železnici se ale pro zobrazování více návěstí svit těchto světel také kombinuje. Vše se řídí návěstními předpisy a tak například v řešeném případě nikdy nesmí svítit najednou červené nebo bílé světlo se světlem zeleným či žlutým. Dále se také používají světla rychle či pomalu kmitavá (zelené, žluté nebo bílé).
Pro přepínání svitu klidných světel jsem použil řešení doporučené p.AlesemH a funkčně bylo vše v pořádku, tj. že při stisku více spínačů svítilo jen prvně zvolené světlo (LED). Bez problémů tedy lze zobrazit návěstní znaky :

"Stůj" (klidná červená LED)
"Volno" (klidná zelená lED)
"Rychlost 40 km/h, potom Volno (klidná zelená a pod ní žlutá LED)
"Posun povolen" (klidná bílá LED)

Nedaří se mi ale vytvořit návěsti, u kterých vybrané LED musí pomalu kmitat (poměr svit/zhasnuto zhruba 1/1).
Jde tedy o návěsti :

"Přivolávací návěst a" (klidná červená LED + kmitavá bílá LED)
"přivolávací návěst b" (kmitavá bílá LED)

Je možné ono "kmitání" na výstupu b.3 (bílá LED) nějak do uvedeného programu přidat ? Mé pokusy zatím končí neslavně (na konci programu) ...

Kód: Vybrat vše

[i]#picaxe 20M2
#no_data

high b.0 ;cervena
low  b.1 ;zelena
low  b.2 ;zluta
low  b.3 ;bila

do
  if pinc.0=1 then
     low  b.1
     low  b.2
     low  b.3
     high b.0
     do loop while pinc.0=1 ; cekani na konec stisku tlacitka
     endif

  if pinc.1=1 then
     low  b.0
     low  b.2
     low  b.3
     high b.1
     do loop while pinc.1=1 ; cekani na konec stisku tlacitka
     endif

  if pinc.2=1 then
     low  b.0
     high b.1
     low  b.3
     high b.2
     do loop while pinc.2=1 ; cekani na konec stisku tlacitka
     endif

  if pinc.3=1 then
     low  b.0
     low  b.1
     low  b.2
     high b.3
     do loop while pinc.3=1 ; cekani na konec stisku tlacitka
     endif

 if pinc.4=1 then ; privolavaci navest a
     high b.0
     low  b.1
     low  b.2
     high b.3
     pause 800
     low b.3
     pause 800
     do loop while pinc.4=1 ; cekani na konec stisku tlacitka
     endif
 
  if pinc.5=1 then ; privolavaci navest b
     low  b.0
     low  b.1
     low  b.2
     high b.3
     pause 800
     low b.3
     pause 800
     do loop while pinc.5=1 ; cekani na konec stisku tlacitka
     endif

loop while pinc.0<2 ; nekonecna smycka[/i]
Naposledy upravil(a) David dne 26 lis 2015, 00:51, celkem upraveno 3 x.
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Dotazy začátečníka

Příspěvek od AlesH »

Pokud by světla měla blikat jen po dobu držení příslušného tlačítka, stačilo by ty "blikací příkazy" dát mezi "do" a "loop" ve smyčkách čekání na konec stisku tlačítka. Předpokládám ale, že světla mají blikat i po uvolnění tlačítka (až do stisku jiného tlačítka). To už se situace komplikuje a napadají mne tři základní možné přístupy.

Prvním je úprava stávajícího řešení tak, že "polling" (pravidelné čtení stavu) tlačítek nebude čekat na konec stisku tlačítka ale místo toho jen nastaví nějakou proměnnou (udávající číslo naposledy stisknutého tlačítka) a v další části nekonečné smyčky pak podle hodnoty této proměnné příslušnými světly buď "svítíme", nebo "blikáme". Problém je ale udržet ten "polling" dostatečně rychlý, aby systém reagoval i na krátké stisky tlačítek. Udělat by se to ale určitě dalo.

Druhým možným přístupem je využít schopnosti paralelního běhu až 4 částí kódu u PICAXE řady M2. V jedné části by byl "polling" tlačítek a nastavování výše popsané proměnné. V druhé "paralelní" části kódu by bylo "svícení" nebo "blikání" podle hodnoty té proměnné. Celkově by měl být kód trochu jednodušší a mohlo by to fungovat i lépe. S paralelním během programů na PICAXE ale nemám praktické zkušenosti, takže bych musel trochu experimentovat. Proto zatím neuvádím žádný konkrétní kus kódu.

Třetí možností je využít přerušení ("interrupt") pro hlídání stisku tlačítek. U PICAXE 20M2 tak lze hlídat jen stav na pinech C.1 až C.5. Také jsem to reálně ještě nezkoušel.

Chápu dobře zadání? Jaké řešení vypadá srozumitelnější a nadějnější?

P.S.: Pro vkládání kódu na fóru používej značku "Code" (v editoru příspěvku).
David
Příspěvky: 39
Registrován: 19 dub 2013, 18:05

Re: Dotazy začátečníka

Příspěvek od David »

Děkuji za příspěvek.
Zadání by se dalo shrnout takto :

1. "Stůj" (klidná červená LED)
2. "Volno" (klidná zelená lED)
3. "Rychlost 40 km/h, potom Volno (klidná zelená a pod ní žlutá LED)
4. "Posun povolen" (klidná bílá LED)
5. "Přivolávací návěst a" (klidná červená LED + kmitavá bílá LED)
6. "Přivolávací návěst b" (kmitavá bílá LED)

Uvedené návěsti (svit či blikání daných LED) se musí aktivovat vždy při stisku daného tlačítka, jeho uvolnění a trvat musí až do stisku tlačítka jiného. Tlačítek by tedy bylo šest s názvy "Stůj", "Volno" atd. viz. výše uvedený seznam variant. Nesmí dojít k prvotně řešenému a navrženým programem vyřešenému stavu, kdy se při stisku více tlačítek rozsvěcují dané LED v nežádoucích kombinacích.

Jako "začátečníkovi" mi v případě řešení toho kmitání bílé LED příjde jako nejméně vhodné řešení č.3. kdy by pro množství variant návěstí byl limitující počet použitelných vstupů. U 20M2 tedy "jen" c.1 až c.5 a tak by byl počet možných variant pět a nikoli požadovaných šest. Řešení kmitání (zde bílého světla) by mělo umožňovat nastavení frekvence kmitání. Šlo by o "zadní dvířka" pro budoucí řešení u jiných projektů, kde by se řešila rychlost kmitání i u jiných světel (rychlé/pomalé kmitání zeleného něbo žlutého světla atd.).

Něco o návěstech používaných na našich drahách je např. zde ... http://verejna-doprava.eu/navestidla/stuj.htm

David
Odpovědět