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
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   766 / 766
(#) csatti2 válasza david10 hozzászólására (») Feb 8, 2017 /
 
Az egy ATMEGA16U2-MU QFN tokban. A 6 lábú alkatrész pedig egy USBLC6-2SC6. A feladata ESD és rövid idejű túlfeszvédelem. A nyák egyoldalas.
(#) david10 válasza david10 hozzászólására (») Feb 9, 2017 /
 
Nekifogtam a nyáktervezésnek, Atmega8-ra tervezem. A kvarc két lába közé van ahol tesznek egy 1 megás ellenállást. (Pl. az Arduino Uno-ban). Tegyek-e? Ha teszek, akkor az mire fog szolgálni?
(#) killbill válasza david10 hozzászólására (») Feb 9, 2017 /
 
Az Atmega8 adatlapja szerint kell oda ellenallas?
(#) david10 válasza killbill hozzászólására (») Feb 9, 2017 /
 
Se az ATmega8, se az ATmega328 adatlapja szerint nem kell, de az Arduino Uno-ba mégis tettek.
(#) killbill válasza david10 hozzászólására (») Feb 9, 2017 /
 
En sosem tettem egyik Atmega melle sem. Soha nem volt veluk orajel problema. Az az ellenallas arra kell, hogy elinduljon az oszcillacio, de az Atmegak eseten erre nincs szukseg. De pl. a Motorola 68HC11 mikrokontroller melle kellett egy 10MOhm.
(#) david10 válasza killbill hozzászólására (») Feb 9, 2017 /
 
Köszönöm szépen a válaszodat!
A válaszodat megfogadva nem teszek bele. A 68HC705-nél is kell tenni?
(#) david10 válasza david10 hozzászólására (») Feb 12, 2017 /
 
Végül csak belefért a dobozba...
(#) zombee válasza david10 hozzászólására (») Feb 14, 2017 /
 
Ha kicsit szélesebbre tervezed, akkor lesz rendes felfogatása és a plusz területre is húzhatsz át alkatrészeket, optimalizálhatod a vezetékutakat, stb. Ebben a formában a rögzítés félő hogy nem elég stabil.
(#) zombee válasza Logeen hozzászólására (») Feb 14, 2017 /
 
ADC, majd Diszkrét Fourier Transzformáció. Az ADC-re valaki írta hogy szabadonfutó módban kell;
Persze, lehet, de a transzformáció futtatása előtt az adatokat egyenletes időközönként kell bevinni a tömbökbe, így a megszakítás használatát nem lehet kikerülni.
Illetve ki lehet, de a szabálytalan időközök zajt visznek a rendszerbe és lerontják az eredményt.

DFT: ez sem a legegyszerűbb ujjgyakorlatok közé tartozik, de a lényeget hamar meg lehet érteni. Először is, a mintavételi frekvencia legalább 2-szerese kell hogy legyen a legmagasabb, vizsgálandó frekinek. És a teljes mintavételi időbe bele kell férnie legalább 2 periódusnak a legkisebb frekvenciájú komponensből. Aztán kell sin és cos függvény, amire inkább előre tárolt értékeket használnék, különben a számolás 100-szor tovább tartana mint a mintavételezés ami elég gáz egy spektrum analizátornál. A lebegőpontos számolást is elfelejteném, nem AVR-nek való...
A hozzászólás módosítva: Feb 14, 2017
(#) zombee válasza zombee hozzászólására (») Feb 14, 2017 /
 
Példa: 50Hz-5kHz között akarsz analizálni. Az 5kHz miatt legalább 10ksps kell, de legyen inkább 12. Azt talán mondanom se kell hogy a számolás egyszerűsítése és a zajok miatt a 10 bites mód felejtős, 8 bites kell (ADLAR=1). Az 50Hz két periódusa 40ms, ami 12ksps mellett 240 mintát jelent. Ez bele is fér a memóriába.

Ezután jön a DFT: 30-szor lefuttatod a megadott frekikkel. Az "X[k]=" kezdetű képlettől nem kell megijedni, nem kell komplex együtthatót meg exponenciálist bevinni. Az tulajdonképpen egy szinusz-koszinusz páros, amiket külön változóban kell összegezni (valós és imaginárius rész),
majd a legvégén pitagoraszi abszolútértéket venni és kész. Mindezt 30-szor.

Egy PureBasic kód hogy érthető legyen (természetesen neked nem kell a teljes spektrum):
  1. For k=0 To 1023
  2.     XR.f = 0
  3.     XI.f = 0
  4.     For n=0 To 1023
  5.       XR + signal(n)*Cos(2*PI*n*k/1024)
  6.       XI - signal(n)*Sin(2*PI*n*k/1024)
  7.     Next
  8.     spektrum(k) = Sqr(XR*XR+XI*XI)/1024
  9. Next
A hozzászólás módosítva: Feb 14, 2017
(#) rascal válasza zombee hozzászólására (») Feb 14, 2017 /
 
A két teljes periódus a legalsó frekvenciájú komponensből miért kell? Kb. 15 éve érdekelt a téma, de ez a kitétel nem rémlik. Lehet, hogy DCT-vel (diszkrét koszinusz transzformáció) jobban járna, mert akkor nem kell a végén a szinusz és koszinusz összetevőket még összegezni, látványnak meg az is jó. Még valami ablak függvény is jól jöhet (ide elég lehet a háromszög), hogy az ablakozásból eredő hamis komponenseket elnyomja.
(#) zombee válasza rascal hozzászólására (») Feb 14, 2017 /
 
Igen, egy teljes periódus is elég. 1-et akartam, csak valamiért a 2 maradt benne.
A DCT-ből csak rémlik valami, a DFT-re jobban emlékszem. Szerintem a szinuszos és koszinuszos
rész összegzése a legkevesebb. Igazából még a gyökvonás is elhagyható, csak az algoritmus
korrekt bemutatása miatt hagytam benne. A sin és cos értékeit ki lehet előre számolni
akár excel táblával is, és a buffer mérethez optimalizálni, így mindkét szögfüggvény
egyazon tömb indexelésével helyettesíthető.
(#) rascal válasza zombee hozzászólására (») Feb 14, 2017 /
 
Képtömörítésnél jpeg, mpeg használják. Valószínű, hogy művelet mennyiséget is spóroltak (főleg a hőskorban számított), de az biztos kényelmesebbé tette, hogy csak egynemű adatokkal kellett foglalkozni.
(#) zombee válasza rascal hozzászólására (») Feb 14, 2017 /
 
Köszönöm, lehet hogy egyszer én is alkalmazom. Legutóbb DTMF dekódert programoztam le
hasonló (DFT) elven, félidőben jöttem rá hogy erre van hardveres megoldás (MT8870).
Nem a programozás miatt, hanem a kicsatolás kicsit problémásabb ha az IC-t (mega8)
nem arra tervezték. Így megmaradt helyi érdekességnek, és tanulásnak se volt utolsó.
A hozzászólás módosítva: Feb 14, 2017
(#) kiborg hozzászólása 14:01 /
 
Sziasztok!

Használom Timer 2-t (ATMega16) és 16MHz-ről járatva 8-as előosztóval, Output Comapare regiszter=200, 100us-on ként kellene megszakítást generálnia.
Elméletileg ugyanezt érem el, a fclk=16MHz, Presc=64 és OCR2=25-el.
A megszakításba egy léptetés van belerakva, semmi időigényes dolog.Lásd kódmellléklet.

Megszakítás:
  1. TIM2_COMP:
  2.         nop
  3.         cpi grid,32
  4.         brne T0_1
  5.         sbi VFD_port,Grid_in
  6.         rjmp T0_2
  7.  
  8.         T0_1:
  9.         cbi VFD_port,Grid_in
  10.        
  11.         T0_2:
  12.         cbi VFD_port,GClr
  13.         call Grid_Imp
  14.         inc grid
  15.         sbi VFD_port,GClr
  16.  
  17.         cpi grid,49
  18.         brne T0_end
  19.                 ldi grid,1
  20.  
  21.         T0_end:
  22. reti


Grid_Imp:
  1. Grid_Imp:
  2.                 sbi VFD_port,Grid_clk
  3.                 nop
  4.                 cbi VFD_port,Grid_clk
  5.                 nop
  6.         ret


Mégis az egyiknél villog a kijelző(nem elég gyors a frissítés), a másiknál meg folyamatos, nem látszódik villogás.
Tehát akkor mégse egyezik meg. Kipróbáltam Timer0-nál is ott is ugyanez a szituáció.
ATMega16A, 5Vról járatva. Miért van ez?
A hozzászólás módosítva: 14:02
Következő: »»   766 / 766
Bejelentkezés

Belépés

Hirdetés
Frissek
2017. Feb, 21. Kedd
15:13:42
Jelenleg 523 fő olvassa az oldalt
Online tagok:
Lapoda.hu     XDT.hu     HEStore.hu