Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   614 / 850
(#) Rober_4 válasza Kovidivi hozzászólására (») Ápr 5, 2020 /
 
A kijelző frissítése ráér, már kb így is 1másodperc alá mentem, de így is befagy a dolog az i2c-k delay-e miatt...
Abban bízom, hogy talán a közvetlen bekötéssel, nincs, vagy csak minimális kétirányú kommunikáció van, amit nem is értek minek kell, a kijelző vegye az adatot, és jelenítse meg, amikor megkapja a biteket, tudom naiv vagyok...
(#) Kovidivi válasza Rober_4 hozzászólására (») Ápr 5, 2020 /
 
"befagy a dolog az i2c-k delay-e miatt..." - ezek szerint neked teljesen mindegy, hogy hogyan hajtod meg az LCD-t, ha a programod hibás, pl. az I2C nincs rendesen lekezelve.
Én simán 4biten hajtom az LCD-t, és 50-100ms-ként lehet simán frissíteni (ilyenkor persze a szemnek zavaró a gyors változás, pl. gyorsan változó számot le se lehet olvasni rendesen). Én általában 200-500ms-ként frissítek egy értéket.
(#) Rober_4 válasza Kovidivi hozzászólására (») Ápr 5, 2020 /
 
Amit szeretnék az, hogy ha kiküldök egy lcd.cleart() akkor ne álljon meg addig a programom, amig nem végez vele. Minden megoldás érdekel, ami kihúz ebből a gödörből, 3 hete nem haladok
(#) Rober_4 válasza Kovidivi hozzászólására (») Ápr 5, 2020 /
 
Nekem kb 1 másodpercenként az első 3 karaktert van időm kiírni most. Ha e felé megyek, kicsúszok az audiobufferből
(#) Kovidivi válasza Rober_4 hozzászólására (») Ápr 5, 2020 /
 
Ne használd ezt a függvényt. Nagyon lassú. Helyette ha egy értéket akarsz változtatni, aminek fix helye van, menj oda a kurzorral, írj ki néhány szóközt (amennyi helyiértéked van), menj vissza a megfelelő pozícióra, és írd ki a szóközök helyére az új értéket.
Ha profin írod meg, akkor ha 265 266-ra vált, csak az utolsó 5-öst kell átírnod 6-ra, még szóköz sem kell. Ez olyan gyors, hogy gyorsabb nem is lehet!
(#) Rober_4 válasza Rober_4 hozzászólására (») Ápr 5, 2020 /
 
Már azt is megoldottam, hogy külön lcdbuffert csinálok egy tömbben, és csak a változást írom ki, ami tök király lehetne, de sajnos ez sem segített...
(#) Kovidivi válasza Rober_4 hozzászólására (») Ápr 5, 2020 /
 
Ha csak kevés időd van az LCD meghajtására, akkor vágd 4 részre a kijelzőt, és részenként frissítsd, mondjuk 100ms-ként. A szemed észre sem fogja venni.
A törlés parancs tart a legtovább (meg a return home parancs), igazából a függvény amit használsz is "hibás", hiszen ha kiadod a törlés parancsot, nem kell várnod, amíg az kész van! A fv. pedig megvárja azt az 1.53ms-ot, és addig blokkol. Bolondbiztosra van megírva, hogy nehogy törlés után azonnal írni akarj az LCD-re, miközben az még szépen törölgeti magát, mert akkor nem fog megjelenni rajta amit szeretnél. Bele kell kicsit folynod, hogyan működik az LCD, milyen parancsokat kap, mennyi ideig tart, amíg ezeket végrehajtja. Google: lcd 1602 pdf.
A hozzászólás módosítva: Ápr 5, 2020
(#) Kovidivi válasza Rober_4 hozzászólására (») Ápr 5, 2020 /
 
Itt a forrása az lcd.clear függvénynek, még oda is írják, hogy ez sokáig tart

lcd_clear.jpg
    
(#) Rober_4 válasza Kovidivi hozzászólására (») Ápr 5, 2020 /
 
Köszi! Pont ezt szeretném! Hogy ne kelljen megvárnom, amíg elkészül. Cserébe én is betartom az írásidőt. A 4 rész nem rossz ötlet, még megfontolom, egyenlőre, lehet a program jellege miatt célszerűbb egy változásfigyelés, mivel egyszerre tutira csak egy paraméter változik...
(#) Kovidivi válasza Rober_4 hozzászólására (») Ápr 5, 2020 /
 
Akkor az úton elindultál, már csak bele kell magad kicsit ásni, hogyan lenne a legjobb, mennyi időd van, ne legyen zavaró sem, stb.
(#) Rober_4 válasza Kovidivi hozzászólására (») Ápr 5, 2020 /
 
Igen láttam, csak azt nem értettem, hogy miért kell ezt végigvárni...
(#) Kovidivi válasza Rober_4 hozzászólására (») Ápr 5, 2020 /
 
Visszakanyarodva a legelső kérdésedre, miszerint 8bit-en gyorsabb lesz-e az LCD: - nem sokkal, mivel a 2ms-ot mindenféleképpen kivárja az lcd.clear függvényed, az adat küldése pedig sokkal gyorsabban végrehajtódik (ott is várakozás történik!).
Esetleg keress egy no delay lcd libraryt. Meg lehet oldalni interrupttal is, és akkor felszabadul a procid, sosem vár az LCD-re. Komplikáltabb megoldani, nem tudom, hogy megoldották-e már ezt a problémát: Bővebben: Link.
A hozzászólás módosítva: Ápr 5, 2020
(#) Rober_4 válasza Kovidivi hozzászólására (») Ápr 5, 2020 /
 
Ok, még egy kérdés: Tehát 4, vagy 8 bites módban gyorsabb leszek mint i2c-vel?
(#) Kovidivi válasza Rober_4 hozzászólására (») Ápr 5, 2020 / 1
 
8bit dupla olyan gyors mint a 4bit, I2C szerintem ugyanolyan gyors (esetleg kicsit lassabb is!), mint a 8bit (mivel az I2C is utána 8biten hajtja az LCD-t).
Azt olvastam még, hogy ha egymás után több karaktert küldesz az lcd.print-tel, a print úgyis a write függvényt fogja meghívni karakterenként, ami azt fogja okozni, hogy blokkol, amíg az összes karakter át nem ért. A blokkolást ki tudod számolni, ez az LCD adatlapján szerepel. Ha egyszerre kevesebb karaktert küldesz, hamarabb felszabadul a proci, jut ideje másra.
(#) benjami válasza Rober_4 hozzászólására (») Ápr 5, 2020 / 2
 
Valaha 100 éve csináltam karakteres Lcd driver-t, fel is van töltve a github-ra. Mondjuk pont arduinora nem készült el (és már nem is fog, hacsak valaki meg nem csinálja). Több működési mód közül is lehet választani, de ami közös mindegyikben az, hogy egy "frame buffer"-be kell belerakni a megjelenítendő szöveget. Beállítható olyan üzemmód is, hogy timer megszakításból a főprogramtól teljesen független módon, beállítható sebességgel (LCDFRAMEPERSEC) megszakításonként csak 1 karaktert kiírva (mert így nem kell várni a kijelzőre) folyamatosan söpri ki a frame buffer tartalmát a kijelzőre. Ez egy 8 bites PIC-en vagy AVR-en 20-30 frame/sec sebességet beállítva is mindössze 1% körüli processzoridőt emésztett fel. A driver extraként tud villogó karaktereket is megjeleníteni, saját karakterkészletet feltölteni, futás közben a karakterkészletet módosítani, meg még egy csomó egyebet.
(#) Rober_4 válasza Kovidivi hozzászólására (») Ápr 5, 2020 /
 
Köszönöm a segítséget! Átgondolom a folytatás mikéntjét
(#) Kovidivi válasza Rober_4 hozzászólására (») Ápr 5, 2020 /
 
Az is elképzelhető, hogy valami más gondod van, mert a 2ms kijelző törlés se olyan sok idő. Nem lehet, hogy az AVR-ed folyamatosan az interruptokat pörgeti, és semmi másra nem marad ideje? Ebben az esetben megértem, ha az LCD hibásan ír ki, hiszen ha túl sokáig tart a delay, hibásnak értelmezi az adatot.
Azt írtad, megírtad már, hogy egy tömbbe tárold az LCD-n szereplő karaktereket, és csak azokat frissíted, ami változik. Ha ez jól működne, nem lenne gondod. Ott ugyanis lcd.write-ot kell használod (1 karakter frissítése), ami ha lefutott, azonnal visszaadja a procinak a szálat. Jöhet az interrupt ha akar, ha lefutott, jön a következő karakter.
(#) Rober_4 válasza benjami hozzászólására (») Ápr 5, 2020 /
 
Igen én ezt vártam volna eleve a LiquidCrystal library-tól, de most már értem, hogy bolondbiztosra tervezték inkább...
(#) Kovidivi válasza benjami hozzászólására (») Ápr 5, 2020 /
 
"megszakításonként csak 1 karaktert kiírva" - ez tetszik!
Ami nekem hiányzik, az az ékezetes karakterek használata.
Megírtam már, de rettentően sok programsor.
Tehát ha van egy tömböm, amiben egy szöveg van, ékezetes karakterekkel, akkor az jelenjen is meg az LCD-n. Egyéni karakterekkel (az ö és ü pl. benne van az LCD-ben), automatikus egyéni karakter helyfoglalással (ha az á betű már szerepel az LCD memóriájában, akkor azt hívjuk meg ismét), stb.
Azzal is jó sokat elszórakoztam, hogy felismerjem, a tömbben ékezetes karakter a következő (ugye 2 byte-on tárolódik).
Egy ilyen könyvtárat korrektre, picire megírni hát nem kis feladat!
A hozzászólás módosítva: Ápr 5, 2020
(#) Rober_4 válasza Kovidivi hozzászólására (») Ápr 5, 2020 /
 
Nincs neki ideje, audiobuffert számol másodpercenként 44100szor
(#) Kovidivi válasza Rober_4 hozzászólására (») Ápr 5, 2020 /
 
Első körben próbáld meg karakterenként frissíteni, ekkor blokkol a legrövidebb ideig. Akár az egész LCD-t is újraírhatod karakterenként, ha közbe jön az interrupt, gyorsan lefut, majd folytatódik az LCD frissítése. lcd.print-et használhatsz, de csak így: lcd.print('5'); Ezt is be lehet egy saját függvénybe szervezni, hogy ne legyen csúnya.
(#) Rober_4 válasza Kovidivi hozzászólására (») Ápr 5, 2020 /
 
Ok még egy próbát teszek...
(#) Kovidivi válasza benjami hozzászólására (») Ápr 5, 2020 /
 
Nagyon szuper a könyvtárad! Szépen megírtad.
(#) Rober_4 válasza Kovidivi hozzászólására (») Ápr 6, 2020 /
 
Úgy néz ki sikerült, most működik is a múltkori elképzelés. Elvileg az audiobuffer kiírásakor meghívom az lcdrefreesh függvényt a főprogramból, az csak akkor ír ki karaktert, ha tényleges változás volt jelezve a lcdchanged tömbben. A program más részein meg meghívom az lcdkiir függvényt, aminek most két kész szöveget adok át, ezt ő beírja a tömbbe, és jelzi, hogy változás volt, ahol nem ugyanaz a karakter. Az oszlop paraméterrel tudom eltolni a szöveget majd a későbbiekben stb...
  1. const byte lcdsizex = 16;
  2. const byte lcdsizey = 2;
  3. char lcdarray [lcdsizey][lcdsizex];
  4. bool lcdchanged[lcdsizey][lcdsizex];
  5. byte lcdmutato = 0;
  6. bool lcdposemode = true;
  7. byte fi = 0;
  8. byte si = 0;
  9. bool valtozas=false;
  10.  
  11. void lcdrefreesh() {
  12.   fi = lcdmutato / lcdsizex;
  13.   si = lcdmutato % lcdsizex;
  14.   if (lcdchanged[fi][si]) {
  15.     if (lcdposemode) {
  16.       lcd.setCursor(si, fi);
  17.       lcdposemode = false;
  18.     } else {
  19.       lcd.print(lcdarray[fi][si]);
  20.       lcdposemode = true;
  21.       lcdchanged[fi][si] = false;
  22.     }
  23.   }
  24.   if (lcdposemode) {
  25.     if (lcdmutato < (lcdsizex * lcdsizey) - 1) {
  26.       lcdmutato++;
  27.     } else {
  28.       lcdmutato = 0;    
  29.     }
  30.   }
  31. }
  32.  
  33. void lcdkiir (String szoveg, String szoveg2) {
  34.   lcdkiirtomb(szoveg, 0, 0);
  35.   lcdkiirtomb(szoveg2, 1, 0);
  36.   lcdmutato=0;
  37.   lcdposemode=true;
  38. }
  39.  
  40.  
  41. void lcdkiirtomb(String szoveg, byte sor, byte oszlop) {
  42.   if (sor < lcdsizey) {
  43.     for (int i = 0; i < szoveg.length(); i++) {
  44.       if (oszlop + i < lcdsizex) {
  45.         if (lcdarray [sor][oszlop + i] != szoveg[i]) {
  46.           lcdarray [sor][oszlop + i] = szoveg[i];
  47.           lcdchanged[sor][oszlop + i] = true;
  48.         }
  49.       }
  50.     }
  51.   }
  52. }
A hozzászólás módosítva: Ápr 6, 2020
(#) mateatek válasza Rober_4 hozzászólására (») Ápr 6, 2020 / 1
 
A forrást nézve az az LCD meghajtására digitalWrite() függvényt használ. Ilyenkor jogos az a felvetés, hogy van-e spéci sebességű láb? Van. A digitalWrite() függvény mindig megnézi, hogy az adott láb timer láb-e, és ha az, akkor lekapcsolja (biztos ami biztos) alapon a timert erről a kimenetről. Tehát talán elérhetsz sebességnövekedést, ha a timer lábakat kihagyod a játékból. Illetve átírhatod a forrást úgy, hogy digitalWrite() helyett az adott láb regisztereit kungfuzza.
(#) vgyre hozzászólása Ápr 7, 2020 /
 
Jó reggelt Mindenkinek!
Egy kis segítséget szeretnék kérni. Egy egyszerű reflexidő mérő programját szeretném megalkotni. A működése egyszerű, egy LED bekapcsolásakor a millis() függvénnyel kiolvasom a számláló értékét, majd egy nyomógomb lenyomásakor ismét kiolvasom a számlálót. A két értéket kivonom egymásból, és a kapott érték a reflexidő. A problémám az, hogy a különbség mindig 0. Ha bármelyik változó helyére egy konkrét számot írok, működik, ha összeadom a változókat, működik. Valamiért a kivonás mindig 0-át ad vissza. A változók, az eredmény is, unsigned long típusú.
Miért nem működik a kivonás? Ebben szeretnék tanácsot kérni!
(#) Kovidivi válasza vgyre hozzászólására (») Ápr 7, 2020 /
 
Program nélkül senki sem fogja tudni megmondani...
(#) djusee válasza vgyre hozzászólására (») Ápr 7, 2020 /
 
Valószínű a hidegfront végett. Kód?
(#) vgyre válasza djusee hozzászólására (») Ápr 7, 2020 /
 
Bocsi!
A hozzászólás módosítva: Ápr 7, 2020

Lcd_test.ino
    
(#) Rober_4 válasza vgyre hozzászólására (») Ápr 7, 2020 /
 
De hát ki sem vonod az ido_uj-ból az ido_oldot, ami ráadásul pont fordítva lett elnevezve...
Ezt meg a kivonás kiírás után kéne, hisz felülírja: ido_uj=millis(); (20. sor)
A hozzászólás módosítva: Ápr 7, 2020
Következő: »»   614 / 850
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem