Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
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
Lapozás: OK   837 / 837
(#) Tambi válasza Hp41C hozzászólására (») Márc 13, 2024 /
 
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
(#) lazsi válasza Tambi hozzászólására (») Márc 13, 2024 /
 
Chip Select?
(#) Tambi hozzászólása Márc 25, 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

  1. #define LED 21
  2.  
  3. hw_timer_t *Timer0_Cfg = NULL;
  4.  
  5. void IRAM_ATTR Timer0_ISR()
  6. {
  7.     digitalWrite(LED, !digitalRead(LED)); //a 21 lábon négyszögjelet generál
  8. }
  9. void setup()
  10. {
  11.     pinMode(LED, OUTPUT);
  12.     Timer0_Cfg = timerBegin(0, 2, true);                 //a 80MHz / 2 = 40MHz
  13.     timerAttachInterrupt(Timer0_Cfg, &Timer0_ISR, true);
  14.     timerAlarmWrite(Timer0_Cfg, 10, true);               // 40MHz / 10 = 4MHz helyett 173kHz a 21 lábon a négyszögjel
  15.     timerAlarmEnable(Timer0_Cfg);
  16. }
  17. void loop()
  18. {
  19.     // Do Nothing!
  20. }


Mit rontok el?

Köszönettel; Tambi.
A hozzászólás módosítva: Márc 25, 2024
(#) Travolta hozzászólása Márc 26, 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!
(#) asch válasza Tambi hozzászólására (») Márc 26, 2024 /
 
Mit jelent pontosan az hogy
Idézet:
„1MHz felett már nagyon kezd csúcsosodni”
? 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.
Idézet:
„a legegyszerűbb ESP32-vel, de ezt eme programocskával nem tudom 173 kHz fölé vinni”
: 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.
(#) vargham válasza Travolta hozzászólására (») Márc 26, 2024 /
 
Idézet:
„Remélem jó helyen teszem fel a kérdésem”

Nem, ez nem AVR, hanem ARM mikrokontroller.
Ez jó hozzá.
(#) Travolta válasza vargham hozzászólására (») Márc 26, 2024 /
 
Köszönöm szépen!
Esetleg neked van ilyened vagy tudsz segíteni a felprogramozásában?
(#) vargham válasza Travolta hozzászólására (») Márc 26, 2024 /
 
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!
(#) Tambi válasza asch hozzászólására (») Márc 27, 2024 /
 
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:

  1. void setup() {
  2.         DDRB = B00000010;
  3. }
  4. void loop()
  5. {
  6.         PORTB = B00000010;
  7.         PORTB = B00000000;
  8. }


Ez viszont 8MHz-val rezeg:
2:

  1. void setup() {
  2.   DDRB = B00000010;
  3.   TCCR1A = B01000011;
  4.   TCCR1B = B00011001;
  5. OCR1A = 0;
  6. }
  7. void loop() {
  8. }


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
(#) lazsi válasza Tambi hozzászólására (») 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!
(#) majkimester válasza Tambi hozzászólására (») Márc 27, 2024 /
 
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.
(#) vargham válasza lazsi hozzászólására (») Márc 27, 2024 /
 
Annyit még hozzátennék, hogy a
  1. void loop()
  2. {
  3.         PORTB = B00000010;
  4.         PORTB = B00000000;
  5. }

nem ugyanaz, mint a
  1. void loop()
  2. {
  3.         while (true) {
  4.                 PORTB = B00000010;
  5.                 PORTB = B00000000;
  6.         }
  7. }

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.
(#) Tambi válasza lazsi hozzászólására (») Márc 27, 2024 /
 
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:

  1. void setup() {
  2.         DDRB = B00000010;
  3. }
  4.  
  5. void loop()
  6. {
  7.         PORTB ^= B00000010;
  8. }


Hogyan lehetne ezt megcsinálni:

PB1 ^= PB1;

Köszi!
A hozzászólás módosítva: Márc 27, 2024
(#) Tambi válasza Tambi hozzászólására (») Márc 27, 2024 /
 
RIGOL szerint FEL-LE 7nsec; ez lehet?
A hozzászólás módosítva: Márc 27, 2024
(#) lazsi válasza Tambi hozzászólására (») 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
(#) asch válasza lazsi hozzászólására (») Márc 28, 2024 / 2
 
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.

  1. ujra:
  2.  sbi PINA, 4 // a 4-es indexű pin-t togglezzük
  3.  RJMP ujra


Ha C-ben a kódba ezt írjuk, akkor 99% hogy megtalálja fordító a fenti megfejtést:
  1. ujra:
  2. PINA|=0b00010000; // sbi-re fordul mert a C fordító felismeri a lehetőséget
  3. goto ujra;
(#) lazsi válasza asch hozzászólására (») Márc 28, 2024 /
 
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!!!
Következő: »»   837 / 837
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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