Stránka 4 z 5

Napsal: 07 říj 2015, 21:58
od mtajovsky
Bez použití break to nemá valný smysl. Vždyť jsem napsal, že ta konstrukce do-while k tvému problému a programu nemá vztah. Asi se musím omluvit za off-topic s tím do-while, pak vznikají takovéto zmatky.

Napsal: 07 říj 2015, 21:59
od ZdenekHQ
Stejně je to zajímavý, jak se ty jazyky postupně vyvíjely - já mám zafixovaný while "podmínka" do "něco", popř. repeat until "něco" a vyskočit z toho prostě nešlo, muselo se to řešit nějakou pomocnou proměnnou, co to radikálně ukončila.

Proto se už nechci učit další programovací jazyky, mám v hlavě Basic, Pascal, x51 assembler (přesněji JSA), php, javascript,html a už se mě to docela solidně plete.

Napsal: 07 říj 2015, 22:02
od jiri255
takze ten kod predtim s tou upravou bez toho break je tedy spatne?
ale me to takhle funguje a vraci se to zpet, tak ted nevim jestli je tedy toto programove spravne nebo to bude delat paseku?

Kód: Vybrat vše

void loop() { 

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

 void getTest() {     
        do {
    //ty podminky se vepisuji sem treba
    digitalWrite(2,LOW);
    //a potom to return vraci zpet do loop
            return;
            }while(0); //a to while je tedy konec tohoto podprogramu
       }

 void getZkouska() {   
       
          do {
   digitalWrite(8,HIGH);   
            return;
            }while(0);
       }

Napsal: 07 říj 2015, 22:14
od mtajovsky
Zapomeňte na to do-while, ve vašem programu je k ničemu. Vyhodit a ty returny taky. Jakmile přejde program přes ukončovací složenou závorku funkce, řízení se vrátí do volající funkce (pokud se nezmastil zásobník). Že já jsem to sem vůbec dával ... :cry:

Napsal: 07 říj 2015, 22:17
od ZdenekHQ
Asi by pomohlo poslat sem celej zdroják, pokud tedy nemá 200 stran.

Zacyklili jsme se víc než samotný MCU. :D

mtajovsky: Nebuď smutný, může být i hůř, takže relativně je to pořád OK.

Napsal: 08 říj 2015, 10:11
od jiri255
...no, ale kdyz mi tento kousek kodu dela to co jsem potreboval,

Kód: Vybrat vše

        do {
            return;
            }while(0);

tedy ze me vraci s toho void gettest nebo zkouska zpet do loop,
tak je to OK ne? nebo mi to nedoporucujete tam pouzivat, zpusobilo
by to nejake problemy pri behu?

Napsal: 08 říj 2015, 15:26
od ZdenekHQ
A když jednoduše napíšeš :

Kód: Vybrat vše

 void getZkouska();
   {   
 
       }


a máš jistotu, že všechny ostatní závorky v programu jsou "spárovány", tak to udělá co?

Napsal: 08 říj 2015, 16:36
od jiri255
tak to pořád dokola opakuje to co je uvnitř té podmínky
a nevystoupí to z ní zpět do loop :-(

Kód: Vybrat vše

 void getZkouska(); 
   {   
 
       }

ale když to udělám takhle, tak se to do loop vrací

Kód: Vybrat vše

 void getZkouska(); 
   {
        do {
            return;
            }while(0);
         }

Napsal: 08 říj 2015, 17:36
od frpr666
Už vidím chybu! Píšeš: void getZkouska();
Při definici se středník za jméno funkce nedává
Nahrej tam tohle a pak dej vědět, jestli getZkouska() vrací nebo nevrací :D

Kód: Vybrat vše

void getZkouska()
{
  Serial.println("B");
}

void getZkouska2()
{
  Serial.println("Y");
  do
  {
    return;
  } while(0);
}


void setup()
{
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
}

void loop()
{
  Serial.println("A");
  getZkouska();
  Serial.println("C");
  Serial.println("X");
  getZkouska2();
  Serial.println("Z");
}

Napsal: 08 říj 2015, 18:10
od ZdenekHQ
frpr666 píše:Už vidím chybu! Píšeš: void getZkouska();
Při definici se středník za jméno funkce nedává


Ten středník jsem sem zavlekl já. V tom aby se prase vyznalo, tohle přece musí překladač buď spolknout, nebo vyhodit chybu...

Napsal: 08 říj 2015, 19:07
od frpr666
Taky si zkontrolujte jaký pin nahazujete a zhazujete.
Jinak může svítit #8 furt v log1 a #2 furt v log0

Kód: Vybrat vše

   digitalWrite(2,LOW);
   digitalWrite(8,HIGH);   

:D

Napsal: 08 říj 2015, 20:21
od jiri255
to void getZkouska() se strednikem jsem sem napsal omylem...
uz se mi to motalo :-)

jinak uz jsem na to asi prisel :D
kdyz jsem tam nahral tento doporuceny kod od "frpr666"

Kód: Vybrat vše

void getZkouska() 
{
  Serial.println("B");
}

void getZkouska2()
{
  Serial.println("Y");
  do
  {
    return;
  } while(0);
}


void setup()
{
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
}

void loop()
{
  Serial.println("A");
  getZkouska();
  Serial.println("C");
  Serial.println("X");
  getZkouska2();
  Serial.println("Z");
}

tak to jelo A,B,C,X,Y,Z coz by melo takhle fungovat, tak jsem ho rozsiril
jeste o podminku s teplotou:

Kód: Vybrat vše

#include <OneWire.h>

OneWire  ds_2(8);


float teplomer2() {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius_1, fahrenheit_1;
 
  if ( !ds_2.search(addr)) {
    Serial.println();
    ds_2.reset_search();
    delay(250);
  }

  for( i = 0; i < 8; i++) {
    Serial.write(' ');
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
  }
 

  ds_2.reset();
  ds_2.select(addr);
  ds_2.write(0x44, 1);        // start conversion, with parasite power on at the end
 
  present = ds_2.reset();
  ds_2.select(addr);   
  ds_2.write(0xBE);         // Read Scratchpad

  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds_2.read();
    Serial.print(" ");
  }
  Serial.println();

  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
  }
  celsius_1 = (float)raw / 16.0;
  fahrenheit_1 = celsius_1 * 1.8 + 32.0;
  float stupne_1 = celsius_1;
  return stupne_1;
   }


