Index. proměnná v Arduinu

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

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
elnovy
Příspěvky: 769
Registrován: 04 črc 2010, 02:00
Bydliště: ČR - JČ
Kontaktovat uživatele:

#16 Příspěvek od elnovy »

problem ulozeni = precteni data n cidlem z uartu
dale odeslani dat uartem data n do esp 12e
---nasleduje zpracováni dat
pak se vse opakuje
viz blokovka
.....
jedna se o vykonny systém ale Ty indexy // mě nejdou
v TB snadné jako facka v Cpp gramatický problema pro mě
.....
Ve svete už řeši koronu tester bastlíři na indiegogo
Přílohy
blokovka index n.png
el.návrhář HW a SW a DPS

Uživatelský avatar
popopepe
Příspěvky: 548
Registrován: 26 říj 2005, 02:00

#17 Příspěvek od popopepe »

OK, ten HW asi řešit nemusíme. tak v čem je vlastně ten problém?
Tak ho přesně popiš vlastními slovy.

Neumíš vytvořit pole?
//místo n zadej počet vzorků //např 28

#define pocet_vzorku 28 //počet vzorků v jedné operaci
uint16_t data_pole [pocet_vzorku];
//tím se ti vytvoří v paměti oblast, celkem v délce 28x16 bitů.
//proměnná data_pole[0] ti ukazuje na začátek toho pole, je to vlastně pointer.
//potřebuješ uložit do 10-ho prvku data?
data_pole[9]= 1010; //pole je indexované od 0, tak proto ta 9.

Neumíš v něm pracovat?

//potřebuješ sečíst třeba 28 prvků toho pole?

uint32_t vysledek=0; //pokud budeš mít těch dat hodně tak raději 32bit proměnná

for (int i =0; i<pocet_vzorku;i++)
{
vysledek=vysledek + data_pole;
}

potřebuješ průměr z toho součtu?

vysledek = vysledek/pocet_vzorku; //v int
float vysledek_float = vysledek/pocet_vzorku; //ve float

Nebo v čem je ten problém?

Uživatelský avatar
elnovy
Příspěvky: 769
Registrován: 04 črc 2010, 02:00
Bydliště: ČR - JČ
Kontaktovat uživatele:

#18 Příspěvek od elnovy »

jj za chvili poslu slepenec Cpp a TB
a to co chybí a neumim popisu jazykem Basic
dik za pomoc vydrž
el.návrhář HW a SW a DPS

Uživatelský avatar
elnovy
Příspěvky: 769
Registrován: 04 črc 2010, 02:00
Bydliště: ČR - JČ
Kontaktovat uživatele:

#19 Příspěvek od elnovy »

posilam prvni slepenec nema cenu poslat hned vsechno dik.
spravne je to resit s pomoci postupne jak si popsal....
code:
// definice pole o velikosti 200 prvků = ?
int x[0] // prvni prvek pole ale bude jich 199

void setup() {
Serial.begin(9600); // pozdeji bude navolena vyssi rychlost
int bytesSent = Serial.write("---PROPOJENO---");
}

void loop() {
//for i = 0 to 199 : x=serial.read : next i // x jsou 0-255 dec
// nasleduje kontrola pole a přenosu z a do monitoru
//for i = 0 to 199 :
Serial.print(char x); // musi byt tisteno ve tvaru char
//next i
}
el.návrhář HW a SW a DPS

Uživatelský avatar
popopepe
Příspěvky: 548
Registrován: 26 říj 2005, 02:00

#20 Příspěvek od popopepe »

code:
// definice pole o velikosti 200 prvků = ?
int x[0] // prvni prvek pole ale bude jich 199

void setup() {
Serial.begin(9600); // pozdeji bude navolena vyssi rychlost
int bytesSent = Serial.write("---PROPOJENO---");
}

void loop() {
//for i = 0 to 199 : x=serial.read : next i // x jsou 0-255 dec
// nasleduje kontrola pole a přenosu z a do monitoru
//for i = 0 to 199 :
Serial.print(char x); // musi byt tisteno ve tvaru char
//next i
}

Kód: Vybrat vše

unsigned int x[200]; //pole o rozměru 200 prvků, doporučuji unsigned, zápornou hodnotu tam asi mít nebudeš

void setup() 
{
Serial.begin(9600); // pozdeji bude navolena vyssi rychlost
int bytesSent = Serial.write("---PROPOJENO---");
}

void loop() 
{

for (int i=0;i<200;i++)
{
   if (Serial.available() > 0) 
 {
  x[i]==Serial.read ();
 }
}

for (int i=0;i<200;i++)
 {
    Serial.print( char x[i]); //nebo Serial.println(char x[i]); //odřádkuje po každé hodnotě
 }

}

//jak v arduino něco tisknout nevím, už s ním moc nepracuju, tohle je klasické "C" křísnuté s CPP :-)

Uživatelský avatar
elnovy
Příspěvky: 769
Registrován: 04 črc 2010, 02:00
Bydliště: ČR - JČ
Kontaktovat uživatele:

#21 Příspěvek od elnovy »

hned to ozkousim a napisu
el.návrhář HW a SW a DPS

Uživatelský avatar
elnovy
Příspěvky: 769
Registrován: 04 črc 2010, 02:00
Bydliště: ČR - JČ
Kontaktovat uživatele:

#22 Příspěvek od elnovy »

se prekladac zarazil na poslednim radku
s hlaskou
exit status 1
expected primary-expression before 'char'

stav ukončení 1
očekávaný primární výraz před „char“

viz vypis
unsigned int x[200]; //pole o rozměru 200 prvků, doporučuji unsigned, zápornou hodnotu tam asi mít nebudeš

void setup()
{
Serial.begin(9600); // pozdeji bude navolena vyssi rychlost
int bytesSent = Serial.write("---PROPOJENO---");
}

void loop()
{

for (int i=0;i<200;i++)
{
if (Serial.available() > 0)
{
x==Serial.read ();
}
}

for (int i=0;i<200;i++)
{
Serial.println( char x); //nebo Serial.println(char x); //odřádkuje po každé hodnotě
}

}
el.návrhář HW a SW a DPS

Uživatelský avatar
popopepe
Příspěvky: 548
Registrován: 26 říj 2005, 02:00

#23 Příspěvek od popopepe »

Zkus ten serial změnit:

Serial.println(x); //dej ten char pryč

Uživatelský avatar
elnovy
Příspěvky: 769
Registrován: 04 črc 2010, 02:00
Bydliště: ČR - JČ
Kontaktovat uživatele:

#24 Příspěvek od elnovy »

jj uz to funguje + doplnil jsem pausy 3s
ale problem je v tom že se načtou nulove hodnoty do
pole X(1-200)
nasledne se vytisknou a jde to furt dokola
....
proste chybí poseckani v prvnim cyklu zadavani hodnot dat
....
jinak to maka :
unsigned int x[200]; //pole o rozměru 200 prvků, doporučuji unsigned, zápornou hodnotu tam asi mít nebudeš

void setup()
{
delay(3000); // startovaci pauza 1
Serial.begin(9600); // pozdeji bude navolena vyssi rychlost
int bytesSent = Serial.write("---PROPOJENO---");
delay(3000); // startovaci pauza 2
}

void loop()
{

for (int i=0;i<200;i++)
{
if (Serial.available() > 0)
{
x==Serial.read ();

}
}

for (int i=0;i<200;i++)
{
Serial.println (x); //nebo Serial.println(char x); //odřádkuje po každé hodnotě
}

}
el.návrhář HW a SW a DPS

Uživatelský avatar
elnovy
Příspěvky: 769
Registrován: 04 črc 2010, 02:00
Bydliště: ČR - JČ
Kontaktovat uživatele:

#25 Příspěvek od elnovy »

proste kazde zadavane data bude muset byt zakocene konecnikem
aby program cekal na dalsi data a nepracoval hned ve smycce do konce
for
el.návrhář HW a SW a DPS

Uživatelský avatar
popopepe
Příspěvky: 548
Registrován: 26 říj 2005, 02:00

#26 Příspěvek od popopepe »

Kód: Vybrat vše

unsigned int x[200]; //pole o rozměru 200 prvků, doporučuji unsigned, zápornou hodnotu tam asi mít nebudeš

