Nahodne pixely na OLED

milhauszn
Příspěvky: 10
Registrován: 12 říj 2019, 11:28
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od milhauszn » 22 pro 2019, 22:27

V kodu neni, je to jeden radek, psal jsem to v prvnim prispevku:
"Dnes jsem pridal do casti zapisu do grafu tone, pro kratke pipnuti pri zapisu hodnoty, a nahodne pixly se rozsirily az pres pismeno C."
Je to tone(1000,myslim ze 8, 100);
V tom zminem if po 10sec.
Kazdopadne ty nahodne pixely jsou jen na hlavni obr, ktera ma refresh jen kazde dve sec. Nebo otocenim enkoderu pod nulu.
Kazdopadne pokud se nepouzije par radku ze zapisu do grafu po 10 sek, tak pixely zmizi. Ted jsem to testoval, pridanim tone naopak se pixely rozsiri a to bez ohledu na to, zda uz byla.funkce po 10sek.zavolana nebo ne!
Opet me napada, nemuze byt problem s millis, casem z nej, a pro tone s druhym casovacem, neovlivnuje to nejak I2C komunikaci?

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od ondraN » 23 pro 2019, 08:37

Funkcí millis() to téměř jistě nebude. Ta vlasně jenom načte hodnotu systémového registru, který má 4byte a každou milisekundu se inkrementuje o jednu. Běží neustále od zapnutí nebo resetu arduina ať se funkce volá nebo nevolá.
Pokud se to děje pouze ve funkci hlavniobr() a zakomentováním řádku

Kód: Vybrat vše

display.drawPixel(127-i, 32-graf[i]/10, SSD1306_WHITE);

to zmizí, tak je téměř jisté, že bude nějaká blbost v poli graf (vysoká pravděpodobnost) nebo nějaká chyba v metodě drawPixel (velmi nízká pravděpodobnost). Hodnoty co jsou v poli graf nejsou nikde kontrolovány na rozsah, takže by nebylo od věci udělat si pomocnou proměnnou, před vykreslením bodu do ní dosadit hodnotu graf a zkontrolovat min. a max. hodnotu a pokud budou mimo rozsah tak do proměnné přiřadit min. nebo max.
Pokud bude problém i po takové kontrole, může se jednat o nějakou kolizi v přístupu k systémovým prostředkům od jednotlivých knihoven. To se ale zjišťuje a řeší dost blbě, takže nejdřív je nuné vyloučit vlastní chyby a teprve pak hledat ostatní příčiny.

milhauszn
Příspěvky: 10
Registrován: 12 říj 2019, 11:28
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od milhauszn » 23 pro 2019, 10:26

No nerikam ze millis je spatna, jen ze az pri pouziti to zaclo.
Zakomentovani nepomohlo, viz prilozeny obrazek.
Tu chybu se snazim najit samozrejme v mem kodu, ale nedari se mi, proto se tu ptam a jsem rad za jakykoliv podnet.
Rozdil teplot je vzdy max kolem 1stupne, diky presnosti cidel po zapnuti. Kazdopadne i pri prekroceni rozsahu 5 stupnu to nema vliv na nahodne pixely, vyzkouseno, hledano. Graf zkousen ponechan jen z definovani s nulama, bez jeho obnovovani po 10sekundach. Zakomentovanim vlozene hodnoty. Opet pixely hned od zacatku.
Na obrazku je videt jak i s tim zminenym pipnutim pixely jsou.
Zkusim asi "povypinat" dokreslovanj osy po pixelech jeste.
Ale neni mi jasne, pokud zmenim ci zakomentuji neco co ma v podmince 10 sekund (i ten tone) proc to ma vliv od zacatku?
Jak prekladac funguje detailne nevim, ale dle kodu by to souvislost mit nemelo, nebo se pletu?Obrázek

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Nahodne pixely na OLED

Příspěvek od jankop » 23 pro 2019, 12:41

Jsou věci mezi nebem a zemí...
Nevím, v čem je přesně tvůj problém. Ale teď nedávno jsem psal program, který pracoval s malými čísly. A tam jsem se docela vyškolil, že je třeba pozorně hlídat typy proměnných a používat přetypování.
Třeba tvoje příkazy

Kód: Vybrat vše

