Dotazy začátečníka

Odpovědět
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 pánové,
dá se nějak nastavit čas, po který bude níže uvedená část programu čekat na jakoukoli změnu na zapsaných pinech a jestliže změna nenastane (dejme tomu po pěti sekundách) program "odskočí" na návěští "start0" ?

Kód: Vybrat vše

...
b_privolavacka:
if pinc.2=1 and pinc.0=1 then b_privolavacka_Lo
if pinc.2=1 and pinc.1=1 then b_privolavacka_So
goto b_privolavacka
Děkuji za případnou pomoc.

David
Uživatelský avatar
fulda
Příspěvky: 1367
Registrován: 04 led 2016, 17:18

Re: Dotazy začátečníka

Příspěvek od fulda »

Ano,

existuje proměnná "timer", která stále roste. To jak rychle roste se nastaví settimer. Ale jen pro picaxe X1 nebo X2.
Potom stačí napsat: if timer>5 then b_privolavacka_Nic

----
Edit: pro M2 se podívej na enabletime, to je hodně podobné
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Re: Dotazy začátečníka

Příspěvek od jova »

Není to sice tak sofistikované jak výše, ale dá se použít i jakákoliv smyčka a čas nastavit počtem opakování případně velikostí pause.

Kód: Vybrat vše

b_privolavacka:
for b0=0 to 255
if pinc.2=1 and pinc.0=1 then b_privolavacka_Lo
if pinc.2=1 and pinc.1=1 then b_privolavacka_So
pause 1 
next b0
goto start0

b_privolavacka_Lo:
b_privolavacka_So:

start0:

;----2varianta----
b_privolavacka:
b0=255
do 
b0=b0-1
if pinc.2=1 and pinc.0=1 then b_privolavacka_Lo
if pinc.2=1 and pinc.1=1 then b_privolavacka_So
pause 1
if b0=0 then goto start0
loop

b_privolavacka_Lo:
b_privolavacka_So:

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

čítač jako komparátor

Příspěvek od Pivrnec78 »

Zdravíčko, chtěl bych Vás poprosit o radu s příkazem (příkazy) ...
Pořebuju vytvořit komparátor ... potřebuju načíst počet impulů na pinu 1, následně načíst počet impulsů na pinu 2 no a když se pin 2 = pin 1, tak sepnout pin 4, vynulovat komparátor a nechat sepnutý pin 4 dokud se na pin 1 neobjeví impuls. Ještě doplním, že při prvním impuslu na pin 1 se rozsvítí pin 3 a v podstatě svítí tak dlouho, dokud pin 1 a pin 2 není vynulovaný.
Příkaz COUNT jsem pochopil že je sice čítač, ale ve smyslu měření frekvence ... počet impulsů za daný čas ... ale já čas neznám. Navíce mezi impulsem 1 a impulsem 2 bude jiný čas než mezi impulsem 2 a impulsem 3.
Příklad: do trubky mi vejde postupně 7 zvířat (čidlo na začátku) a rozsvítí mi kontrolku obsazení trubky a až z tubky těchto 7 zvířat vyjde (na konci) tak světlo obsazení trubky zhasne a rozsvítí se mi jiné světlo, že prošly všechy zvířata.
Drobná poznámka - na pinu2 nebude nikdy vyšší počet než na pinu1 ... vždy co na začátku příjde, musí odejít.

Dnes to řeším tak, že mám vratný čítač jako součástku (74193) a porovnávám výstupní piny čítače a když je alespoň na jednom z nich "1", tak jde signál dále a zpracovává to logika a rozsvítí se kontrolka 1 a když je na výstupu z čítače "0", tak kontrolka 1 zhasne a kontrolka 2 se rožne.
Ale jsem v situaci kdy 4 bity (0-15) je pro mne málo a na rozšíření o další čítač (8 bitů (0-255)) + rozšíření hlídání "0" nemám prostor co do velikosti DPS.
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Re: Dotazy začátečníka

