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   633 / 839
(#) mateatek hozzászólása Jún 10, 2020 /
 
Tisztelt Fórumozók!

Van egy gondom az Arduino-val és egy NRF24L01-es modullal. A modul megszakításon keresztül ugrasztja az Arduino-t, ha vétel van. Vesz, elvégzi a feladatokat és minden rendben is van. De ha a kapcsolat messziről épül föl és közben megszakad a nagy távolság miatt, többé nem kapok megszakítást a modultól, noha a másik oldalon adásokat küld az ellen-állomás.
Innentől kezdve nem tudom vételre bírni, csak resettel. A program nem fagy le, nem ragadok végtelen ciklusba sem. Egyszerűen nem küld megszakítást a rádiós modul és a radio.available() sem teljesül.

  1. #include <SPI.h>
  2. #include <RF24.h>
  3.  
  4. RF24 radio(7, 8); // CE, CSN
  5. const byte address[][6] = {"00001", "00002"};
  6.  
  7. volatile unsigned long vett = 0;
  8. volatile byte vetel = 0;
  9.  
  10. void setup() {
  11.   TIMSK0 = 0; //nincs megszakitas;
  12.   TIFR0 = 0; //nincs megszakitas;
  13.   Serial.begin(9600);
  14.   radio.begin();
  15.   radio.setDataRate(RF24_2MBPS);
  16.   radio.openReadingPipe(1, address[0]);
  17.   radio.openWritingPipe(address[1]);
  18.   radio.setPALevel(RF24_PA_MIN);
  19.   radio.maskIRQ(1, 1, 0);
  20.   attachInterrupt(0, Beerkezo, FALLING); //2 pinen megszakitas
  21.   radio.startListening();
  22. }
  23.  
  24. void Beerkezo() {
  25.   while (radio.available()) {
  26.     radio.read(&vett, sizeof(unsigned long));
  27.   }
  28.   vetel = 1;
  29. }
  30.  
  31. void loop() {
  32.   if (vetel == 1) { feladatok_tomkelege;}
  33. }
(#) Rober_4 hozzászólása Jún 10, 2020 /
 
Sziasztok! Tegnapról mára megállt az Arduino Ide-m? Inicializálásnál megáll. Letöröltem. Az "AppData\Local"-ból is is a dolgokat, a Dokumentumokban az Arduino könyvtárat átneveztem, újraraktam. Most már elindul néha, de nem tudok telepíteni semmit, Java.Lang.NullPointerException...
(#) kapu48 válasza djusee hozzászólására (») Jún 10, 2020 /
 
A probléma létezik. De az ajánlott megoldásod nem jó.
A linkelt oldal magyarázata is félrevezető mer a túl csordulást -érték (mínusz) ként kezeli.
  1. unsigned long time;

meghatározás szerint: unsigned = pozitív egész szám.
Ez túl csorduláskor is pozitív egész érték marad, viszont az előző nagy értékből jóval kisebb értéket kapunk. Ha meg akarjuk oldani ezt a problémát akkor ezt a változást kell figyelnünk.

Mivel ez idő egység! Az időben pedig vissza menni nem tudunk, egyfolytában csak öregebbek leszünk. Ezért a jelenlegi idő - X idő problémával értelmetlen foglalkozni.
A hozzászólás módosítva: Jún 10, 2020
(#) Rober_4 válasza Rober_4 hozzászólására (») Jún 10, 2020 /
 
Közben megjavult. Nem értem
(#) djusee válasza kapu48 hozzászólására (») Jún 10, 2020 / 2
 
Igen, előjel nélküli tehát nem lehet negatív,hol kezelik negatív előjelesként? Nem a túlcsordulást érzékeljük vele (nem lessz tudomásunk róla hogy az unsigned long vagyis uint32 túlcsordult csupán nem akad meg az if feltételt vizsgáló kódrészletünk), próbáltam. Az alábbi részlet Gammon oldaláról kölcsönöztem:
  1. millis ()   -  startTime    =  difference
  2.                              (modulo 2^32)
  3. 4294917296     4294917296               0  <-- itt futott bele az if feltételbe
  4. 4294917297     4294917296               1
  5. 4294917298     4294917296               2
  6. ...
  7. 4294967295     4294917296           49999  <-- largest unsigned long value(elérte az uint32 maximumát)
  8.          0     4294917296           50000  <-- wraps here back to zero(túlcsordult és kezdi 0-ról)
  9.          1     4294917296           50001  <-- keeps counting up
  10. ...
  11.       9999     4294917296           59999
  12.      10000     4294917296           60000  <-- time's up!


Próbáld ki, ugorjunk az idöben állítsuk be a millis-t túlcsordulás elötti állaptoba. Ha feltöltöd az alábbi programot a terminálban látni fogod hogy megjelenik a "-" és a "+" is mivel mind a kettő feltétel teljesül (fel lehet cserélni a sorrendet a feltételvizsgálatnál) mivel nincs ami megakassza a programot és túlcsordulás előtt oda tud ugrani a feltételvizsgálathoz. De ha kiveszed kommentből az 1ms -os delayt (a programunk épp mást csinál amikor bekövetkezik a túlcsordulás) akkor már az összeadásos feltétel nem fog teljesülni, tehát a terminálban is csak a "-" fog láttszódni
  1. #include <Arduino.h>
  2. #include <util/atomic.h>
  3.  
  4. unsigned long periodus = 500;
  5.  
  6. unsigned long utolso = 4294966794;
  7. unsigned long ledUtolso = 4294966794;
  8.  
  9. void setup() {
  10.         Serial.begin(9600);
  11.         setMillis(4294967295);
  12.         //delay(1);
  13.         //Serial.println(0UL - utolso);
  14. }
  15.  
  16. void loop() {
  17.         if (millis()-ledUtolso >= periodus){
  18.                 ledUtolso = millis();
  19.                 Serial.println("-");
  20.         }
  21.  
  22.         if (millis() > utolso + periodus){
  23.                 utolso=millis();
  24.                 Serial.println("+");
  25.         }
  26. }
  27.  
  28. void setMillis(unsigned long ms){
  29.         extern unsigned long timer0_millis;
  30.         ATOMIC_BLOCK (ATOMIC_RESTORESTATE) {
  31.                 timer0_millis = ms;
  32.         }
  33. }
(#) sargarigo válasza mateatek hozzászólására (») Jún 10, 2020 /
 
Ha a reset segít, akkor watchdog lehet a barátod! Ez azt csinálja, hogy egy számlálót futtat, amit a szoftvered rendszeresen töröl. Ha valamiért mégsem tette meg, akkor a számláló túlfut, és dob egy resetet az áramkörnek.
Akár így, vagy akár átdolgozva a módszert neked is használhat!
Szerk.: Most olvasom jobban, neked az NRF modulod "fagy le"? Esetleg bizonyos idő elteltével pollingra váltani nem lehet? Legalább annyira hogy kiderüljön volt-e vétel.
A hozzászólás módosítva: Jún 10, 2020
(#) Kovidivi válasza djusee hozzászólására (») Jún 10, 2020 /
 
Igazad van. Az "utolso" a bekapcsolás pillanatában 0, a "millis()" is. 0-ból 0 az 0. Nem okoz gondot.
Jó, hogy írtad, először félrenéztem a változókat.

Egy esetet kell még átgondolni:
Az "utolso" legyen a túlcsordulás előtti szám (maximális unsigned long szám-1), a millis legyen mondjuk 10. Ekkor 10-"max. uns. long-1"-et kell kiszámolni.

Leírok néhány példát, mindhárom szám unsigned long:
10-10=0
10-11=maximális unsigned long szám-1
10- "maximális unsigned long szám-1"=11
Jól számoltam? Szerintem igen.

Köszi, hogy megosztottad! Át fogok erre térni.
Azért negatívot nem érdemelt a hozzászólásod...
A hozzászólás módosítva: Jún 10, 2020
(#) usane válasza mateatek hozzászólására (») Jún 10, 2020 /
 
Biztos vagy benne, hogy nem küld és nem az Adruino szoftver nem keezel valamit? Ellenőrizted a kommunikációs vonalakat szkóppal, logikai analizátorral?
(#) djusee válasza Kovidivi hozzászólására (») Jún 10, 2020 /
 
Szívesen, sajnálom ha beszólásnak tünt, nehezen fogalmazok, fórumon rosszul néz ki, visszaolvastam
, Itt egy nagyon hasznos számológép (tud valaki hasonlót linuxra?), beállíthatod hogy 32bites számokkal számolj és hogy előjeles vagy nem előjeles számokkal dolgozz.
(#) kapu48 válasza djusee hozzászólására (») Jún 10, 2020 /
 
Ez csak nyakatekert bele erőszakolása a - (mínusz) jelzésnek a feladatba.
Miközben annak semmi helye itten.
Az egész feladat megoldható az értékek kisebb illetve nagyobb figyelésével.
(#) icserny válasza Directors hozzászólására (») Jún 10, 2020 /
 
char, int, long 8, 16 illetve 32 bites egész változók
unsigned - típusmódosító: előjel nélküli számot jelöl)
boolean - logikai változó, ami elvileg 1 biten is elférne, de a bájt szervezésű memóriában muszáj neki egy bájtot fenntartani.

unsigned long nowTime, redTime, greenTime;
Három előjel nélküli 32 bites változónak foglalunk helyet

boolean rState=LOW, gState=LOW;
Két logikai változónak foglalunk helyet a LED-ek állapotának nyilvántartására.

  1. nowTime = millis();
  2.   redTime = nowTime + 10000;
  3.   greenTime = nowTime + 1000;

A pillanatnyi időponthoz képesti eltolással adjuk meg, hogy mikor változzon a piros, illetve a zöld LED állapota.

  1. nowTime = millis();    //Ránézünk az órára és felírjuk a nowTime változóba
  2.   if(nowTime > redTime) { //Ha már elértük a RED_LED billenési idejét
  3.     rState = !rState;     //Negáljuk a feljegyzett állapotát
  4.     digitalWrite(RED_LED,rState); //Ezt az új állapotot kiírjuk a kimenetre
  5.     redTime += 10000;  //Feljegyezzük az új billenési időpontot
  6.   }
(#) kapu48 válasza djusee hozzászólására (») Jún 10, 2020 /
 
Ez a vita értelmetlen, részemről inkább itt a helyes megoldás:
  1. // Millis túlcsordulás figyelés megoldása!!
  2.  
  3. unsigned long periodus = 500;
  4.  
  5. unsigned long utolso;
  6. unsigned long ledUtolso;
  7. unsigned long ledKovetkezo;
  8.  
  9. void setup() {
  10.         Serial.begin(9600);
  11.        
  12.         //delay(1);
  13.         //Serial.println(0UL - utolso);
  14.         ledUtolso = millis();
  15.         ledKovetkezo = millis() + periodus;
  16. }
  17.  
  18. void loop() {
  19.     if(ledUtolso < ledKovetkezo){ // Általános esett
  20.         if (millis() >= ledKovetkezo){
  21.                
  22.                 Serial.println("Csinal valamit");
  23.                 ledUtolso = millis();
  24.                 ledKovetkezo = millis() + periodus;
  25.         }
  26.     }else{  // tulcsordulás következik
  27.         if (millis() < ledKovetkezo){  // Bekövetkezett a túlcsordulás
  28.                 ledUtolso = millis(); // korrigáljuk, ez által már igaz lesz az első if feltétel. a következő 50 napig
  29.                
  30.         }
  31.     }
  32.  
  33. }


Figyelmébe ajánlom a probléma felvetőjének.
A hozzászólás módosítva: Jún 10, 2020
(#) djusee válasza kapu48 hozzászólására (») Jún 10, 2020 /
 
Az a '-' nem egy jelzés, az egy matematikai müvelet (kivonás), a másik amelyiknél fennáll a hiba lehetösége az pedig a '+' (összeadás).
(#) kapu48 válasza djusee hozzászólására (») Jún 10, 2020 /
 
A módszered csak jelzi a hibát.
Az enyém viszont megszünteti!

Melyik a jobb?
(#) djusee válasza kapu48 hozzászólására (») Jún 10, 2020 /
 
Egyszerüsíteni akarod pedig ez még komplikáltabb, 2 darab if et használsz. Itt Te is a kivonást ajánlod.
(#) djusee válasza kapu48 hozzászólására (») Jún 10, 2020 /
 
Épp hogy nem jelez, nem veszed észre a túlcsordulást
(#) kapu48 válasza djusee hozzászólására (») Jún 10, 2020 /
 
A 15:07-es linken levő válasz nem a millis túl csordulásáról szól.

Nem észrevenni kellene, hanem kiküszöbölni a millis túl csordulás általa okozott hibát!
Mivel ez nálam ki lett küszöbölve, már felesleges jelzésével foglalkozni.
(#) djusee válasza kapu48 hozzászólására (») Jún 10, 2020 /
 
Elbeszélünk egymás mellett, a válaszom erre a hozzászólásodra vonatkozik amikor is állítod hogy a
Idézet:
„A módszered csak jelzi a hibát.
Az enyém viszont megszünteti!”
, és erre írtam hogy
Idézet:
„Épp hogy nem jelez, nem veszed észre a túlcsordulást”
(hejj így azért írkálva mégsem olyan egyszerü). A millis túlcsordulást én hoztam fel, nem volt téma és azt is csak azért hogy ha így szokunk hozzá az időzítés használatához akkor megeshet (kicsi a valószínüsége DE megeshet, ezt feltételes módban mondtam már az elsö hsz. ban is) hogy gond lessz a progiban. Mondjuk a kazánvezérlőnk 100 ms intervallummal beolvassa a hömérsékletet, ha balszerencsések vagyunk akkor tulcsordulás után ha nem olvassa be majdnem 50 napig a hömérsékletet akkor abból elég nagy gáz lehet, de hagyjuk. A millis idözítés használata amit Te és Kovidivi ajánlott az a helyes, én csak erre szerettem volna felhívni a figyelmet, mivel szinte semmivel sem komplikáltabb kivonást használni feltétel vizsgálatkor mint összeadást és ha ezzel ki lehet küszöbölni a lehetséges problémát akkor jobb úgy megszokni a használatát.
(#) djusee válasza djusee hozzászólására (») Jún 10, 2020 /
 
Próbáld ki így,
  1. unsigned long periodus = 500;
  2.  
  3.     unsigned long utolso;
  4.     unsigned long ledUtolso;
  5.     unsigned long ledKovetkezo;
  6.  
  7.     void setup() {
  8.             Serial.begin(9600);
  9.  
  10.             //delay(1);
  11.             //Serial.println(0UL - utolso);
  12.             setMillis(4294966795);
  13.             ledUtolso = millis();
  14.             ledKovetkezo = millis() + periodus;
  15.             delay(510);
  16.     }
  17.  
  18.     void loop() {
  19.         if(ledUtolso < ledKovetkezo){ // Általános esett
  20.             if (millis() >= ledKovetkezo){
  21.  
  22.                     Serial.println("Csinal valamit");
  23.                     ledUtolso = millis();
  24.                     ledKovetkezo = millis() + periodus;
  25.             }
  26.         }else{  // tulcsordulás következik
  27.             if (millis() < ledKovetkezo){  // Bekövetkezett a túlcsordulás
  28.                     ledUtolso = millis(); // korrigáljuk, ez által már igaz lesz az első if feltétel. a következő 50 napig
  29.  
  30.             }
  31.         }
  32.  
  33.     }
  34. void setMillis(unsigned long ms){
  35.         extern unsigned long timer0_millis;
  36.         ATOMIC_BLOCK (ATOMIC_RESTORESTATE) {
  37.                 timer0_millis = ms;
  38.         }
  39. }

a setMillis csak azért kell hogy be állítjuk a millis-t túlcsordulás - 500 ms értékre, a delay pedig ha a progi valmi mással van elfoglalva akkor már a dupla if-ed sem fog segíteni. Ismét, kicsi az esélye de a hiba lehetösége fenn áll.
(#) Kovidivi válasza djusee hozzászólására (») Jún 10, 2020 /
 
Így van, a te megoldásod kihasználja az unsigned long lehetőségeit, és plusz if-ek nélkül tökéletesen műkődik a túlcsordulás környékén is. Mindenféle plusz bonyolítás felesleges, csak plusz tárhely, prociidő és hibalehetőség.
(#) mateatek válasza usane hozzászólására (») Jún 10, 2020 /
 
Szkóppal nem ellenőriztem, de számlálom a megszakításokat. Ha kívülről ráerőltetek egy megszakítást arra a lábra, ahová a rádiónak kellene, akkor az lefut, de nem történik meg a vétel abban az esetben sem.
Ilyen, megszakadt kapcsolat esetén újra futtatom a rádió inicializálását, akkor újra működik. (14-19 sor).
Most még megpróbálok ráfeküdni a CE lábra, hátha a rádió valamiért nincsen engedélyezve ilyenkor.
(#) tirisztortetróda válasza Johnycorp hozzászólására (») Jún 10, 2020 /
 
Sziasztok!

Gondoltam megirom, hogy töltödött végül fel a progi. Rendeltem a HE store-bol egy FTDI-s illesztot, es egy uj ESP modult is. Ez a kombinacio elsore mukodott. Majd betettem az uj usb uart illesztobe a regi ESP-t, es az is mukodik. A CH 340G-s illesztokkel nem megy a programozas. A feltoltott programot meg nem probaltam ki, ahhoz meg hardver kell, de az ESP modulokra felment a progi. Az erdekes az, hogy a CH340G-vel is ment a kommunikacio, es az AT parancsok, csak programozasi modba nem volt jó, hiaba latszodott a rajta levo leden, hogy kuldi kifele az infot.

Szeretnek mindenkinek koszonetet mondani a segitsegert!
(#) KoblogPerGyok válasza djusee hozzászólására (») Jún 10, 2020 /
 
Sziasztok!

A túlcsordulást akarjátok detektálni? Mert azt lehet szerintem.
(#) Kovidivi válasza KoblogPerGyok hozzászólására (») Jún 10, 2020 /
 
Nem, nem akarjuk detektálni.
(#) asch válasza mateatek hozzászólására (») Jún 10, 2020 /
 
Én is csináltam ezzel a csippel egy rádiós hőmérőt, és nekem is furán működött. Mivel breadboardon volt összerakva a mérő és az ablakpárkányon még eső is esett rá, a vevő pedig simán Arduino Uno-ra volt drótozva és USB-n lógott, ezért én kontakthibára gyanakodtam. Többször is néhány nap után újra kellett indítanom, hogy elkezdjen adni/venni annak ellenére, hogy látszólag minden oké volt.

Az én programom az adatlan alapján saját megvalósítással kommunikált és pollozta a csipet. Tehát ha közös módosú a hiba, akkor nem az IRQ küldés a probléma, hanem a vevő logika akad be valahol.

Egy hardver tervező ismerősömtől egyébként ezt a bölcsességet tanultam: mindig úgy kell mindent megtervezni, hogy a vezérlőnk ne csak soft resetet tudjon adni, hanem teljes tápelvételt is tudjon csinálni. Pont valami rádiós modullal szívtak, és ott lett végül az az egyetlen megoldás (inkább workaround), hogy időnként hard reszetelték a modult. A sima szoft reset nem volt elég
(#) mateatek válasza asch hozzászólására (») Jún 11, 2020 /
 
Nekem nyákon van a készülék, nem ázik. Igaz, a modul tüskesor aljzatba van bedugva.
Sajnos, nem ismerem kellően ezt a modult, itt a gond. Talán túlcsordul a vevő buffer és ezért nem küld megszakítást, vagy valami hasonló probléma lehet.
(#) Lamprologus válasza Rober_4 hozzászólására (») Jún 11, 2020 /
 
Nekem is meghalt az IDE-m!
Csomagok inicializálása ... és puff, kilép.
(#) Lamprologus válasza Lamprologus hozzászólására (») Jún 11, 2020 /
 
Windows 10 ...
Idézet:
„C:\Program Files (x86)\Arduino>arduino_debug
Set log4j store directory C:\Users\Lamprologus\AppData\Local\Arduino15
Konfiguráció betöltése...
Csomagok inicializálása...
java.lang.NullPointerException
at cc.arduino.contributions.packages.ContributionsIndexer.parseIndex(ContributionsIndexer.java:134)
at processing.app.BaseNoGui.initPackages(BaseNoGui.java:483)
at processing.app.Base.<init>(Base.java:273)
at processing.app.Base.main(Base.java:150)”
(#) KoblogPerGyok válasza Kovidivi hozzászólására (») Jún 11, 2020 / 2
 
Ok, köszi!

Akkor nem értem pontosan mit is szeretnétek. Azért leírom a gondolatimat, ha nem baj. A millis() egy Timer-en van. Az Arduino is csak egy uc, szóval van neki egy olyan opciója, hogy ugyan a Timer túlcsordulását nem tárolja a regiszterben, de egy interruptot ad. Erre az interruptra rá lehet aggatni egy függvényt, amiben egy változót pl. 1 re állít az ember. A fő programban ezt a változót figyelni kell. Ha 0, akkor minden megy ahogy kell. Ha 1 akkor az eltelt idő a korábbi millis és a túlcsordulásig kellő érték, plusz a jelenlegi érték. Utána persze ezt a változót 0-ra vissza kell állítani. Ez a változó volatile byte.

Csak leírom, mert hátha valakinek ötletet ad a későbbiekben.
(#) usane válasza mateatek hozzászólására (») Jún 11, 2020 /
 
Voltak hibák abban a libben, nem tudom most hol tart.
Egy kis ötletadó.
Következő: »»   633 / 839
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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