cas_rozdilu[40] = cas_akt/1000;
graf[40] =20* rozdil;
mohou být tou "dlažbou do pekla". Mixuješ si typy proměnných, jak tě napadne. Ano, vím, možná z kontextu vyplyne, že se to nakonec chová správně, ale jsi si tím jist?
Někdy nezaškodí, nastavit si vyšší úroveň varování překladače, pak se sice budeš divit, ale může to být přínosem.

milhauszn
Příspěvky: 10
Registrován: 12 říj 2019, 11:28
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od milhauszn » 23 pro 2019, 14:49

Diky za odpoved.
Zkusim najit kde se da zmenit vypis hlaseni prekladace.
Ano mixuji promene, to bylo to prvni co me napadlo resit a zkouset osetrit.
Bohuzel pole typu float se mi nepodarilo vytvorit ani temer v prazdnem prikladu, nevim zda Nano nema nejake omezeni, ale i pri pouzit treba 2 prvku pri bootu se zasekne a konec.
Pak jsem se docetl ale v ruznych vysvetlenich a prikladech ze si to program umi sam osetrit, a umi i float nacpat sam do int, bez nutnosti pouzit (int), cehoz vyuzivam a abych zjistil i rozdily pod 1stupen, nasobim 20.
Dale pri ruznych prikladech jsem si nastudoval, ze pokud delim ci nasobim konstatnou bez desetine tecky, tak vysledek je automaticky integer. Coz jsem si i vyzkousel a opravdu to funguje, proto pro zobrazeni cisla na setiny mam nasoby s desetinou teckou a v techto mistech ne. Je to tedy spatne? Priklady kde je na arduino.cc a jinde napsano jsou tedy spatne?
Ptam se protoze se ucim, chci to umet, udelat co zrovna chci, je to pro ne zabava, nechci se tim zivit. Driv jsem na VS psal v TurboPascalu v prvaku, pak i nejaka Java, C a jeho klony jen malo. Nejvic v Matlabu, ale to je o necem jinem.
Chtel bych tedy prijit na to, co tam dela problem a pochopit jak to je.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od ondraN » 23 pro 2019, 20:28

Nastavení pro překladač uděláš v menu Soubor-Vlastnosti a v řádku Varování překladače zvolíš Všechno.
Pak kód zkompiluj a postni sem ten výstup. Je možné, že tím, kolik tam máš různých knihoven, je problém s pamětí.
Pokud se chceš ve psaní kódu zdokonalovat, asi by bylo dobré se podívat na základy ANSI C a dále na C++, který je vlastně i jazykem arduina. Třeba používání globálních proměnných ve funkcích je nepřehledné i nebezpečné, všechny parametry (kromě pár vyjímek) by se měly zásadně předávat v hlavičce funkce, hodnotou nebo odkazem. Pokud je nutné nějaké věci přetypovat z širšího typu na užší (jako třeba ten float na int), tak to nenechat na tichém přetypování překladačem, ale pomocí operace přetypování (tím dáš najevo že je to úmysl) atd. Na netu se najde hromada kódu ke studiu, ale, bohužel, toho dobře napsaného už moc ne. Mohu doporučit skvělou knihu Mistrovství v C++ (IV vydání), a nebo Beginning C for Arduino, Second Edition. Ta první je zaměřená spíše na PC, ale obecný výklad jazyka a objektového programování je excelentní. Ta druhá je zaměřena hlavně na arduino a je taky výborná.

milhauszn
Příspěvky: 10
Registrován: 12 říj 2019, 11:28
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od milhauszn » 25 pro 2019, 18:59

Diky moc za informace.
Kniha uz stazena. Zbezne jsem na to kouknul. Nejake zaklady mam, aj objektoveho, ale nikdy me to nebavilo a delal jsem to nerad.
Chapu to s promenymi, predavanim atd, jen jsem byl trochu liny a z pocatku psani prvniho prgramu jsem jen zobrazoval teplotu v cyklu a jeji rozdil. Az pote me napadaly ruzne dalsi dodelavky a tak kod pribral na delce a rozdelil do funkci a uz se mi nechtelo ty definice promenych menit. Tot tolik na moji obhajobu a urco to zkusim predelat.
Vypis protokolu je zde vlozeny do code, aby to nebyl takovy zmatek.
Snad se k otmu zase chvili dostanu, ted jsem se vic venoval rodince nez programu ;-)
Dekuji za rady v kazdem prispevku a i ted, myslim to vazne.