Příspěvek od jova »

Jestli jsem to dobře pochopil, tak bych to asi řešil jednou společnou proměnnou např. W10 (chlívek na cca 65 000 prasátek).
Při startu by byla hodnota 0. Vstup od pin1 by v něm každým průchodem zvýšil hodnotu o 1, vstup od pin2 by v něm každým průchodem 1 odečetl. Pak se tam dá podmínka: když bude W10 = 0 sepni výstup X (chlívek je prázdný), když je W10>0 sepni výstup Y (něco je v chlívku). Samozřejmě tam bude třeba ošetřit stav aby W10 nešla pod 0 a další nepředloženosti které mohou nastat.
Když to znova pročítám, tak ten příklad je trochu odlišný od toho horního zadání, něco píšeš o tom pinu4. Tak nevím zda je to správně :roll:
Uživatelský avatar
gilhad
Příspěvky: 263
Registrován: 29 kvě 2015, 00:36
Kontaktovat uživatele:

Re: Dotazy začátečníka

Příspěvek od gilhad »

asi bych na to sel tak, ze bych si nekde uchovaval stary stav vstupnich pinu a porovnaval s novym (cili detekce hran). Pri vzestupne hrane na pinu 1 zvysil pocet zvirat, pri vzestupne na pinu 2 snizil pocet zvirat.

Nasledne bych se podival na pocet zvirat a pokud by byl 0 tak rozsvitil pin 4 a zhasnul pin 3, zatimco pokud by byl nenulovy tak rozsvitil pin 3 a zhasnul pin 4.

Picaxe neumim, na arduinu by to bylo takto (snad to po me nekdo prepise do picaxu):

Kód: Vybrat vše

int oldPin1=LOW;
int oldPin2=LOW;
int temp; //pomocna prmenna pro hodnotu pinu, aby se mi to nemenilo pod rukama
int zvirat=0;

loop(){
  temp=digitalRead(pin1);
  if (temp != oldPin1) {
    oldPin1=temp;
    if (temp==HIGH) { //cili prechod low->high
      zvirat++;
      };
  };

  temp=digitalRead(pin2);
  if (temp != oldPin2) {
    oldPin2=temp;
    if (temp==HIGH) { //cili prechod low->high
      zvirat--;
      };
  };

  if (zvirat == 0) {  // prazdna roura
    digitalWrite(pin3,LOW);
    digitalWrite(pin4,HIGH);
  } else {  // neco v roure je
    digitalWrite(pin3,HIGH);
    digitalWrite(pin4,LOW);
  }  
}
Pivrnec78
Příspěvky: 73
Registrován: 30 dub 2017, 15:25

Re: Dotazy začátečníka

Příspěvek od Pivrnec78 »

No, mě napadlo toto:

if pin1 "impuls (změna)" then pin3 high endif
"spočítej" pin1
"spočítej" pin2
if pin2 = pin1 then pin4 high, pin3 low, "vynulovat" pin1, "vynulovat" pin2 endif

Je to teda hodně ve skratce, ale jelikož na to nespěchám, tak možná na něco příjdu.

