Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

ARDUINO mega - opakovani funkce - VYŘEŠENO
Jdi na stránku Předchozí  1, 2, 3, 4, 5  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
mtajovsky



Založen: Sep 19, 2007
Příspěvky: 3697
Bydliště: Praha

PříspěvekZaslal: st říjen 07 2015, 20:58    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
ZdenekHQ
Administrátor


Založen: Jul 21, 2006
Příspěvky: 25741
Bydliště: skoro Brno

PříspěvekZaslal: st říjen 07 2015, 20:59    Předmět: Citovat

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.

_________________
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[?
]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
jiri255



Založen: Apr 18, 2013
Příspěvky: 168

PříspěvekZaslal: st říjen 07 2015, 21:02    Předmět: Citovat

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:

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);
       }
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mtajovsky



Založen: Sep 19, 2007
Příspěvky: 3697
Bydliště: Praha

PříspěvekZaslal: st říjen 07 2015, 21:14    Předmět: Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
ZdenekHQ
Administrátor


Založen: Jul 21, 2006
Příspěvky: 25741
Bydliště: skoro Brno

PříspěvekZaslal: st říjen 07 2015, 21:17    Předmět: Citovat

Asi by pomohlo poslat sem celej zdroják, pokud tedy nemá 200 stran.

Zacyklili jsme se víc než samotný MCU. Very Happy

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

_________________
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[?
]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
jiri255



Založen: Apr 18, 2013
Příspěvky: 168

PříspěvekZaslal: čt říjen 08 2015, 9:11    Předmět: Citovat

...no, ale kdyz mi tento kousek kodu dela to co jsem potreboval,
kód:

        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?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
ZdenekHQ
Administrátor


Založen: Jul 21, 2006
Příspěvky: 25741
Bydliště: skoro Brno

PříspěvekZaslal: čt říjen 08 2015, 14:26    Předmět: Citovat

A když jednoduše napíšeš :

kód:

 void getZkouska();
   {   
 
       }


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

_________________
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[?
]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
jiri255



Založen: Apr 18, 2013
Příspěvky: 168

PříspěvekZaslal: čt říjen 08 2015, 15:36    Předmět: Citovat

tak to pořád dokola opakuje to co je uvnitř té podmínky
a nevystoupí to z ní zpět do loop Sad
kód:

 void getZkouska();
   {   
 
       }

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

 void getZkouska();
   {
        do {
            return;
            }while(0);
         }
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: čt říjen 08 2015, 16:36    Předmět: Citovat

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í Very Happy
kód:

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");
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
ZdenekHQ
Administrátor


Založen: Jul 21, 2006
Příspěvky: 25741
Bydliště: skoro Brno

PříspěvekZaslal: čt říjen 08 2015, 17:10    Předmět: Citovat

frpr666 napsal(a):
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...

_________________
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[?
]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: čt říjen 08 2015, 18:07    Předmět: Citovat

Taky si zkontrolujte jaký pin nahazujete a zhazujete.
Jinak může svítit #8 furt v log1 a #2 furt v log0
kód:

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

Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
jiri255



Založen: Apr 18, 2013
Příspěvky: 168

PříspěvekZaslal: čt říjen 08 2015, 19:21    Předmět: Citovat

to void getZkouska() se strednikem jsem sem napsal omylem...
uz se mi to motalo Smile

jinak uz jsem na to asi prisel Very Happy
kdyz jsem tam nahral tento doporuceny kod od "frpr666"
kód:

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:

#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:

  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...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3328

PříspěvekZaslal: čt říjen 08 2015, 19:33    Předmět: Citovat

A to ti překladač nezahlásil žádný warning?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
ZdenekHQ
Administrátor


Založen: Jul 21, 2006
Příspěvky: 25741
Bydliště: skoro Brno

PříspěvekZaslal: čt říjen 08 2015, 19:45    Předmět: Citovat

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ý.
_________________
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[?
]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: čt říjen 08 2015, 20:13    Předmět: Citovat

@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:

teplomer2_value = teplomer2();
if (teplomer2_value>20)
{
  ...
  if (teplomer2_value>50)
 {
  ...
 }
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2, 3, 4, 5  Další
Strana 4 z 5

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.16 sekund