Fórum témák
» Több friss téma |
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
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.
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
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.
Helló!
Bocs, lemaradtam. A micros() nem jó neked? Az 4 mikrosecundumos felbontással megy.
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.
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.
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.
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).
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?
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.
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
Ha tovább szeretnéd pontosítani akkor:
PID librari!
A t1 valtozó ele tedd hogy volatile unsigned long t1
Köszi!
Ez maradt le ![]()
Ü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.
![]()
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!
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.
Nano-nál van old és "sima" bootloader. Próbáld ki mindkettővel, hátha.
Köszönöm! Az Old Bootloader választása után azonnal betöltötte.
Tökéletesen működik!
Szia!
Megmutatod a kódod?
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); }
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
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 ![]()
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
Ü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:
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!
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}
Ez nem teljesen igaz, lásd ezt a cikket: Bővebben: Link.
A hozzászólás módosítva: Jún 29, 2020
Mondjuk inkabb ugy, hogy nem ajanlott, vagy csakis sajat felelossegre.
Erdemes igen magabiztosnak lenni a korrekt idozitesben mert kulonben gyorsan elfogy a stack ![]()
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
![]()
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. |
Bejelentkezés
Hirdetés |