Dnes to řeším tak, že mám vratný čítač jako součástku (74193) a porovnávám výstupní piny čítače a když je alespoň na jednom z nich "1", tak jde signál dále a zpracovává to logika a rozsvítí se kontrolka 1 a když je na výstupu z čítače "0", tak kontrolka 1 zhasne a kontrolka 2 se rožne.
Ale jsem v situaci kdy 4 bity (0-15) je pro mne málo a na rozšíření o další čítač (8 bitů (0-255)) + rozšíření hlídání "0" nemám prostor.
Navíc s procesorem bych mohl využít více věcí :-)
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,
existuje nějaká "programová finta" na to, aby se při zápisu podmínek zohlednil i stav na výstupních pinech ? Níže uvádím zápis části řešeného programu. Jednodušeji napsáno, potřebuji aktivovat sirénu projetí stůj v případě, že se na pinech c.5 nebo d.5 nebo b.1 a a.7 nachází log.1. Problém (tedy alespoň pro mne) je v tom, že pin a.7 je použit i pro jinou část programu (viz. zápis " if pina.7=1 then pzz_cekani_na_uvolneni_useku) a tak jsem zkusil do prvních tří podmínek připsat i ty stavy na c.5. d.5 a b.1 které aktivuje PIC jako výstupní piny. V simulátoru ale na tento zápis program nereaguje.

Kód: Vybrat vše

zaklad_2:
low  c.4   ;L_zelena
high c.5   ;L_cervena
low  c.6   ;L_bila
low  c.7   ;L_zluta
high d.2   ;PRL_zluta
low  d.3   ;PRL_zelena
low  d.4   ;HS_zelena 
high d.5   ;HS_cervena
low  d.6   ;HS_bila
low  d.7   ;HS_zluta
low  b.0   ;MS_zelena
high b.1   ;MS_cervena
low  b.2   ;MS_bila
low  b.6   ;LED_vymena_odbocka
low  b.5   ;LED_vymena_primo

if pina.7=1 and pinc.5=1 then sirena_projeti_stuj
if pina.7=1 and pind.5=1 then sirena_projeti_stuj
if pina.7=1 and pinb.1=1 then sirena_projeti_stuj
if pina.7=1 then pzz_cekani_na_uvolneni_useku
if pina.1=1 then deaktivace_pzz_manual
if pina.6=1 then zaklad_privol.
if pina.2=1 then z_opavy
if pina.3=1 then z_hradce_nad_moravici
if pina.5=1 then z_mladecka
goto zaklad_2
David
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Re: Dotazy začátečníka

Příspěvek od jova »

Trochu se v tom po pravdě ztrácím. Jediné co mě zatím napadlo, ke každému tomu výstupu přiřadit i další pomocnou proměnou. Myslím to třeba takto:

if něco then high c.5 : b20=1 else b20=0 end if ;když je červená tak b20 má hodnotu1 jinak má hodnotu0
if něco then high d.5 : b21=1 else b21=0 end if ;když je červená tak b21 má hodnotu1 jinak má hodnotu0

A pak by jsi porovnával místo toho výstupu tu proměnnou b20, b21 s tím co potřebuješ.
Možná by řešením bylo přiřadit to naopak k tomu pinu a.7 podle toho k čemu ho používáš.

Neznám konkrétní strukturu programu, třeba by ti na to stačila i jen jedna pomocná proměnná a podle toho který výstup by byl zrovna sepnutý by se jenom měnila její velikost :

if něco then high c.4 : b20=0 end if ;je zelená b20=0
if něco then high d.3 : b20=0 end if ;je zelená b20=0
if něco then high c.5 : b20=1 end if ;je červená někde a já potřebuji tu informaci použít konkrétně tam a tam, tak přiřadím b20=1
if něco then high d.5 : b20=2 end if ;je červená někde jinde a já potřebuji tu informaci použít zase jinde, tak přiřadím b20=2
if něco then high b.1 : b20=3 end if ;...

A pak by se porovnávala buď jen ta konkrétní hodnota v dané části programu, nebo rozsah hodnot …
Pivrnec78
Příspěvky: 73
Registrován: 30 dub 2017, 15:25

čítač jako komparátor

Příspěvek od Pivrnec78 »

Zdravíčko,
se svým problémem "čítač jako komparátor" jsem oslovil také pana Hanzala z Snail Instruments ... přišla mi od něj odpověď za kterou děkuji a s jeho svolením zde dávám odkaz na program, který vytvořil jako řešení tohoto problému ...
Nazval to příhodně - Sto zvířat ... http://www.picaxe.cz/sto-zvirat/
Odpovědět