void setup()
{
Serial.begin(9600); // pozdeji bude navolena vyssi rychlost
int bytesSent = Serial.write("---PROPOJENO---");
}

void loop()
{

//dokud nejsou nějaká data dostupná, tak čekej
while (Serial.available() == 0){};  //doplň nějaký test na přítomost dat na vstupu...třeba takhle
for (int i=0;i<200;i++)
{
   if (Serial.available() > 0)
 {
  x[i]==Serial.read ();
 }
}

for (int i=0;i<200;i++)
 {
    Serial.print(x[i]); //nebo Serial.println(char x[i]); //odřádkuje po každé hodnotě
 }

}

Uživatelský avatar
elnovy
Příspěvky: 769
Registrován: 04 črc 2010, 02:00
Bydliště: ČR - JČ
Kontaktovat uživatele:

#27 Příspěvek od elnovy »

zase se to rozbehne po prvnim zadani data
napisu tedy slepenec v TB s tim konecnikem
a vylepsenej o tisk zadanejch hodnot hned v prvni smycce
el.návrhář HW a SW a DPS

Uživatelský avatar
popopepe
Příspěvky: 548
Registrován: 26 říj 2005, 02:00

#28 Příspěvek od popopepe »

Ono se to ale má rozběhnout po přijetí jednoho data :-)


Pokud to má fungovat jinak, musíš říct, co to má dělat.
Má to čekat na příjem hodně dat, a pak se to spustit? Kolik je hodně dat? Třeba 50?

tak oprav tu vstupní podmínku:

while (Serial.available() <= 50){}; //max je 64 bytů

Nebo to má fungovat jinak?

Uživatelský avatar
elnovy
Příspěvky: 769
Registrován: 04 črc 2010, 02:00
Bydliště: ČR - JČ
Kontaktovat uživatele:

#29 Příspěvek od elnovy »

oprava = takto s navestim N100:
unsigned int x[200]; //pole o rozměru 200 prvků, doporučuji unsigned, zápornou hodnotu tam asi mít nebudeš

void setup()
{
delay(3000); // startovaci pauza 1
Serial.begin(9600); // pozdeji bude navolena vyssi rychlost
int bytesSent = Serial.write("---PROPOJENO---");
delay(3000); // startovaci pauza 2
}

void loop()
{

for (int i=0;i<200;i++)
{
N100: if (Serial.available() > 0)
{

x==Serial.read ();
Serial.println (x); // toto potvrzuje sparavnost dat v poli dat
// if posledni data =! komecnik (konecnik = pismeno A =41hex ) potom goto N100

}
}
el.návrhář HW a SW a DPS

Uživatelský avatar
popopepe
Příspěvky: 548
Registrován: 26 říj 2005, 02:00

#30 Příspěvek od popopepe »

Kód: Vybrat vše

void loop()
{
  for (int i=0;i<200;i++)
    {
      while (Serial.available() > 0)  //pokud jsou nějaká data k dispozici
      {
        x[i]==Serial.read ();         //načti byte do x
        Serial.print(x[i]);           //vytiskni data do UART
        if (x[i]==0x41);              //je hodnota načteného bytu rovna 0x41?
          {
            break;                    //tak mazej na začátek
          }
        }
      }
}

Takhle?
Abych se přiznal, nějak se trošku ztrácím v tom, co to má dělat. Přijmeš byte, vytiskneš ho, a zkontroluješ ho na hodnotu 0x41. A co dál? Stejně se to v té smyčce bude motat donekonečna.

Tohle není problém programování, ale zadání.

Zkus to popsat jako popis jednotlivých kroků:

1. Čekej na příjem dat.
2. Přijat byte - ulož ho do proměnné
3. Vytiskni ho.
4. Zkontroluj, zda je jeho hodnota 0x41. Ta hodnota 0x41 má nějaký speciální význam? Má se vynulovat index a začít počítat od znovu?
5. Pokud ano - udělej co?
6. Pokud ne - udělej co?

7. vrať se na začátek a čekej na další byte.

Doplň ty ano - ne.
Naposledy upravil(a) popopepe dne 27 bře 2020, 22:08, celkem upraveno 1 x.

Odpovědět

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