ARDUINO mega - opakovani funkce - VYŘEŠENO

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 00:00

ARDUINO mega - opakovani funkce - VYŘEŠENO

#1 Příspěvek od jiri255 »

Zdravím,
trochu jsem se zasekl u opakovani funkce přesněji mám hlavní funkci,
která při splnění podmínky zavolá další funkci, která se opakuje neustále dokola což je skvělé, ale už se to nedokáže vrátit zpět na tu hlavní funkci,
aby ji to znovu vyhodnotilo, tedy jde mi o to jak se dostat s té volané funkce getTest(); zpět k té hlavní.
Nevíte někdo, jak se dá vracet zpět do loop() co bych tam měl přidat,
aby mě to vrátilo do hlavní funkce?

Kód: Vybrat vše


void loop() {

     //hlavni funkce ke ktere se potrebuju vracet
     if (teplomer1() >=50) {
       Serial.print("nebezi");
       } else {
       Serial.print("bezi");
      getTest();
       }
    }

void getTest() {
           if (teplomer2() <= 30) {
           digitalWrite(2,HIGH);
      //a tady muzou byt dalsi podminky
       //else if a podobne
      //sem nekam potrbuju vlozit neco
      //co rekne, aby se to zase vratilo
     //do loop     
       }
   

Předem děkuji za pomoc
Naposledy upravil(a) jiri255 dne 09 říj 2015, 04:55, celkem upraveno 1 x.
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#2 Příspěvek od frpr666 »

Podle mě ten program je nepřehledný.
Problém rozdělte na dvě části. V první řešte detekci teploty a ve druhé řešte reakci na událost.

Kód: Vybrat vše

#define CEKAT 0
#define TOPIT 1
#define CHLADIT 2

loop()
{
  x = getTemperature();
  if (x > 60)
  {
    action = CHLADIT;
  }
  else if (x > 30)
  {
    action = CEKAT;
  }
  else
  {
    action = TOPIT;
  }
  getTest(action);
}

void getTest( uint8_t action)
{
  if (action == CHLADIT)
  {
    PORTB = 0x01;
  }
  else if (action == TOPIT)
  {
    PORTB = 0x02;
  }
  else
  {
  }
}
Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 00:00

#3 Příspěvek od jiri255 »

to jsem tam mozna nenapsal uplne spravne o ty teploty az tak moc nejde
to je tam, aby v te podmince neco bylo me jde spis o to, jak se vratit s toho getTest do toho loop, tedy nejaky navratovy kod nebo neco takoveho co bych vepsal na konec toho getTest... tohle jsem nejak nepochopil co to presne dela :-(
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#4 Příspěvek od frpr666 »

V čem je problém? Volaná funkce se jaksi ze své podstaty ukončí a vrátí se běh programu do nadřazené... Tak už to funguje nějakých pár let, co se nepoužívá "goto"

Kód: Vybrat vše

void loop()
{
   print("A");
   getTest();
   print("C");
}

void getTest()
{
  print("B-jsem uvnitř funkce");
}

//-----
bude výstup:
A
B-jsem uvnitř funkce
C
A
B-jsem uvnitř funkce
C
A
B-jsem uvnitř funkce
C
Uživatelský avatar
Zmije
Příspěvky: 1691
Registrován: 30 čer 2005, 00:00
Bydliště: Pardubický kraj

#5 Příspěvek od Zmije »

Goto je k vidění například ve zdrojových kódech Linuxu, používá se tam převážně na obsluhu chyb, kdy je potřeba odskočit na konec a uvolnit prostředky.
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#6 Příspěvek od mtajovsky »

No, a ve většině jazyků bývá k dispozici klíčové slovo return, které funkci ukončí na libovolném místě.

Zmije píše:Goto je k vidění například ve zdrojových kódech Linuxu, používá se tam převážně na obsluhu chyb, kdy je potřeba odskočit na konec a uvolnit prostředky.
Dá se to i strukturovaně pomocí do-while a break.
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#7 Příspěvek od ZdenekHQ »

Ve starým Basicu na CPC-6128 byla funkce gosub+return. Taky mě byla nějak z principu milejší, než goto, a ani jsem nevěděl proč. Tenkrát jsem měl ještě dost času, než se programování vůbec začalo učit...
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#8 Příspěvek od mtajovsky »

gosub - return je na něco trochu speciálnějšího než goto; nicméně hlavní potíž s goto je ta, že svádí k lidové tvořivosti. To je pak kód ve stylu hop sem - hop tam, a za chvíli se v tom nevyzná nejen že prase, ale ani sám autor.
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#9 Příspěvek od ZdenekHQ »

Jasně, ale dnes to znám v asm (JSA) jako instrukci JUMP - jenže ta je třeba pro větvení nutná. Na volání podprocesů je samozřejmě CALL (ekvivalent GOSUB).

Skákat chaoticky přes JMP někam do prostředku procedury si v asm ani nemůžu dovolit.... :D
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 00:00

#10 Příspěvek od jiri255 »

hmm no já zkoušel to goto, ale moc se to nepovedlo hlásí mi to chybu,
že nemám definováno OPAK zde je kod s tim goto

Kód: Vybrat vše

void loop() { 

     OPAK;
     //hlavni funkce ke ktere se potrebuju vracet
     if (teplomer1() >=50) {
       Serial.print("nebezi");
       } else {
       Serial.print("bezi");
      getTest();
       }
    }

void getTest() {
           if (teplomer2() <= 30) {
           digitalWrite(2,HIGH);
      //a tady muzou byt dalsi podminky
       //else if a podobne
      //sem nekam potrbuju vlozit neco
      //co rekne, aby se to zase vratilo
     //do loop
    goto OPAK;     
       }


a zkousel jsem i return, ale to se take nevraci :-(

Kód: Vybrat vše

void loop() { 

     //hlavni funkce ke ktere se potrebuju vracet
     if (teplomer1() >=50) {
       Serial.print("nebezi");
       } else {
       Serial.print("bezi");
      getTest();
       }
    }

void getTest() {
           if (teplomer2() <= 30) {
           digitalWrite(2,HIGH);
      //a tady muzou byt dalsi podminky
       //else if a podobne
      //sem nekam potrbuju vlozit neco
      //co rekne, aby se to zase vratilo
     //do loop
     return;     
       }
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#11 Příspěvek od mtajovsky »

To je nepochopení. Opak není zevnitř funkce vidět. Ale hlavně tam žádné got není třeba. Ani toho return.

Není důvodu, proč by se po ukončení funkce nemělo řízení vrátiti do hlavní smačky. Vždyť je to stejné jako třeba u toho print.
Naposledy upravil(a) mtajovsky dne 07 říj 2015, 20:56, celkem upraveno 1 x.
Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 00:00

#12 Příspěvek od jiri255 »

hlavní je vždycky ta funkce v loop ta se skládá z

Kód: Vybrat vše

void loop() { 

   
     if (pokud je splnena podminka) {
       Serial.print("nebezi");
      getZkouska; //vykonej podprogram zkouska
       } else { 
       Serial.print("bezi");
      getTest(); //jinak vykonej test 
       }
  //a melo by se to vzdycky vratit zpet nad tohle
 //a znovu provest kontrolu na ty dve podminky
    }

Uživatelský avatar
lesana87
Příspěvky: 4403
Registrován: 20 zář 2014, 00:00

#13 Příspěvek od lesana87 »

Ten OPAK samozřejmě není z jedné funkce do druhé vidět, proto to nefunguje. Ale podle čeho soudíš, že se nevrací ten return (nebo i bez returnu)?
Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 00:00

#14 Příspěvek od jiri255 »

a jak to udělám, aby ten OPAK; byl vidět a nemuselo se nebo se mohlo použít to goto?
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#15 Příspěvek od ZdenekHQ »

Asi se budu muset naučit další programovací jazyk, ale hlavní smyčka snad nezačíná "void" ?
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“