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
Erre én is gondoltam, de foglalt minden kimenet és nem tudok változtatni raja.
Én azon goldolkodom, hogy a főprogramban kellene egy számláló ami 1 másodperc alatt el kell, hogy számoljon 16M-ig és az eredményt uart-on kiköldöm. Csak most a gyakorlatban nem tudom kipróbálni és a megvalósítás is kicsit elgondolkodtat. Véleményem szerint egy IF feltétel is csökkent a futáson, de még egy értéknövel is torz eredményt ad.
Nézd meg a FUSE biteket, mire vannak állítva. Különösen a SUT_CKSEL lesz nagyon hasznos számodra.
Nyilván 16MHz-et csak kristállyal tudsz elérni, ezért nem árt ha a kristályod 16MHz-es. Kristály esetében, ha "magas frekis" van kiválasztva de te kisebbet teszel be, abból lehetnek problémák. Ez esetben a CKOPT bekapcsolása javasolt, és akkor a procid "mindenevő" lesz. Most jönnek a buta esetek ha minden kötél szakad. Frekimérősök elönyben: - állítsd be a timert0-t Fast PWM-re, az OCR0-t pedig 128-ra. A kimeneten mért freki 256-oda a CPU-nak - ha nem értesz a timerekhez akkor egyszerűbb progit kell írnod:
Ha a kimeneten 1Hz-en villog a LED akkor bizony 16MHz-es a procid. Ha az 500-akat 5-re cseréled és frekimérővel rámérsz, kb. 100Hz-et kell hogy kapjál. Minden más eset hibára utal! A hozzászólás módosítva: Nov 10, 2012
Ha van watchdog interruptja, akkor ahhoz tudod merni, mert annak fix az oraja. Egesz jol mukodik, de egy +/- 20%-os tevedest bele kell kalkulalni, mert a WDT orajel forrasa egy RC kor, ami elegge pontatlan es homerseklet fuggo.
A hozzászólás módosítva: Nov 11, 2012
Sziasztok!
Úgy látszik ez a meglepetések hete. DS1307 3,3V elemének a feszültségét szerettem volna figyelni az egyik ADC porton. Mivel a referenia feszültség alatt van ezért a 3,3V-t direkt kötöttem az egyik ADC bemenetre. Ennek az lett az eredménye, hogy vagy nem idult el az AVR vagy hibásan működött. Ez így miért nem jó? Kellett volna feszültség osztó?
Nem lehet, hogy akkor is rajta volt az feszultseg az ADC bemeneten, amikor az AVR nem kapott tapot?
De igen mivel az elemet szeretném mérni ami mindig ott van.
A DS1307 azért kapott elemet, hogy áramszünet esetén is megmaradjanak bizonyos beállítások.
Lehet ezert ment tonkre. Addig nem kaphat feszultseget a labain az AVR, amig nem kap tapot.
Tönkre szerencsére nem ment. Elvágtam azt a vezetősávot ami az elem feszültségét vitte az ADC lábra és minden jó csak nem tudom kontrollálni az elem feszültségét.
Ezek szerint kellett volna a tranzisztor és kondi, hogy ha nincs táp akkor ne kerüljön az elem feszültsége az ADC lábra és táp felkapcsolásakor is késleltetve jöjjön meg.
Igen. Esetleg hasznalj analog kapcsolot.
Nem nagyon ismerem az AVReket, ezért lenne pár kérdésem. Csak panelt tervezek, AVRhez.
Az első kérdésem az lenne, hogy az ATMEGA8-16PU-nak menyi a tápja? 5V vagy 3,3V? A második kérdés, hogy a 12Vos relét meg lehet vele hajtani, BC 546os tranzisztorral? Ezzel a kapcsolással lenne meghajtva anyi módosítással, hogy 10K-s a bázis ellenállás. A hozzászólás módosítva: Nov 11, 2012
5 V. Jó, de a bázis és emitter közé tegyél be egy 100Kohm-ot.
Sziasztok
Sikerült 2db avr-t valahogy elrontanom (Atmeg8 és egy mega88) Van rajta egy kvarc oszcillátor, USBasp programozóval, tudom írni a fuse biteket, ki tudom olvasni a chip ID de nem enged rátölteni programot. Illetve amikor visszaolvasom a fuse biteket, az összes érték 0x00 Mi lehet ilyenkor a gond?
Valamelyik vezeték szakadt lehet, esetleg zárlatos. Vagy nem kap tápot az avr...
ADC mintavételezéssel kapcsolatban szeretnék tisztázni néhány dolgot.
A mikrovezérlő 20 MHz órajelen működik és a mintavételezés nem lehet 20ksps-nél nagyobb, a leosztásnak tehát 128-nak kell lennie. 20 Mhz osztva 128-cal pedig kb. 156 250 Hz. A bemenetre egy aktív aluláteresztő szűrőt szeretnék tenni aminek a vágási frekvenciája a mintavételi frekvencia fele ami ebben az esetben kb. 78 125 Hz ha nem tévedek. Ez így jó? Biztosra akarok menni mielőtt hülyeséget csinálok.
A leosztásnak nem a 20ksps miatt kell 128-nak lennie, hanem azért, mert az ADC modulnak van egy ideális órajel tartománya. Atmega16 -nál ez pl. 50kHz és 200kHz között van.
Az sem biztos, hogy te 20ksps-vel tudsz majd (vagyis 20kHz-cel)mintavételezni, feltételezem, hogy az 200kHz-es ADC-vel menne. Ezt most, ha nem haragszol nem túrom ki az adatlapból. Amúgy a vágási frekvencia legyen kevesebb mint a fele a mintavételezésednek. Elég, ha csak egy töredékkel. De az ugye végeredményben a [ksps] -től függ majd, tehát nem az ADC órajelétől. A hozzászólás módosítva: Nov 12, 2012
Ha az ADC órajele 128-as leosztással 156 250 Hz akkor ez a tényleges mintavételezési frekvencia vagy bele kell számítani azt is, hogy egy konverzió 13 ciklust vesz igénybe?
Bele kell számítani a 13 ciklust.
Ez esetben 156250/13~=12019 Hz a tényleges mintavételezési frekvencia és a vágási frekvenciának ennek a felénél kevesebbnek kell lennie?
A hozzászólás módosítva: Nov 12, 2012
Szigorúan véve nem szükséges.
Játszunk egy gondolatmenetet: Feltételezzük, hogy az aluláteresztő szűrőd tökéletes. Shannon mintavételezési törvény értelmében a mintavételi frekvencia legalább kétszer akkora kell legyen, mint a mintavételezett jel. És itt fontos, hogy ez nem nagyobb-egyenlőséget jelent. Továbbá hasznos, hogyha nem egész többszöröse a kettő egymásnak. Ha a mintavételi frekvencia 10kHz, akkor a vágási frekvencia legyen 4.5kHz mondjuk. De mivel az aluláteresztő szűrőd úgysem tökéletes, ezért nem is olyan fontos a pontos betartás szerintem. Amiket írtam persze csupán teljesen amatőr betekintések a jelek digitalizálásába A hozzászólás módosítva: Nov 12, 2012
Ok köszi, akkor a tényleges mintavételezési frekvencia 12019 Hz és nem 156250 Hz igaz?
Ezt szeretném megtudni mert nem mindegy, hogy melyikhez igazítom a szűrő vágási frekvenciáját.
Szia!
Igen, a mintavételi frekvencia így 20Mhz/128/13, azaz 12,019 kHz. A szűrőt azonban a felénél alacsonyabb frekvenciára tervezd, úgy hogy ~6kHz-es frekvencián már szűrve legyen a jel, ugyanis a mintavételi tétel csak ideális aluláteresztőre vonatkozik, a valóságban átlapolódás léphet fel.
Sziasztok!
Egy digitális hangszínszabályzó LCD kijelzőjére szeretném kijelezni a spektrumot, és ehhez kérnék némi segítséget FFT-vel kapcsolatban. A mintavételezés megvan, szépen visszakapom a jelet, azonban az FFT-nél elakadtam. Amit eddig magam írtam C-ben, rettentően lassú, és sok helyet foglal. Van valaki, aki ebben jártas, és csinált már viszonylag gyors FFT-t AVR-el? Kis kiindulási pont kellene, hogy hogyan is kezdjek neki, milyen formában tároljam az adatokat, hogyan hajtsam végre a transzformációt azokon, hogy gyors legyen? Vagy esetleg tudtok ajánlani valóban használható FFT library-t?
Két Atmega8 közt szeretnék adatkapcsolatot létrehozni rfm70 modul segítségével.
Némi adatot példákat találtam ugyan a neten, de nem áll össze a kép... Első körben egyirányú adatküldés érdekelne winavr c kódban. Esetleg némi kp-t is áldoznék a segítségért A hozzászólás módosítva: Nov 14, 2012
Szia!
Sajnos ezzel nem Te vagy az első. Én is megpróbáltam életre kelteni két RFM70-t, de mindmáig sikertelenül. Milyen nyelven programozol? C-ben elég sok példa van, állítólag egy része működik is, de nekem ASM-re nem sikerült visszafordítani, kérdéses maradt, hogy az eredeti C-ben van a hiba vagy az ASM fordításban. Üdv Kiborg
Első körben javaslom a két mikrokontrollert kösd össze SPI-vel. Kommunikálj eme modul nélkül. Ha az megy, akkor lépj tovább.
Kb a mellékelt kódsorozatot kell beletölteni az adóba meg a vevőbe is ,a tx/rx rész értelem szerűen választani . Ezután azt hiszem a payload lenght-nek megfelelő számú byte-ot (11-es regiszter (20 or 11 = 31) itt talán 3 ) beletölteni az adóregiszterbe (0xA0 b1 b2 b3 ) . Majd a túloldalon várni a csodát.Csak akkor zajlik le rendben minden ,ha a vevő visszaküld egy nyugtázó jelet.A leadott adatmenyiségnek stimmelni kell a vevő oldalon beállított hosszhoz ,különben nem foglalkozik vele.
A modulokról némi infót lehet az áramfelvételből kapni.A vevő ha működik 20-30 ma körül vesz fel.az adóról így nem megállapítható.Azt a megszakításból,státuszregiszterből látszik ,ha működik. ( esetleg a vevőnek van térerő mérő része,de ha azt fel tudod programozni akkor már egyébként is közel vagy a célhoz ) A kommunikáció akkor biztosan jó a chippel , ha CSN 0-ra váltása után küldött FF-re (NOP) 0e-t (esetleg 8E) (státusz regiszter) válaszol.Ami még érdekes ,ha elküldted az adatot egy ideig várni kell a visszaigazolásra ,azonnal hiába olvasod a státusz regisztert. Én piccel szenvedtem vele.Nem mondom nem annyira egyszerű. Nekem a CHIPCAD honlapján lévő egyik fórum hozzászólás linkje segített megérteni. A hozzászólás módosítva: Nov 14, 2012
Hali!
"kb ez a kód" elég homályos Sokat foglalkoztam velük én is. Működött a chippel a kommunikáció, sikeresen olvastam ki a regisztereket. Be állítottam őket adott értékre, utána kiolvastam. Eljutottam addig, hogy beírtam az adó regiszterbe, kiolvastam az RX Empty bitet, ami jelezte, hogy benne van a cucc, majd engedélyeztem az adást, és utána újra kiolvastam az RX Emty-t, ami jelezte, hogy üres a buffer. Ennek ellenére semmit sem sikerült vennem a másik oldalon. Ez a rövid történetem. Ezekután és egy csomó ráfordított idő után váltottam BT modulokra, ami elsőre problémamentesen működött. Üdv Kiborg A hozzászólás módosítva: Nov 16, 2012
|
Bejelentkezés
Hirdetés |