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   367 / 845
(#) RoliNyh válasza tbarath hozzászólására (») Júl 24, 2017 /
 
Lehet az a probléma, de megszabadultam a "saját" fügvénytől egyelőre...
(#) jeges válasza RoliNyh hozzászólására (») Júl 24, 2017 /
 
Amit linkeltem müxik csak ki kel hámozni a lényeget ami érdekel de mérd meg a felvet áramot cpu vccn ha alszik pár mikro amper csak a fogyasztás!
(#) mateatek hozzászólása Júl 25, 2017 /
 
Üdvözlet!

Lenne egy kérdésem.
Belső megszakítással, egy timerről szeretnék időzíteni. Ugye az Arduino teszi a dolgát, jön a megszakítás, eltelik x órajel ciklus, mire félre teszi azt, amit csinál és végrehajtja a megszakítást.
Az lenne a kérdésem, hogy az az x órajel ciklus, ami a megszakítási kérelem és a végrehajtás elkezdése között eltelik, az mindig ugyanannyi, bármit is tesz éppen, vagy ez változó?
(#) wbt válasza mateatek hozzászólására (») Júl 25, 2017 / 1
 
Magszinten a megkezdett utasítás be fog fejeződni, majd elpusholja a címet és elugrik a megszakításrutinra. 1 utasítás-ciklusban egyszer vizsgálja, hogy jött-e INT kérés, ennyi glitch-et okoz. SW szinten, ha épp fut valami megszakítás, akkor addig nem fogad el másikat (kivéve, ha Te külön nem engedélyezed) míg az vissza nem tér (ha 3 óra, akkor addig csak "gyűjtögeti" a bejövő INT kéréseket, bebillennek a jelzőbitek), majd ha visszatér, akkor egy sorrend alapján kiszolgálja a bejött kéréseket. Sajnos nincs prioritásos megszakításkezelés a kicsi AVR-eknél. Tehát ha alapból fut mondjuk egy 1kHz-es időzítő megszakításod és Te egy másik időzítővel generálsz még egyet, akkor olyan glitch-ed is lehet, aminek változása a folyamatosan futó (pl.1kHz-es) rutin végrehajtási ideje (pont beleköszönne a pont most indult másik INTbe, de nem tud ugyebár).
(#) Kovidivi válasza RoliNyh hozzászólására (») Júl 25, 2017 /
 
Multival érdemes lenne megmérni, sikerült-e. Annyit megsúgok, hogy mikor lefut a bootloader, kb. 3mp-ig nem lesz alvó üzemmódban, ha az akksi teljesen üres, és esetleg a brown out detector be van kapcsolva (fuse bit), akkor könnyen előidézhető egy olyan állapot, amikor az AVR folyamatosan indulgat, lemeríti az akksit, amitől resetel, kis idő múlva pedig emelkedik az akksi feszültsége, és minden indul elölről. Kis kapacitású akksit gyorsan mélykisülésbe visz.
(#) mateatek válasza wbt hozzászólására (») Júl 25, 2017 /
 
Tehát, ha én megszakításban például egy négyszögjelet generálok a timer segítségével, akkor a generált jel fáziszajos lesz a timer fáziszajtalan jeléhez képest. Minél magasabb a frekvencia, annál inkább összemérhető lesz a hiba a timer periódus idejével. Ha jól gondolom.
Köszönöm.
(#) wbt válasza mateatek hozzászólására (») Júl 25, 2017 / 1
 
Igen. Ezért érdemes, ha megengedi az alkalmazás a timer HW négyszöggenerátor üzemmódját használni, egyéb esetben külső HW szükséges (lehet, pl. DDS). Ha pl. soroson jönnek be adatok, akkor a soros rutint kell úgy megvésni, hogy belül engedélyezed az INT-et (amit elvesz) vagy nem használsz soros megszakítást, hanem főprogramból figyeled (és megpróbálod elkapni) amikor bejött egy karakter. Sajnos az általad említett esetben is a fáziszaj véletlenszerű lesz, lehet, napokig nem köszönnek össze a timer-int-ek Vagy minden egyéb dolgot letiltasz, ami INT-ből menne és főprogramból figyeled az eseményeket (a timer overflow bit attól még bebillen, csak nem ad INT-et)...konkrét feladat szabja meg.
(#) mateatek válasza wbt hozzászólására (») Júl 25, 2017 /
 
Köszönöm a válaszodat. Megtudtam, amire kíváncsi voltam.
(#) RoliNyh válasza Kovidivi hozzászólására (») Júl 25, 2017 /
 
Mivel még nincs hardwerbe, így nem tudok mérni semmit. Csatlakoztatva feltöltött állapotba lesz.
És igazából a mélykisüléstől se nagyon tartok, ugyanis kb 10-15Ah (nem elírás) cellán lesz rajta,
azon biztos elmegy egy két hétig is akár, még akkor is, ha nincs alvás...
(#) sirbedevir válasza wbt hozzászólására (») Júl 26, 2017 /
 
A belső megszakításnak ezt a fázishibáját van lehetőség bárhogy kiküszöbölni?
Mondjuk timer előállít egy kiskitöltésű négyszögjelet. Ennek a négyszögjelnek a lefutó élével szeretnék belső megszakítást indítani azzal a céllal, hogy ciklusonként pontosan ugyanabban az időpontban végezzek egy ADC mérést az egyik analóg lábon, az értékkel pedig számoljak és kiírassam lcd-re. 1 microsec csúszás is már durva hibát okozna a mérésben. Tehát pontosan ugyanakkor kellene mérni az analóg lábon.
Például esetleg 2 arduino-val? Az egyik szigorúan csak létrehozza a négyszögjelet és mér?
(#) sirbedevir hozzászólása Júl 26, 2017 /
 
Azaz nem timerrel hozza létre a négyszögjelet, hanem pl digitalwrite -al, és nem belső megszakítással időzítjük a mérést, hanem minden ciklusban pont ugyanazokat az utasítások közés ágyazzuk az analogread-ot, így órajelre ugyanakkor fog mérni?
(#) Kovidivi válasza sirbedevir hozzászólására (») Júl 26, 2017 /
 
Nem, mert a háttérben fut pl. millis() fv. interruptja, ami befolyásolja az időket. A szimplán hardveres ADC mérést én kipróbálnám, és oszcilloszkópon ellenőrizném. Nem lehet megmondani, hogy fix-e az interruptbe belépés óraszáma, én sem tudom. Esetleg specifikusan erre rákeresni kapnál választ a kérdésedre, vagy mint mondtam, lemérve.
(#) kapu48 válasza sirbedevir hozzászólására (») Júl 26, 2017 /
 
Ha nem ragaszkodsz kimondottan az AVR-hez?

Már van használhat Arduino IDE ARM alapú boardokhoz.
Sloeber, the Eclipse IDE for Arduino Developers

Source: Bővebben: Link

Az ARM-ban van lehetőség a megszakítások prioritássát állítani.
Tudsz periodikusan timer tigerjellel indítani ADC > DMA > Memoria (vagy periféria) átvitelt.
Teljesen HW alapú, közben a proci végezheti a dolgát.
A hozzászólás módosítva: Júl 26, 2017
(#) kapu48 válasza kapu48 hozzászólására (») Júl 26, 2017 /
 
Például ez a legkisebb olcsó, de aránylag nagy tudású eszköz:

Bővebben: Link
Ajánlom tanulmányozni a lehetőségeket
(#) sirbedevir válasza Kovidivi hozzászólására (») Júl 26, 2017 /
 
Csak nagyon alapszinten használom az arduino uno-t.... Ezért előnyben részesítenék egy faék bonyolultsághoz közelítőbb megoldást.
Ha pl digital write-al és delaymicrosecond-al létrehoznék egy négyszögjelet, az ad konvertert a leggyorsabbra állítva - ami kb 10 microsec késleltetést jelent - mérnék mondjuk 10-et egymás után, az értékekkel fix képlet alapján számolnék és kiírnám lcdre, majd új ciklusban kezdődik minden előröl a négyszögjellel.
Így sem esnének ugyanarra az órajelre ciklusonként a mérések a négyszögjel lefutó élétől?
(#) kapu48 válasza sirbedevir hozzászólására (») Júl 26, 2017 /
 
Nem! Mert közben microsecundumon ként jön 1 timer megszakítás.
Ami elnyújt minden SoftWeres számlálást.
Ezt csak HardWeresen tudod megoldani
(#) sirbedevir hozzászólása Júl 26, 2017 /
 
Vagy nem is számolnék az értékekkel, hanem pl 100 ciklusban csak adc- mérés, az értéket egy tömbbe feltölteném, aztán 100 ciklus után számolnék és lcd-re küldenék.
Tehát csak négyszögjelet gyártanék digitalwrite-delaymicrosecond kombinációval, analogread, az érték feltöltése egy tömb egy elemének, aztán újra négyszögjel 100×. Itt sem fog ugyanarra az órajelre esni az adc?
(#) sirbedevir hozzászólása Júl 26, 2017 /
 
Hát ez szomorú...
(#) gerleimarci hozzászólása Júl 26, 2017 /
 
Sziasztok

A képen látható(muszáj volt így, mert a fórum is használja a sorvég karaktereket) kódba hogyan tudok behelyettesíteni a 100 helyére egy int változót?

Kód.PNG
    
(#) kapu48 válasza sirbedevir hozzászólására (») Júl 26, 2017 /
 
NEM! Ez mégrosszab!

Értsd már meg!
A legpontosabb időzítést TIMER PWM megszakítással tudsz elérni.
Ha közben lekapcsolod az Arduino microsecond számláló megszakítást.
Mert az eltolja az ADC mérések indítását.

Különben meg 100 mérés átlagolásánál már miértelme az ekkor pontosságnak?
(#) Kovidivi válasza kapu48 hozzászólására (») Júl 26, 2017 /
 
Nem uS-ként jön megszakítás, nem is nagon tudna... A uS érték a mS-ból (ilyen sűrűn jön megszakítás), és a timer aktuális értékéből van számolva. A digitalWrite fv-t el kell felejteni ha valaki normális időzítést akar csinálni...
(#) kapu48 válasza gerleimarci hozzászólására (») Júl 26, 2017 /
 
Én igy probálnám: (van alul Kód gomb, használhatod!)
  1. client.write("batt %i\n", Int);
(#) sirbedevir hozzászólása Júl 26, 2017 /
 
Azért nem teljesen világos: ugyanaz az utasítássor fut végig általam generált megszakítás nélkül, akkor órajelről órajelre nem ugyanaz történik minden futtatáskor - még ha az utasítások megszakításokat is tartalmaznak - hiszen a megszakítások is ugyanazokra az eseményekre esnek?
(#) sirbedevir hozzászólása Júl 26, 2017 /
 
Nem az a kérdés számomra, hogy microsecundum mértékegység szerint tudjak időzíteni, hanem az, hogy ugyanazok az utasítások egymásutánisága ciklusonként, ugyanazokra az órajel távolságokra esnek-e.

Azért ez a pontosság utáni versenyfutás, mert egy 5vról kb 10 microsec alatt nullára csökkenő görbe egyik időpillanatában kell ADC mérést végrehajtani úgy, hogy az megismétlődve ugyanazt az értéket adja - azaz 5V / 1024 - kb 0.005V pontossággal.
(#) sirbedevir hozzászólása Júl 26, 2017 /
 
Ezt megoldani azért nem lenne rossz teljesítmény egy Nano-tól ))
(#) Kovidivi válasza sirbedevir hozzászólására (») Júl 26, 2017 /
 
Ha semmi megszakítás nem.fut, akkor az elméleted stimmel. De ez olyan fából vaskarika megoldás. Szerintem amit akarsz, az hardverből tudja, az interruptnak azonos belépési idejűnek kellene lennie, de mondom, le kell tesztelni, felesleges a további beszélgetés erről, korrekt választ csak te fogsz kapni ha tesztelsz. Esetleg az AVR-es témába ugorj át.
(#) kapu48 válasza sirbedevir hozzászólására (») Júl 26, 2017 /
 
Idézet:
„azaz 5V / 1024 - kb 0.005V pontossággal.”

Ezt a pontosságot nem tudja az AVR ADC-je teljesíteni!

Próbáljál mérni valami stabilnak vélt állandó feszültséget, 100 szór.
És értékeld az eredményt
(#) gerleimarci válasza kapu48 hozzászólására (») Júl 26, 2017 /
 
Így próbáltam:
  1. int Int;
  2. Int = random(0,101);
  3. client.write("batt %i\n", Int);

de nem jó. Lehet valamit félreértettem.
Ez lenne a fogadó progi(14.o), de fogadott adatnak ezt Írja:batt %i
(Nekem előnézetnél sort tör a fórum, azért nem úgy küldtem az előzőt.)
(#) mateatek válasza kapu48 hozzászólására (») Júl 26, 2017 /
 
Kissé nehezen érthetően írta le szerintem a problémáját Sirbedevir.
Szüksége van egy precíz négyszögjelre, amit a timerrel meg is lehet csinálni. Majd ez után a négyszög jel után nagyon pontosan időzítve jön az ADC mérése. Mivel, ha a timer indítja a belső megszakítást és a megszakításban mér az ADC, mindig csúszások vannak, mert ki tudja mennyi ideig tart kilépni a megszakításba.
Ezért most úgy oldja meg, hogy a timer indít egy megszakítást. A megszakításban generál egy négyszögjelet portállítgatással, és delaymicrosecond-dal. Majd ezután vár kicsit, megint csak delaymicrosecond-dal és ezután ADC mérés. Ez viszonylag pontos, de közben nem tud mást csinálni (viszonylag hosszú a négyszögjel) és talán nem is a legelegánsabb megoldás.
Próbálkozik(unk) más utat találni.
(#) kapu48 válasza gerleimarci hozzászólására (») Júl 26, 2017 /
 
akkor próbáld bele rakni a stringet 1 char tömbbe.:
  1. #include <stdio.h>
  2.  
  3. int Int;
  4. char str[20];
  5.  
  6.  
  7. void setup() {
  8.   // put your setup code here, to run once:
  9.  
  10. }
  11.  
  12. void loop() {
  13.   // put your main code here, to run repeatedly:
  14. Int = random(0,101);
  15. sprintf(str, "batt %i\n", Int);
  16. client.write(str);
  17.  
  18. }
Következő: »»   367 / 845
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