Kód: Vybrat vše

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c: In function '__vector_24':

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:447:49: warning: this statement may fall through [-Wimplicit-fallthrough=]

       twi_masterBuffer[twi_masterBufferIndex++] = TWDR;

                                                 ^

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:448:5: note: here

     case TW_MR_SLA_ACK:  // address sent, ack received

     ^~~~

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:529:9: warning: this statement may fall through [-Wimplicit-fallthrough=]

       if(0 == twi_txBufferLength){

         ^

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src\utility\twi.c:534:5: note: here

     case TW_ST_DATA_ACK: // byte sent, ack returned

     ^~~~

C:\Users\Zdenek\Documents\Arduino\libraries\Adafruit_GFX_Library\glcdfont.c:22:28: warning: 'font' defined but not used [-Wunused-const-variable=]

 static const unsigned char font[] PROGMEM = {

                            ^~~~

C:\Users\Zdenek\Documents\Arduino\libraries\Adafruit_GFX_Library\Adafruit_GFX.cpp: In member function 'virtual void Adafruit_GFX::invertDisplay(boolean)':

C:\Users\Zdenek\Documents\Arduino\libraries\Adafruit_GFX_Library\Adafruit_GFX.cpp:1456:42: warning: unused parameter 'i' [-Wunused-parameter]

 void Adafruit_GFX::invertDisplay(boolean i) {

                                          ^

C:\Users\Zdenek\Documents\Arduino\libraries\Adafruit_GFX_Library\Adafruit_SPITFT.cpp: In member function 'void Adafruit_SPITFT::writePixels(uint16_t*, uint32_t, bool, bool)':

C:\Users\Zdenek\Documents\Arduino\libraries\Adafruit_GFX_Library\Adafruit_SPITFT.cpp:978:8: warning: unused parameter 'block' [-Wunused-parameter]

   bool block, bool bigEndian) {

        ^~~~~

C:\Users\Zdenek\Documents\Arduino\libraries\Adafruit_GFX_Library\Adafruit_SPITFT.cpp:978:20: warning: unused parameter 'bigEndian' [-Wunused-parameter]

   bool block, bool bigEndian) {

                    ^~~~~~~~~
                    

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od ondraN » 26 pro 2019, 08:33

A co ta část, kde je vypsáno využití paměti?

milhauszn
Příspěvky: 10
Registrován: 12 říj 2019, 11:28
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od milhauszn » 26 pro 2019, 12:31

Pardon:
Projekt zabírá 20838 bytů (67%) úložného místa pro program. Maximum je 30720 bytů.
Globální proměnné zabírají 840 bytů (41%) dynamické paměti, 1208 bytů zůstává pro lokální proměnné. Maximum je 2048 bytů.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Nahodne pixely na OLED

Příspěvek od ondraN » 26 pro 2019, 18:05

Tak ty vypisy jsou OK. Ještě jednou jsem se podíval do toho tvého kódu a něco jsem našel.

Kód: Vybrat vše

cas_akt = millis();    //ziskani teplot teploty 
  if (cas_akt >= cas_predch_r + 2000) {
    cas_predch_r = cas_akt;
    zisktepl();
    if (!ref & pos ==0){
      hlavniobr();
    }
    if (!ref & pos>0){
      vedlobr();
    }
   }
jde o tyhle podmínky

Kód: Vybrat vše

 if (!ref & pos ==0){
 if (!ref & pos>0)
 
Podle precedence operátorů se ti nejdříve udělá not, pak and a nakonec porovnání. To asi nebyl záměr. pak se ti asi volá funkce vedlobr(), na kterou jsem tě upozorňoval, že pro pos==0 jde za hranice pole.
Ty výrazy v podmínkách uprav pomocí závorek např. if (!(ref) & (pos>0)) ; zkontroluj si, zda to není i jinde v kódu. Závorky používám, ikdyž to není třeba, ale výrazně se tím zvýší přehlednost kódu a nemusím si stále listovat tabulkou precedencí.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 15 hostů