Fórum témák
» Több friss téma |
WinAVR / GCC alapszabályok: 1. Ha ISR-ben használsz globális változót, az legyen "volatile" 2. Soha ne érjen véget a main() függvény 3. UART/USART hibák 99,9% a rossz órajel miatt van 4. Kerüld el a -O0 optimalizációs beállítást minden áron 5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás 6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et Bővebben: AVR-libc FAQ
Köszönöm szépen kedves Hp41C!
Ez volt az egyetlen variáció, amit nem próbáltam..., holnap folytatom. Idebiggyesztem a "megfejtést", hátha mást is érdekel. A "CS"-vel nem találkoztam egy leírásban sem, az milye neki? Derűs estét; Tambi. A hozzászólás módosítva: Márc 13, 2024
Ismét elakadtam.
Kipróbálva az AD9833-at messze nem olyan négyszögjelet kaptam, amilyet szerettem volna. Kb 500 kHz-ig elfogadható, de 1MHz felett már nagyon kezd csúcsosodni. Megpróbáltam a legegyszerűbb ESP32-vel, de ezt eme programocskával nem tudum 173 kHz fölé vinni, bármit is írjak előosztónak vagy timerAlarm-nak, és még "ugrál" is (instabil) a jelfrekvencia. https://deepbluembedded.com/esp32-timers-timer-interrupt-tutorial-a...p-true
Mit rontok el? Köszönettel; Tambi. A hozzászólás módosítva: Márc 25, 2024
Sziasztok!
Remélem jó helyen teszem fel a kérdésem, ellenkező esetben kérném a moderátorokat a megfelelő topikba helyezéshez. Építek egy áramkört, ami ATSAM4S2BA-AU processzort tartalmaz. Ebbe a processzorba kellene betöltenem egy .bin fájlt. A hozzáértők segítségét kérném, hogy mi módon tudom beletuszkolni a fájlt a processzorba. Valószínű, hogy több ilyen eszköz programozására nem szükségem, ezért a méregdrága programozók használatát mellőzném, ha megoldható, amennyiben még sem, abban az esetben keresek vállalkozó fórumtársat, akik beprogramozza nekem. Segítségeteket előre is köszönöm!
Mit jelent pontosan az hogy
Idézet: ? Ha a jelforma nem szögletes, az analóg elektronikai jelenség lesz, mennél nagyobb a frekvencia annál nagyobb lesz az eltérés a pontos szögletes négyszögjeltől. Például egy tipikus jelenség a túllövés és utána néhány hullámnyi lecsengő rezgés a jelváltásoknál. "Overshoot and ringing" keresőszóra találsz ilyen rajzokat a neten, megvan a fizikai oka, hogy miért történik ez: a parazita indukciók és kapacitások miatt kialakul egy rezgőkör.„1MHz felett már nagyon kezd csúcsosodni” Idézet: : Az interruptba be és kilépés elviheti a csip összes idejét. STM32-t mértünk (más csip, de hasonló kategória) és pár mikroszekundum volt egy interrupt kiszolgálása, amiből hasonló érték jönne ki legnagyobb elérhető frekvenciára (egy jelalak T ideje alatt két ISR-t kell kiszolgálni egy ilyen programban). Tisztán ASM-ben programozva szerintem egy kicsit lehetne feljebb menni, de a jó megoldás a PWM használata ebben a tartományban. „a legegyszerűbb ESP32-vel, de ezt eme programocskával nem tudom 173 kHz fölé vinni” Idézet: „Remélem jó helyen teszem fel a kérdésem” Nem, ez nem AVR, hanem ARM mikrokontroller. Ez jó hozzá.
Köszönöm szépen!
Esetleg neked van ilyened vagy tudsz segíteni a felprogramozásában?
Pont ilyenem nincs. Azért ajánlottam ezt, mert ez a legolcsóbb.
![]()
Köszönöm szépen kedves ASCH, értem!
Az újabb kérdés: Ennél kevés egyszerűbb program van, így azt gondolja a magamfajta egyszerű halandó, hogy ez a leggyorsabb, de csupán 2,6MHz-es, kb. 25% kitöltésű jelelt ad Arduino Nano-n: 1:
Ez viszont 8MHz-val rezeg: 2:
Az utóbbi OCR1A = 7-el 1MHz-en (szinte) elfogadható jelet ad, de az 1. miért használ el 3-4szer annyi időt, mint a 2.? Köszönettel; Tambi. A hozzászólás módosítva: Márc 27, 2024
A képek alapján "tökélesen" működik...
Ahogyan ASCH kolléga írta: ez itt "analóg dolog"... Ha megnézed, mindhárom képen azt lehet látni, hogy a fel- és lefutó él 35ns körüli (±3ns). Ennyit tud az áramkör, ennyi az időállandója. Ha négyszögjelet szeretnél látni, akkor minimum 3x tau, de inkább 5x tau kellene minden félperiódushoz... Tehát a periódusidő legalább: 2 x 3..5 x 35ns = 210..350ns legyen. Vagyis maximum 3-4MHz esetén láthatsz "szinte elfogadható" jelet. Az első képen, ha nem 25%, hanem 50% lenne a kitöltési tényező, akkor az is elfogadható négyszögjel lenne. (2.6MHz -> 378ns -> teljesül az 5x tau feltétel...) Miért lesz 25%-os a kitöltési tényező? Az 1. programrészletet elemezve: - a 6. sorban beállítod a kimenetet magasba - a 7. sorban beállítod a kimenetet alacsonyba - ezután záródik a hurok és visszatér az elejére - a magas és alacsonyba állítás között nagyjából 50ns telik el (gondolom a proci 20MHz-en működik...) - bizonyára a másik irányú váltás is ugyanennyi időt vesz igénybe - mindebből következik, hogy maga a hurok 378ns - 2 x 50ns = 278ns ideig tart Mit lehet tenni? Ha a portot nem magasba - alacsonyba állítod, hanem negálod minden egyes ciklusban, akkor bár alacsonyabb lesz a frekvencia, de szinte tökéletesen 50%-os lesz a kitöltési tényező - ha ez elsődleges szempont. Mi a rossz hír (ezeken túl)? Nyilván, ha mindezt egy program részeként szeretnéd használni, akkor a hurokból valahogyan ki is kell tudnia lépni... az pedig további utasítás (feltételvizsgálat), vagyis a hurok idejének további növekedését okozza. Idézet: „de az 1. miért használ el 3-4szer annyi időt, mint a 2.?” Az 1. programod esetén a fentebb leírt lépések miatt lesz a periódusidő annyi, amennyit látsz (378ns). A 2. programod esetében a kapcsolgatást hardverből intézi. Ekkor a periódusidő az processzor alap-órajelétől és az előosztó beállításától függ. Ráadásul mindeközben bármilyen program futhat, az nem befolyásolja a kimenetet. Ha megszakításokat is használsz közben, akkor az 1. esetében egy beérkező megszakítás teljesen felboríthatja az időzítést, míg a 2. esetben abszolút semmi hatás nem lesz. Remélem tudtam segíteni!
Próbáld meg 1:10-es állásban. A szkóp probe-ok 1:1-ben lényegesen kisebb sávszélességet tudnak.
Annyit még hozzátennék, hogy a
nem ugyanaz, mint a
Az Arduino keretrendszer több mindent is csinál a loop két meghívása között. Ahol pontos időzítésre van szükség, ott érdemes elfelejteni az Arduinot.
Köszönöm szépen kedves Barátaim, így már értem!
A probe 1:10 is segített "szépíteni" a jelet. 1,1MHz:
Hogyan lehetne ezt megcsinálni: PB1 ^= PB1; Köszi! A hozzászólás módosítva: Márc 27, 2024
RIGOL szerint FEL-LE 7nsec; ez lehet?
A hozzászólás módosítva: Márc 27, 2024
Idézet: „Hogyan lehetne ezt megcsinálni: PB1 ^= PB1;” Mint mondtam, az sajnos több utasítás... ![]() Én a következőképpen csinálnám: in reg, PORTB xor reg, B00000010 out PORTB, reg Ez így 3 órajelciklus + a hurok ideje... De legalább biztosan 50%-os kitöltési tényezőjű lesz. HA nem használsz megszakítást és a processzor csak ezt csinálja... Konkrétan Arduino-t nem használtam, csak régebbi ATTiny-t és ATMega-t... Érdemes lehet átböngészni az Arduino utasítás-készletét, hátha kellemes meglepetés ér és van megfelelő utasítás... A kép alapján lehet 7ns... A mérőfejen, ha van lehetőség, akkor érdemes a kompenzálást beállítani, hogy ne legyen túllövése
A leggyorsabb toggle az a PINA regiszter írása. (A legrégebbi AVR-ek nem mind tudták, de egy ideje mindegyik tudja, hogy az input regiszterbe ha 1-et írunk az toggle-nek számít! Nézzetek utána az adatlapban ha nem hiszitek!)
Ha periódikusan kell és semmi más dolgunk nincsen, akkor ez a leggyorsabb szoftveres PWM, aminek ráadásul pontosan 50% lesz a kitöltési tényezője - kvázi ASMben - két utasítás összesen. A PINA regiszter a legtöbb csipen elérhető az SBI utasítás számára, így tényleg nagyon gyors a toggle funkció elérése, még regiszterbe se kell betölteni az értéket.
Ha C-ben a kódba ezt írjuk, akkor 99% hogy megtalálja fordító a fenti megfejtést:
Idézet: „de egy ideje mindegyik tudja, hogy az input regiszterbe ha 1-et írunk az toggle-nek számít!” Ez most nagyon hasznos infó volt a számomra!!! Egészen pontosan így utólag megmagyaráz egy rejtélyes hibát, amit nem sikerült megtalálnom, amikor egy régebbi prociról áttértem egy újabb, elvileg kompatibilis procira, és valami nem jól működött a portkezelésnél. Tanulság: El kell olvasni az adatlapot!!!
Sziasztok!
C nyelven írt programba hol lehet átírni, hogy ne közös anódos 7-szegmenses kijelzőt használjon, ha nem közös katódosat? Úgy tudom a közös anódosnál a vezérlőjel magas, a katódosnál alacsony. AVR studio-ba a "h", vagy a "c" fájlban keressem a megoldást? Ahol a portok vannak definiálva, vagy a programon belül kell átírni?
Végig kell nézned a programot és az érintett részeket átírni. Nem kis móka !
Sziasztok!
AVR-ből (M328) programból kiolvasható valahogy, hogy le van-e zárva a programmemória?
Kedves Fórumtársak!
Potenciométer helyett forgó jeladót (encoder-t) szeretnék használni. Az lenne a szerencsés, ha a két "végállása" 1 és 100 lenne. Pl.:
Ez bizony meglehetősen "elegánstalan" időrabló megoldás... Hogyan lehetne ezt rövidebben egy-kétsorban megoldani? Köszönettel; Tambi A hozzászólás módosítva: Aug 3, 2024
A te megoldásod leegyszerűsítve:
Ha van min és max maco (arduino környezetben pl.) vagy MIN és MAX macro akkor így:
Egy sorban, de kevésbé olvashatóan:
esetleg kérdőjel operatátorral:
Ezt is lehetne egy sorban, de azt inkább ne, mert az tényleg nem olvasható.
Köszönöm kedves Majki!
Az IDE kódellenőrző min a négy megoldásodat elfogadta; és sokkal szebbek, mint az eredeti... Hardveresen holnap tudom kipróbálni, de ha nem jelzett hibát, akkor biztosan működni fog. Köszönettel derűs napot kíván; Tambi
Kipróbáltam két drótdarabbal; nagyszerűen működik!
Köszönöm
A fenti kódodhoz még annyit, hogy ahol növeled a pulse-t, ott utána elég a pulse = max(pulse, 100);, ahol csökkented ott pedig a pulse = min(pulse, 1);
Kedves Fórumtársak!
Magasabb szintre léptem (pedig az alacsonyabbat sem tudom); ESP32-vel kísérletezgetek. Minden olyan timer-t tartalmazó kód, ami 1-2 éve már működött, most nem. Pl.:
A HIBAÜZENET HOSSZABB, MINT A KÓD: C:\OneDrive\OneDrive - Csarnok.hu Kft\EN\AVR_2024\ESP32\TIMER_LED_ESP32\TIMER_LED_ESP32.ino: In function 'void setup()': C:\OneDrive\OneDrive - Csarnok.hu Kft\EN\AVR_2024\ESP32\TIMER_LED_ESP32\TIMER_LED_ESP32.ino:9:22: error: too many arguments to function 'hw_timer_t* timerBegin(uint32_t)' 9 | My_timer = timerBegin(0, 8, true); //TIMER"0" kiválasztva, f= 80MHz / 2 Előosztó = 40MHz, true: felfelé számol | ~~~~~~~~~~^~~~~~~~~~~~ In file included from C:\Users\APA-PC-Otthon\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.4\cores\esp32/esp32-hal.h:84, from C:\Users\APA-PC-Otthon\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.4\cores\esp32/Arduino.h:36, from C:\Users\APA-PC-Otthon\AppData\Local\Temp\arduino\sketches\C81FFCFE91EB0C7DFDC9DB9E295B2C40\sketch\TIMER_LED_ESP32.ino.cpp:1: C:\Users\APA-PC-Otthon\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.4\cores\esp32/esp32-hal-timer.h:35:13: note: declared here 35 | hw_timer_t *timerBegin(uint32_t frequency); | ^~~~~~~~~~ C:\OneDrive\OneDrive - Csarnok.hu Kft\EN\AVR_2024\ESP32\TIMER_LED_ESP32\TIMER_LED_ESP32.ino:10:21: error: too many arguments to function 'void timerAttachInterrupt(hw_timer_t*, void (*)())' 10 | timerAttachInterrupt(My_timer, &onTimer, true); //a My_timer az onTimer megszakítást váltja ki | ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Users\APA-PC-Otthon\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.4\cores\esp32/esp32-hal-timer.h:50:6: note: declared here 50 | void timerAttachInterrupt(hw_timer_t *timer, void (*userFunc)(void)); | ^~~~~~~~~~~~~~~~~~~~ C:\OneDrive\OneDrive - Csarnok.hu Kft\EN\AVR_2024\ESP32\TIMER_LED_ESP32\TIMER_LED_ESP32.ino:11:1: error: 'timerAlarmWrite' was not declared in this scope; did you mean 'timerWrite'? 11 | timerAlarmWrite(My_timer, 1000000, true); // 2.000.000 impulzusig számol: f LED = 40MHz/(2ÉL * 2.000.000) = 10Hz-el | ^~~~~~~~~~~~~~~ | timerWrite C:\OneDrive\OneDrive - Csarnok.hu Kft\EN\AVR_2024\ESP32\TIMER_LED_ESP32\TIMER_LED_ESP32.ino:12:1: error: 'timerAlarmEnable' was not declared in this scope; did you mean 'timerAlarm'? 12 | timerAlarmEnable(My_timer); //engedélyezzük a My_timer megszakítást | ^~~~~~~~~~~~~~~~ | timerAlarm exit status 1 Compilation error: too many arguments to function 'hw_timer_t* timerBegin(uint32_t)' Mi lehet a baja? Köszönettel; Tambi.
A
timerBegin(0, 8, true) három paramétert tartalmaz, de a funkció csak egyet kíván: hw_timer_t* timerBegin(uint32_t)
Köszönöm, kedves Bakman!
Természetesen tökéletesen elfogadom a válaszodat. Azért háborgatok a fórumon hozzád hasonló segítőkész embereket, mert mindenki (még a GPT is!) azt válaszolja, amit te, de a kódjában mégis három paraméter szerepel... imígyen, ahogy az "enyém"-ban: My_timer = timerBegin(0, 8, true); a "0" a timer sorszáma, a "8" az előosztó, a "true" jelentené azt, hogy előre számlál, persze lehet, hogy rosszul gondolom... A My_timer = timerBegin(0, 8, true); helyére beírva az általad javasolt hw_timer_t* timerBegin(uint32_t) sort természetesen elfogadja, de most a következő; timerAttachInterrupt(My_timer, &onTimer, true); sort kifogásolja a sok adat miatt. Feldugtam az eszközt, lefuttattam az egy és kétmagos tesztet (//http://faragocsaba.hu/esp32), az eredmények jók, akkor gondolom, az eszközválasztás is jó. Nem vagyok biztos benne, de mintha páréve működött volna ez a szoftver. Azóta nagy pusztítás volt a gépemen. Ha a sebességteszt jó, akkor telepítve vannak a szükséges fájlok, vagy ez nem bizonyos? Ha nulláról kezdeném miket kellene az IDE-n kívül feltenni? Köszönettel; Tambi.
Nem foglalkozom ESP32-vel, konkrétabban nem tudok segíteni.
Azt írod, pár éve működött. Minden bizonnyal az újból telepített könyvtárak nem egyeznek a régiekkel. Vagy frissítették őket vagy másik, de azonos nevű könyvtárt töltöttél le. Itt: Bővebben: Link. A példaprogramban:
Neked elvileg csak ennyi kellene:
Hirtelen nem tudom megmondani melyik Timer-t indítja a parancs, a gyári könyvtárakkal soha nem bajlódtam, maximum példaként tekintettem rájuk.
Köszönöm kedves Bakman!
Feladom mára. Holnap megpróbálom a munkahelyi laptopomról, amin még kb hároméves állapotában van az IDE. Nagyon kíváncsi vagyok... Jó éjt! |
Bejelentkezés
Hirdetés |