void getZkouska()
{
  Serial.println("B");
}

void getZkouska2()
{
  Serial.println("Y");
  do
  {
    return;
  } while(0);
}


void setup()
{
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
}

void loop()



{
  if (teplomer2() <= 25) {
  Serial.println("A");
  getZkouska();
  Serial.println("C");
  } else {
  Serial.println("X");
  getZkouska2();
  }
  Serial.println("Z");
  Serial.println(teplomer2());
  delay(10000);
}

a tohle taky fungovalo, tak jsem jeste vyhodil i to

Kód: Vybrat vše

  do 
  {
    return;
  } while(0);

a jelo to i bez toho a prohlidl jsem si co mam ja v programu a co je tady v tom...
Chyba byla v tom ze ja mel ty getTest a getZkouska pod loop,
kdezto v programu od "frpr666" jsou void get nad setupem a kdyz jsem je prehodil nad setup, tak to najednou jede bez nejmensi chybicky.

Celej problem byl tedy v tom, ze ty void get nesmi byt pod loop...

Napsal: 08 říj 2015, 20:33
od lesana87
A to ti překladač nezahlásil žádný warning?

Napsal: 08 říj 2015, 20:45
od ZdenekHQ
Třeba pascal by hlásil, že procedura definovaná pod procedurou, ze které je volaná, není definovaná. Naopak třeba x51 assembleru je to srdečně jedno. Jak je to tady nevím, ale je to divný.

Napsal: 08 říj 2015, 21:13
od frpr666
@jiri255 gratuluji k připojení DS18x20 teploměru k arduino!
U mě to funguje i když dám funkce getZkouska(), getZkouska2() pod void loop(). Schválně si to zkuste i u sebe.
edit1: v jedné otočce loopu volej funkci teplomer2() jen jednou, a teplotu si ulož do nějaké proměnné, protože funkce teplomer2() je časově náročná. Pokud funkci voláš vícekrát, zbytečně si prodlužuješ cyklus.
Např.

Kód: Vybrat vše

teplomer2_value = teplomer2();
if (teplomer2_value>20)
{
  ...
  if (teplomer2_value>50)
 {
  ...
 }
}