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. De van más. Látom, a szomszéd kerületben laksz. Keress privát üzenetben!
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);
|
Bejelentkezés
Hirdetés |