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   636 / 848
(#) david10 válasza david10 hozzászólására (») Jún 19, 2020 /
 
Köszönöm a válaszokati, sikerült megoldani az ISR-rel.
Itt generáltam egy ISR kódot ami 50Hz-el frissíti a kijelzőt: http://www.8bit-era.cz/arduino-timer-interrupts-calculator.html
Majd a void loopba betettem a lekérdezést.
További szép estét mindenkinek.
(#) Kovidivi válasza david10 hozzászólására (») Jún 19, 2020 / 1
 
A következő problémád az lesz, amikor hibás hőmérséklet értéket kapsz, mert az interrupt miatt nem fut le időben a másik. Habár a ds18b20 időkritikus részeinél le van tiltva az interrupt, de ettől függetlenül okozhat gondot. Futtasd a programod hosszú időn át, és tegyél be egy feltételt a main-be, amikor a szenzorod nem valós értéket ad vissza, jelezze (szobahőmérséklet +-10C). Innen látni fogod, hogy a hiba jelentkezik-e egyáltalán.
Ha a kijelzőn több adat is megjelenik, akkor időzítheted a ds18b20 kommunikációt erre az időszakra.
A hozzászólás módosítva: Jún 19, 2020
(#) Lacaboy válasza szalamandra hozzászólására (») Jún 20, 2020 /
 
Köszönöm de ez nem megfelelő nekem, mert nagyon lassú.
1-100ms között szeretnék mérni.
Van erre valami megoldás vagy kűlső időzítő kell?
Egész nap bújom a netet, próbálkozom,de nem jutok előre.
(#) KoblogPerGyok válasza Lacaboy hozzászólására (») Jún 20, 2020 /
 
Helló!

Bocs, lemaradtam. A micros() nem jó neked? Az 4 mikrosecundumos felbontással megy.
(#) dokidoki válasza Lacaboy hozzászólására (») Jún 21, 2020 /
 
Csak sejteni lehet ... A tervedhez alapötletet adhat a ultrahang szenzorhoz használt mérési módszer. Ott is van egy meghatározott trigger pont, és hozzá a mérés, pulsein() arduino függvény egyszerűen visszaadja már 10us-től eltelt időt us felbontásban.
(#) mateatek válasza Lacaboy hozzászólására (») Jún 21, 2020 /
 
A timer1-et be kell állítani a kívánt periódus idejű frekvenciára és tenni rá egy megszakítást. Majd ugyanúgy számolni vele, mint ahogyan a millis() is teszi. Csak itt a 16 bites timerrel pontosabban és kisebb felbontásban lehet. A timer0-át meg le kell lőni.
(#) asch válasza Lacaboy hozzászólására (») Jún 22, 2020 / 1
 
Input capture-t programozva akár egyetlen órajelnyi mérési és leolvasási pontosságod is lehet Arduino UNO hardveren. Ez 1/16us.

Milyen pontosságú időmérés kell neked?

Honnan jön a jel milyen formában? Ha "éles" logikai szintű jeled van, azt csak be kell kötni. Ha analóg, vagy vagy zavaros, vagy prellezik, akkor egy kicsit gondolkodni is kell.
(#) hajoskapitany hozzászólása Jún 22, 2020 /
 
Sziasztok!

Szeretnék egy fordulatszámmérőt készíteni. A jelet egy motor gyújtókábeléről venném le, de a teszteléshez egy másik arduinot és a blink példakódot használtam( 20 ms késleltetésekkel).
  1. unsigned long t1 = 0;
  2. unsigned long t2 = 0;
  3. unsigned long kulonbseg;
  4. unsigned long fordulat;
  5.  
  6. void setup() {
  7.   Serial.begin(2000000);    //a nagyobb fordulatszámok miatt használok gyors kommunikációt
  8.   pinMode (3, INPUT);
  9.   attachInterrupt(digitalPinToInterrupt(3), jel, RISING);
  10.  
  11.  
  12. }
  13.  
  14. void loop() {
  15.    if (t1 != t2)
  16.   {
  17.     kulonbseg = t1 - t2;
  18.     fordulat = 60000000 / kulonbseg;
  19.     Serial.println(fordulat);
  20.     t2 = t1;
  21.   }
  22.  
  23. }
  24.  
  25. void jel()
  26. {
  27.   t1 = micros();
  28. }


A soros monitoron ilyen értékeket kapok vissza:
1497
1497
1492
1497
1497
1497
1497
915
915
1497
1497
1497
915
1497
1497
1497
1497
1497
1497
1497
1497
1502
1497

Észrevettem, hogy mindig kapok hibás értéket és ezek 915 vagy annak a többszörösei, hányadosai (attól függ, hogy mekkora a fordulatszám).
Jelenleg egy UNO dolgozza fel az adatokat, de próbáltam már LEONARDO-val is. Azzal sajnos még több hibát kaptam(random számok vagy 0).
Ebben az esetben az 1500 közeli értékek rendben vannak, de miért kapok hibás értékeket is?
(#) kapu48 válasza hajoskapitany hozzászólására (») Jún 22, 2020 /
 
Az AVR-en csak egy megszakítás futhat egy időben.
Amíg megy a micros() vagy millis() addig lemaradhatsz a rising-ről.
Mérni kel többet mondjuk 32-őt, ezt könyvű eltolással osztani és átlagolni kel.
(#) Kovidivi válasza kapu48 hozzászólására (») Jún 22, 2020 /
 
Akkor az átlag mindig kisebb lesz, mint a valós érték....
Vagy a hiba okát kell megkeresni, vagy szűrni kell a jelet, vagy az egymás után érkező számokat kell megszűrni úgy, ami a valóságban lehetetlen. Pl. 1500 után a következő szám csak akkor valós, ha az eltérés a két szám között maximum 200 (hasra). Plusz kell egy másik feltétel, miszerint ha egymás után mondjuk 10db ilyen hibás érték jön, akkor innentől kezdve az a valós.
Plusz ötlet, ha esetleg a megszakítás miatt nem venné észre az Arduino a változást: kondival elnyújtani a jelet, lehet már pár pF is elég, esetleg néhány nF (attól függ, hogy van a jel a gyújtókábelről levéve).
A hozzászólás módosítva: Jún 22, 2020
(#) kapu48 válasza hajoskapitany hozzászólására (») Jún 22, 2020 /
 
Ha tovább szeretnéd pontosítani akkor:
PID librari!
(#) GPeti1977 válasza hajoskapitany hozzászólására (») Jún 22, 2020 / 1
 
A t1 valtozó ele tedd hogy volatile unsigned long t1
(#) hajoskapitany válasza GPeti1977 hozzászólására (») Jún 22, 2020 /
 
Köszi!
Ez maradt le. Így már minden príma.
(#) Jonni hozzászólása Jún 25, 2020 /
 
Üdv mindenkinek. Egy kis segítséget szeretnék kérni. Egy nanó és egy 16x2 karakteres LCD-n gyakorlatozok de nem sikerül úgy szöveget görgetni , hogy pl 2. sor 4. karaktertől kezdje és csak 3 karakternyi helyen fusson a szöveg (4,5,6 karaktereken). Ugyan van az arduino liquidcristal scroll mintaprogramja de az az egész sort görgeti, nem csak 3 karaktert.
(#) pisti hozzászólása Jún 25, 2020 /
 
Sziasztok!
Én is egy Nano-val küzdök. A megírt programot nem sikerül feltölteni. Uno-ra minden gond nélkül megy, de a Nano nem hajlandó bevenni. A port az alaplap beállítva, rátöltve a CH340 illesztő is. Elindul a feltöltés majd végigmegy a folyamatjelző és a végén megáll. Másodszori próbálkozásra írja ki, hogy
"Hiba történt a vázlat feltöltése közben"
Merre érdemes keresgélni a megoldást?
Köszönöm!
(#) GPeti1977 válasza pisti hozzászólására (») Jún 25, 2020 / 1
 
Lehet uno bootloader van benne
(#) KoblogPerGyok válasza pisti hozzászólására (») Jún 25, 2020 / 1
 
Szia!

Az Arduino IDE-ben nem jelenik meg az alappaneleknél, hogy Arduino nano old boot loader? Nálam nem, de nekem 1.05 van fent, de mintha az újabbaknál lenne. Esetleg azt válaszd ki.
(#) szalamandra válasza pisti hozzászólására (») Jún 25, 2020 / 1
 
Nano-nál van old és "sima" bootloader. Próbáld ki mindkettővel, hátha.

image.png
    
(#) pisti válasza szalamandra hozzászólására (») Jún 25, 2020 /
 
Köszönöm! Az Old Bootloader választása után azonnal betöltötte.
Tökéletesen működik!
(#) KoblogPerGyok válasza Jonni hozzászólására (») Jún 25, 2020 /
 
Szia!

Megmutatod a kódod?
(#) Jonni válasza KoblogPerGyok hozzászólására (») Jún 25, 2020 /
 
Ez lenne de elírtam a pozíciót. 2 ik sor 10-ik töl kéne kezdje pl azt, hogy hello world (10,11,12).
amúgy ez jelenleg csak 1 sima óra alul felül meg dátum RTC-vel.

#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
#include <LiquidCrystal.h>

char line1[17];
char line2[17];

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
lcd.begin(16, 2);
lcd.clear();
}

void loop() {
RTC.read(dateTime);
sprintf(line1, "%04d-%02d-%02d ", dateTime.Year + 1970, dateTime.Month, dateTime.Day);
sprintf(line2, "%02d:%02d:%02d ", dateTime.Hour, dateTime.Minute, dateTime.Second);
lcd.setCursor(0, 0);
lcd.print(line1);
lcd.setCursor(0, 1);
lcd.print(line2);
delay(1000);
}
(#) KoblogPerGyok válasza Jonni hozzászólására (») Jún 26, 2020 /
 
Szia!

Rengeteg a dolgom, nem tudom hol is áll a fejem. Ehhez a problémához kell egy ciklus, ami változtatja a karaktereket az adott pozícióban és a többivel, ha nem változik akkor nem foglalkozik. (ne villogjon). Nem akkora gond ez, ránézek, mikor nem leszek ennyire fáradt. De remélem valaki segít addig is. Bocs, de kivagyok nagyon.

A ciklusmagon belül a setcursor()-al kell a megfelelő pozícióra állni, kirakni az első karaktert, ami fut, majd a növelni a setcursor() pozícióját. A másik, hogy ami fut karakterlánc tömb indexét mindig változtatni kell. pl.: nem a teljes sort iratnám ki a második sorban, hanem csak az időt. Ami fut karakterlánc, azt meg utána. Namust egy változó értéke dönti el, hogy honnantól kezdődjön a futó karakterlánc. P
pl Fut ='Ez lesz majd amit futtatni kell, de csak az első három karaktert'
Fut= egy tömb!!!!

akkor lcd-re: idő, ÉS
i=1
do while i!= lenght(Fut)-3
fut_ki=fut(i+1)+fut(i+2)+fut(i+3)
kiírat.
loop

Ehhez hasonló lesz, de csak kutyafuttában tudok írni. Bocsánat!

Egy változó növelésével megoldható, hogy végigmennyen. Ha végigért, akkor újra kezdi
(#) Jonni válasza KoblogPerGyok hozzászólására (») Jún 26, 2020 /
 
Szia!
Köszi szépen. Sajnálom, hogy fáradt vagy pihend ki magad (annyira nem sürgős). Az a baj, hogy
Én nem tudok programozni (csak a megfelelő sorokat szokott sikerülni jó helyre rakni ) egy kicsit értem, hogy miről van szó de nem tudom egyedül megcsinálni.
(#) Rober_4 válasza KoblogPerGyok hozzászólására (») Jún 27, 2020 /
 
Nem nagyon olvastam vissza, hogy mit szeretnél, de feltettem vagy 10 oldallal ezelőtt egy algoritmust, ami nem ír közvetlenül az LCD-re, hanem egy tömbbe írja az aktuális megjelenítést, és csak a változásokat viszi át az LCD-re, azt is csak akkor, ha odaér időben...
Szerintem viszonylag érthető, ha tényleg az lcd független kezelése a célod, akkor talán tudod használni:
Bővebben: Link
Ha nem tekintsd tárgytalannak a hozzászólást!
A hozzászólás módosítva: Jún 27, 2020
(#) MateLo hozzászólása Jún 29, 2020 /
 
Üdv Mindenkinek!

Nem olyan régen kezdtem el megszakításokkal foglalkozni és ezért nem értek még annyira hozzá. Adott egy bejövő jel amit érzékelnem kell és a jeltől számítva egy bizonyos idő eltelte után kell kapcsolnom egy tranzisztort. Én a külső megszakítás és az időzített megszakítás kombinálásával gondoltam megoldani ezt a problémát. A bejövő jelem nagyon rövid idejű impulzus, a késleltetés ideje meg kb. 20 mikroszekundumtól nagyjából 3 milliszekundumig terjedne. Pontos késleltetést szeretnék, ezért gondoltam a megszakításokra.
Íme a kódom amivel eddig próbálkoztam:
  1. volatile long t0;
  2. volatile long t1;
  3. long keses;
  4. bool megszak1 = false;
  5. bool megszak2 = false;
  6.  
  7. void setup()
  8. {
  9.   cli();
  10.   TCCR1A = 0;
  11.   TCCR1B = 0;
  12.   TCCR1B |= (1 << WGM12) | (1 << CS10); //előosztót nem alkalmazok
  13.   OCR1A = 10000; //elvileg 625 us az időzítés
  14.   TIMSK1 = 0;
  15.   sei();
  16.  
  17.   pinMode(13, OUTPUT);
  18.   Serial.begin(500000);
  19.   pinMode(3, INPUT);
  20.   attachInterrupt(digitalPinToInterrupt(3), jel, RISING);
  21. }
  22.  
  23. void loop()
  24. {
  25.    if (megszak1 == true && megszak2 == true)
  26.   {
  27.   keses = t1 - t0;
  28.   Serial.println(keses);
  29.   megszak1 = false;
  30.   megszak2 = false;
  31.   }
  32. }
  33.  
  34. ISR(TIMER1_COMPA_vect)
  35. {
  36.   t1 = micros();
  37. digitalWrite(13, HIGH);
  38. delayMicroseconds(50);   /*Tudom, hogy nem illik késleltetni megszakításban, később majd a B összehasonlító regiszterrel akarom kikapcsolni de előbb így működjön */
  39. digitalWrite(13, LOW);  //Ha már működik valószínűleg portmanipulációval kapcsolom a relét
  40. megszak2 = true;
  41.   TIMSK1 = 0;
  42.  
  43.  
  44. }
  45.  
  46.  
  47. void jel()
  48. {
  49.   t0 = micros();
  50. megszak1 = true;
  51.   TIMSK1 |= (1 << OCIE1A);
  52. }

A külső megszakításban gondoltam "indítani" a timer1-et, hogy az idő lejárta után generáljon egy kimenő jelet, de ha letesztelem, a két megszakítás közt mindig csak 8 vagy 12 mikroszekundum tellik el a 625 helyett(javítsatok ki ha tévedek). Mintha nem időzítene az időzítő csak egyből megszakítana.
Lehetséges ilyen módon "indítani" a timer-t vagy más módszer kellene.
Ez sem sűrgős és bármilyen javaslatot elfogadok.
Előre is köszi!
(#) kapu48 válasza MateLo hozzászólására (») Jún 29, 2020 /
 
Az AVR-eken egyszerre csak egy megszakítás futhat!
Megszakításon belül nem lehet másik megszakítás!

Amíg bent vagy az ISR(TIMER1_COMPA_vect){itt nem működik a micros(), mert blokkolva van a többi megszakítás lekezelése}
(#) Kovidivi válasza kapu48 hozzászólására (») Jún 29, 2020 / 1
 
Ez nem teljesen igaz, lásd ezt a cikket: Bővebben: Link.
A hozzászólás módosítva: Jún 29, 2020
(#) cua válasza kapu48 hozzászólására (») Jún 29, 2020 / 1
 
Mondjuk inkabb ugy, hogy nem ajanlott, vagy csakis sajat felelossegre.
Erdemes igen magabiztosnak lenni a korrekt idozitesben mert kulonben gyorsan elfogy a stack
(#) wbt válasza cua hozzászólására (») Jún 29, 2020 / 1
 
Illetve feladatfüggő, mi a fontosabb. Egy nagysebességű soros porton jövő adatokból jelalakot szintetizálni Timer INT-el pl. a Timer INT-nél nem teszünk engedményt (mert glitch-es lesz), a soros INT-ben viszont nevetve engedélyezhetjük a Timer INT-et. Persze sokszor előjöhet az "erősebb kutya babrálja a hölgyet" dolog... és azonnal mentjük a regisztereket (tipikusan a Push All-t használja mindenki), ameddig bírja a stack. Szóval ésszel lehet ezt gyűrni, mondhatni SW-prioritást csinálni. Hááát ez az alap (!) RISC életmód
(#) kapu48 válasza Kovidivi hozzászólására (») Jún 30, 2020 /
 
Akkor most ezt a megoldást ajánlanád egy teljesen kezdőnek?

Mert nekem felesleges volt fáradnod vele! Mivel van jobb megoldás is ennél.
Következő: »»   636 / 848
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