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
Tady se řešilo něco podobného:
viewtopic.php?f=37&t=2020&start=10#p9881

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

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.

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