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 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
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 ![]() 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.
Itt van a multiplexer rész is.
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
És mit csinálsz majd a rengeteg maradék hellyel?
![]()
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.
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?
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
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?
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.
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?
Az Atmega8 adatlapja szerint kell oda ellenallas?
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.
Köszönöm szépen a válaszodat!
A válaszodat megfogadva nem teszek bele. A 68HC705-nél is kell tenni?
Végül csak belefért a dobozba...
![]()
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.
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
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):
A hozzászólás módosítva: 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.
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ő.
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.
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
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:
Grid_Imp:
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
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.
Pontosabban: ha van egyéb temp regiszter, amit a megszakításban is használsz, azt is.
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.
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.
mit írsz TCCR-be 64-es és 8-as előosztásnál?
8-as osztás: CS21 = 1
64es osztás: CS22=1 Minden más 0 a TCCR-ben.
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.
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. |
Bejelentkezés
Hirdetés |