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   763 / 837
(#) david10 válasza Pethical hozzászólására (») Feb 7, 2017 /
 
Köszönöm a válaszokat!
Ha jól értem, két lehetőségem van:
1. Nekem az UART nem kell használat közben, ezért azt kihoznám egy 5 pin-es dugaszra (+5V, GND, Reset, Rx, Tx, és a normális Arduino bootloadert felírnám és az Arduinoval tudnám programozni, a V-USB-vel meg használnám.
2. Az AVRUSBBoot bootloadert írnám fel és akkor direkt USB-n tudnám programozni.

Találtam itthon ATmega8L-t, de sajnos ez csak max. 8Mhz-es órajellel képes dolgozni. Muszáj 12Mhz-es órajelt adni neki? Nem volna elég 6 vagy 3 Mhz?

Az első képen látható fénybe szeretném beleszerelni. A második képen látható, hogy mekkora hely van hozza.
A hozzászólás módosítva: Feb 7, 2017
(#) Robi98 válasza Sick-Bastard hozzászólására (») Feb 7, 2017 /
 
Szia!

Legutóbb segítettél abban a led mátrixos animációban, amit sikerült megcsinálnom a kódod alapján. Köszönöm a segítséget utólag is Most is egy animációval próbálkoztam (jóval egyszerűbbel), de megint nem jártam sikerrel. Azt szerettem volna megvalósítani, hogy a led mátrix szélén végigfut egy zöld led fénye. Viszont csak az első fele működik. Elméletben már sokszor végiggondoltam a végtelen ciklus működését, de nem találtam meg a hibát.
Az előző problémához hasonlóan itt is azzal lehet a gond, hogy valamiért a tömb adott elemét nem tudom értékkel feltölteni. Vagyis nem mindenhol.
A tömb globálisan van megadva a főprogram előtt. A multiplexezés most is a Timer2 ISR-jében fut.

  1. while(1)
  2.         {
  3.  
  4.         for(unsigned char i=0; i<7; i++)
  5.                 {
  6.                 green[i]=1;
  7.                 _delay_ms(200);
  8.                 if(i!=6) green[i]=0;
  9.                 }
  10.  
  11.                 while(red[6]<128)
  12.                 {
  13.                 green[6]=(green[6]<<1);
  14.                 _delay_ms(200);
  15.                 if(green[6]==128) green[6]=0;
  16.                 }
  17.  
  18.                 for(unsigned char j=6; j>0; j--)
  19.                 {
  20.                 green[(j-1)]=128;
  21.                 _delay_ms(200);
  22.                 if(j!=1) green[(j-1)]=0;
  23.                 }
  24.  
  25.                 while(red[0]>2)
  26.                 {
  27.                 green[0]=(green[0]>>1);
  28.                 _delay_ms(200);
  29.                 }
  30.  
  31.  
  32.         }


Itt van a multiplexer rész is.

  1. unsigned char t=0;
  2. ]ISR(TIMER2_COMP_vect) // kb. 1/1000-ed másodpercenként hívódik meg.
  3. {
  4. OEport|=(1<<OE); // letiltom az összes latch kimenetét.
  5. resetSPI(); // törlöm az összes latch tartalmát
  6. negative_send(128>>t);//bekapcsoljuk az egyik oszlopot                         
  7. red_send(red[t]);// PIROS adat elküldése
  8. green_send(green[t]);
  9. blue_send(blue[t]);
  10. OEport&=~(1<<OE);//kimenetek engedélyezése
  11. t++;
  12. if(t==7) t=0;
  13. }


VIDEÓ

Ahogy a videóban látható, csak az első fele játszódik le. Sőt, először még az oldalán sem ment le a fény, csak a tetején ment ki a széléig. Annyit változtattam, hogy a tömb létrehozásánál az unsigned char green[7] elé oda írtam egy volatile-t. Így jutottam a mostani eredményre. Nem tudom egyébként, hogy mit változtatott, csak egy megérzés volt. De így sem működik teljesen.
A teljes kódot is csatoltam.
Elnézést, ha néha eléggé triviális dolgokat kérdezek, még soha nem tanultam programozást csak itthon magamtól az internetről és az eddigi fórumos véleményekből. Még csak középiskolás vagyok
A hozzászólás módosítva: Feb 7, 2017
(#) csatti2 válasza david10 hozzászólására (») Feb 7, 2017 /
 
És mit csinálsz majd a rengeteg maradék hellyel?
(#) kapu48 válasza Robi98 hozzászólására (») Feb 7, 2017 / 1
 
while Leírás:
while hurok folyamatosan, és végtelenül, amíg a kifejezés a zárójelek (közöt) hamissá válik. Valamit kell változtatni a vizsgált változón, vagy a while ciklusból nem lép ki soha.

  1. while(red[6]<128)   <<<< Red[6] Nem változik a cikluson belül!
  2.                 {
  3.                 green[6]=(green[6]<<1);    Beragad a ciklusban a program
  4.                 _delay_ms(200);
  5.                 if(green[6]==128) green[6]=0;
  6.         }
  7. ...
  8.         while(red[0]>2)  ????
  9.                 {
  10.                 green[0]=(green[0]>>1); ????
  11.                 _delay_ms(200);
  12.         }
(#) Pethical válasza david10 hozzászólására (») Feb 8, 2017 /
 
Igen, muszáj a MHz. Még mindignem értem, hogy minek neked ehhez usb, vagy uart? Felprogramozod külön, bepattintod és kész. Vagy valamit félreértek?
(#) david10 válasza Pethical hozzászólására (») Feb 8, 2017 /
 
Ezt a fényt átszerettem volna alakítani USB-s dugaszosra, hogy csak beledugom az USB kábelt és a már félig megírt Delphi-s programmal tudjam változtatni a led-ek színét. (és majd tudjam egy a későbbiekben megírandó winamp plugin-nal is használni), ami helyet illeti, idáig nagyon kicsikének tünt, de jobban megnézve egy kisseb webszerver is beférne...

Az idáig megírt programot egy FTDI-s átalaktítóval teszteltem, egyedüli hibája az volt, hogy ha gyorsan változtattam a színt, akkor villogtak a ledek és nem folyamatosan változott a szinük, de ez programhiba.

A V-USB-vel szeretnék kisérletezgetni, és amennyiben lehet ezt az egyszerü fényt azzal szeretném megoldani, de a sorosportot is kihozom az alján egy dugaszra, ha a későbbiekben a programot megkellene változtassam.

Csatoltam a jelenlegi programot, a képernyő alsó ball sarkában írja, hogy éppen mit küld el.
Az ATmega8A-AU tudná a V-USB-t kezelni?
A hozzászólás módosítva: Feb 8, 2017

led77.rar
    
(#) david10 válasza csatti2 hozzászólására (») Feb 8, 2017 /
 
Ebben milyen fajta uC van? Az a 6 lábú alkatrész az uC és az USB dugasz között miret szolgál? Egyoldalas a nyák?
(#) 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 Feb 21, 2017 /
 
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: Feb 21, 2017
(#) rolandgw válasza kiborg hozzászólására (») Feb 21, 2017 /
 
A problémától függetlenül: egy megszakításban a status regisztert mindig el kell menteni és visszaállítani, ha van egyéb temp regiszter, azt is. 4 utasításért miért kell subroutine-t hívni megszakításból? Gondolom CTC módban vagy.
(#) rolandgw válasza rolandgw hozzászólására (») Feb 21, 2017 /
 
Pontosabban: ha van egyéb temp regiszter, amit a megszakításban is használsz, azt is.
(#) zolee1209 válasza kiborg hozzászólására (») Feb 21, 2017 /
 
Nekem az általad megadott értékekkel ezek jöttek ki:
8-as előosztó OCR=200 --> 100,5us 64-es előosztó OCR=25 --> 104us

Hogy ez a 3,5us-os differencia a program melyik részén "halmozódik fel", ami miatt villogás látszódik, így nem tudom. Ha mindkét esetben 100us- os időt szeretnél, akkor az OCR-be írandó érték 199 és 24 az előosztótól függően.
(#) kiborg válasza zolee1209 hozzászólására (») Feb 22, 2017 /
 
Szia!

Ha a 64-es előosztót használom,akkor ha 2-t írok az OCR-be, akkor is vibrál. A 8-as előosztónál meg felmehetek 255-is is,akkor sem. Ekkor pedig a 64-es előosztós megszakítás elméletileg gyakrabban hívódik meg (4us), mint a 8as előosztó(128us). Ezért fura.

@rolandgw: a main még üres, csak a megszakítás fut,ezért nincs minek menteni az SREG-t.
(#) zolee1209 válasza kiborg hozzászólására (») Feb 22, 2017 /
 
mit írsz TCCR-be 64-es és 8-as előosztásnál?
(#) kiborg válasza zolee1209 hozzászólására (») Feb 22, 2017 /
 
8-as osztás: CS21 = 1
64es osztás: CS22=1
Minden más 0 a TCCR-ben.
(#) Sick-Bastard válasza kiborg hozzászólására (») Feb 22, 2017 /
 
Csak rákérdezek a fuse bitekre. Biztos külső kristályra van állítva, ill. a DIV8 ki van kapcsolva?

TCCR2-t át kell szerintem állítani Normálról CTR-re, azaz 1<<WGM21.
(#) kiborg válasza Sick-Bastard hozzászólására (») Feb 22, 2017 /
 
Ehhheee.... rájöttem.

DIV8 nincs is a Mega16-ban tudtommal.
Az üzemmód jó, elvégre nem hullámformát akarok generálni.

Viszont sikeresen elfelejtem törölni a TCNT2-t,amikor belépek a megszakításba
Ezért mindig túlcsordul és amikor 64 es osztó van, akkor (16MHz/64/255) 1,02ms ként volt megszakítás, ha 8-as osztó, akkor 127,5us-ként, függetlenül attól, hogy mit is állítottam be az OCR-ben.
Sajnálom, béna voltam.
Következő: »»   763 / 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