Stránka 1 z 1
Nežiadúci návrat na začiatok programu
Napsal: 22 zář 2020, 07:15
od Ivan
Dobrý deň,prosím o radu s doleuvedeným programom.Je to program na dlhodobé sledovanie či je na PIN7 HIGH alebo LOW.Teraz je tam pri odlaďovaní programu 1 sek.Problém je v tom,že po ukončení programu keď pripojím k UNO počítač a kliknem na sérivý monitor,tak sa program spustí od začiatku a všetky namerané hodnoty sú preč.Teraz pri skúšaní programu keď je Uno trvale pripojené k počítaču a ešte pred spustením programu kliknem na sérivý monitor,tak to vypíše opakovane namerané hodnoty.Ak na monitor kliknem po ukončení programu,tak sa program spustí od začiatku.
Ďakujem predom za radu Ivan
int dlv=0;
int dlz=0;
int inPin=7;
int ledZ=5;
int val;
int ledR=6;
int zap[4];
int vyp[4];
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(ledR,OUTPUT);
pinMode(ledZ,OUTPUT);
pinMode(inPin,INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
for(int i=0;i<4;i++){
val=digitalRead(inPin);
while(val==LOW){
digitalWrite(ledZ,HIGH);
delay(1000);
dlv=dlv+1;
val=digitalRead(inPin);
digitalWrite(ledZ,LOW);
delay(1000);
}
vyp=dlv;
dlv=0;
val=digitalRead(inPin);
while(val==HIGH){
digitalWrite(ledR,HIGH);
delay(1000);
dlz=dlz+1;
val=digitalRead(inPin);
digitalWrite(ledR,LOW);
delay(1000);
}
zap=dlz;
dlz=0;
}
delay(5000);
A:
digitalWrite(ledR,HIGH);
delay(3000);
digitalWrite(ledR,LOW);
for(int i=0;i<4;i++){
Serial.print("vyp ");
Serial.print(i);
Serial.print(" ");
Serial.print(vyp);
Serial.println(" min");
Serial.print("zap ");
Serial.print(i);
Serial.print(" ");
Serial.print(zap);
Serial.println(" min");
}
delay(10000);
goto A;
}
Re: Nežiadúci návrat na začiatok programu
Napsal: 22 zář 2020, 07:35
od AstroMiK
Re: Nežiadúci návrat na začiatok programu
Napsal: 22 zář 2020, 08:45
od pavel1tu
1) vše v LOOP probíhá cyklicky, tedy polud to doběhne na poslední řádek LOOP, skočí to na první
2) já žiji v domění i to takto vyučuji, že příkaz GOTO je příkaz jazyku BASIC (a jiných) a v C/C+ není podporován, tudíž ani u Arduina
Pokud PODROBNĚ popíšeš co od toho potřebuješ trochu "programátorsky", mohu zaměstnat drobotinu na kroužku, ty mladší (kolem 8 let) se tam nudí, jsem už měsíc po služebkách a nikdo se jim nevěnuje. Každý má doma UNO kufřík a toto nasimulují a naprogramují společně raz dva (snad).
PS: AHA já to blbě pochopil, program funguje, jen nechceš aby se Arduini resetovalo při připojení USB - to je popsáno v odkazu výše od AstroMika
PS2: pokud to má měřit čas jak dlouho bylo co zapnuté na základě 1s Delay v cyklu - asi to bude pěkně kecat.
Re: Nežiadúci návrat na začiatok programu
Napsal: 22 zář 2020, 11:27
od ondraN
Doporučuji vyhnout se v programu tomu goto a namísto toho použít třeba
nebo
Pro měření času je vhodnější použít třeba millis(), ale je to s chybou i 10ms za 1s, záleží kus od kusu. Pro přesné měření je nutné použít externí RTC.
Re: Nežiadúci návrat na začiatok programu
Napsal: 22 zář 2020, 15:20
od gilhad
pavel1tu píše: ↑22 zář 2020, 08:45
2) já žiji v domění i to takto vyučuji, že příkaz GOTO je příkaz jazyku BASIC (a jiných) a v C/C+ není podporován, tudíž ani u Arduina
Domnění je jedna věc, realita je jiná
C
Pokud vím, tak příkaz
goto je v C od samého počátku
(
The C Programming Language First Edition by
Dennis Ritchie, Brian Kernighan Publication date
1978 (
K&R) ho například zmiňuje jako dávno existující součást C )
a dodnes je součástí ISO standardu
http://www.open-std.org/JTC1/SC22/WG14/www/standards http://www.open-std.org/JTC1/SC22/WG14/ ... /n1570.pdf (stránka 151,
6.8.6 Jump statements )
C++
Stejně tak ho obsahuje C++
http://www.open-std.org/jtc1/sc22/wg21/ ... ards#14882 http://www.open-std.org/jtc1/sc22/wg21/ ... /n4659.pdf stránka 150
9.6 Jump statements
C#
Stejně tak ho obsahuje C#
( od začátku
http://www.ecma-international.org/publi ... 202002.pdf stránka 192
15.9.3 The goto statement
až dodnes - komentáře k C# 8.0
https://docs.microsoft.com/en-us/dotnet ... ranch=live stránka asi 135
"pattern-based using" and "using declarations" 9/22/2020 zmiňuje že nejsou omezení ohledně
goto a uvádí příklad jeho použití
)
Linux kernel
Naposledy jsem (náhodně) na goto narazil včera, když jsem hledal nějaké detaily ohledně načítání firmware v kernelu, takže se zjevně používá i v praxi
Kód: Vybrat vše
$ grep next_record /home/src/linux-4.4.21-gentoo/firmware/ihex2fw.c
next_record:
goto next_record;
goto next_record;
goto next_record;
Arduino
Co se konkrétně Arduina týče, tak je obsaženo v přímo v jazykové referenci
https://www.arduino.cc/reference/en/lan ... ture/goto/
podpora vs. doporučení
Takže zjevně je a vždy bylo
podporováno ve všech zmíněných jazycích.
Co se týče jeho
doporučování, osobní preference se liší, ale jsou místa, kde se vyloženě hodí, viz třeba ten příklad u Arduina (který mimochodem uvádí i Donald Knuth například zde
https://www.cs.sjsu.edu/~mak/CS185C/Knu ... ngGoTo.pdf )
---
Pascal
BTW: D.W.Dijkstra nebyl velkým přítelem goto, ale do jazyka PASCAL (explicitně určeného pro výuku programování) ho také zahrnul a je v něm dodnes
Re: Nežiadúci návrat na začiatok programu
Napsal: 22 zář 2020, 16:08
od kiRRow
Některé desky mají přeškrtávací pole, na vyřazení automatického resetu ( při nahrávání kódu je pak nutno čip resetovat ručně, nebo to zase spojit ). Já bych asi přímo připojil převodník USB <-> TTL RS232 na patřičné piny arduina.
Re: Nežiadúci návrat na začiatok programu
Napsal: 22 zář 2020, 16:22
od Ivan
Ďakujem pekne za rady.Premohol som svoju lenivosť a pripojil som k Uno LCD displej a je po probléme.
Ivan
Re: Nežiadúci návrat na začiatok programu
Napsal: 23 zář 2020, 22:30
od pavel1tu
Paráda,
já už přišel na to "GOTO", omlouvám se za mystifikaci, když jsem používal sem tam GOTO, nefungoval mi debug mod, tedy ne u Arduin tam ho nepoužívám - tak jsem ho prostě zavrhnul. Asi nějaká chyba.
tak sorry