Nežiadúci návrat na začiatok programu

Odpovědět
Ivan
Příspěvky: 14
Registrován: 03 dub 2018, 18:51
Reputation: 0

Nežiadúci návrat na začiatok programu

Příspěvek od Ivan » 22 zář 2020, 07:15

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;

}

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Nežiadúci návrat na začiatok programu

Příspěvek od AstroMiK » 22 zář 2020, 07:35

Tady se řešilo něco podobného:
viewtopic.php?f=37&t=2020&start=10#p9881

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Nežiadúci návrat na začiatok programu

Příspěvek od pavel1tu » 22 zář 2020, 08:45

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.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Nežiadúci návrat na začiatok programu

Příspěvek od ondraN » 22 zář 2020, 11:27

Doporučuji vyhnout se v programu tomu goto a namísto toho použít třeba

Kód: Vybrat vše

while(true){
.......
}
nebo

Kód: Vybrat vše

for( ; ; ;){
......
}
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.

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Nežiadúci návrat na začiatok programu

Příspěvek od gilhad » 22 zář 2020, 15:20

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

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Nežiadúci návrat na začiatok programu

Příspěvek od kiRRow » 22 zář 2020, 16:08

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.

Ivan
Příspěvky: 14
Registrován: 03 dub 2018, 18:51
Reputation: 0

Re: Nežiadúci návrat na začiatok programu

Příspěvek od Ivan » 22 zář 2020, 16:22

Ďakujem pekne za rady.Premohol som svoju lenivosť a pripojil som k Uno LCD displej a je po probléme.
Ivan

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Nežiadúci návrat na začiatok programu

Příspěvek od pavel1tu » 23 zář 2020, 22:30

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
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Odpovědět

Kdo je online

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