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   494 / 840
(#) blackdog válasza Reggie hozzászólására (») Nov 10, 2012 /
 
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.
(#) zombee válasza blackdog hozzászólására (») Nov 10, 2012 /
 
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:
  1. #define F_CPU 16000000
  2. #include<avr/io.h>
  3. #include<utils/delay.h>
  4. int main(void)
  5. {
  6.     DDRA = 1;
  7.     for(;;)
  8.     {
  9.         PORTA = 1;
  10.         _delay_ms(500)
  11.         PORTA = 0;
  12.         _delay_ms(500);
  13.     }
  14. }

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
(#) Reggie válasza blackdog hozzászólására (») Nov 11, 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
(#) blackdog hozzászólása 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ó?
(#) Reggie válasza blackdog hozzászólására (») Nov 11, 2012 /
 
Nem lehet, hogy akkor is rajta volt az feszultseg az ADC bemeneten, amikor az AVR nem kapott tapot?
(#) blackdog válasza Reggie hozzászólására (») Nov 11, 2012 /
 
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.
(#) Reggie válasza blackdog hozzászólására (») Nov 11, 2012 /
 
Lehet ezert ment tonkre. Addig nem kaphat feszultseget a labain az AVR, amig nem kap tapot.
(#) blackdog válasza Reggie hozzászólására (») Nov 11, 2012 / 1
 
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.
(#) Reggie válasza blackdog hozzászólására (») Nov 11, 2012 /
 
Igen. Esetleg hasznalj analog kapcsolot.
(#) Gabó hozzászólása Nov 11, 2012 /
 
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
(#) tursaba válasza Gabó hozzászólására (») Nov 12, 2012 /
 
5 V. Jó, de a bázis és emitter közé tegyél be egy 100Kohm-ot.
(#) Gabó válasza tursaba hozzászólására (») Nov 12, 2012 /
 
Oké köszönöm a választ!
(#) Brian88 hozzászólása Nov 12, 2012 /
 
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?
(#) zombee válasza Brian88 hozzászólására (») Nov 12, 2012 /
 
Valamelyik vezeték szakadt lehet, esetleg zárlatos. Vagy nem kap tápot az avr...
(#) Adam329 hozzászólása Nov 12, 2012 /
 
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.
(#) sikolymester válasza Adam329 hozzászólására (») Nov 12, 2012 /
 
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
(#) Adam329 válasza sikolymester hozzászólására (») 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?
(#) sikolymester válasza Adam329 hozzászólására (») Nov 12, 2012 /
 
Bele kell számítani a 13 ciklust.
(#) Adam329 hozzászólása Nov 12, 2012 /
 
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
(#) sikolymester válasza Adam329 hozzászólására (») 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
(#) Adam329 hozzászólása 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.
(#) Mikee91 válasza Adam329 hozzászólására (») Nov 13, 2012 /
 
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.
(#) Mikee91 hozzászólása Nov 14, 2012 /
 
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?
(#) Istvanpisti válasza Mikee91 hozzászólására (») Nov 14, 2012 / 1
 
(#) kisstom hozzászólása Nov 14, 2012 /
 
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
(#) kiborg válasza kisstom hozzászólására (») 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
(#) sikolymester válasza kisstom hozzászólására (») Nov 14, 2012 /
 
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.
(#) proba válasza kiborg hozzászólására (») Nov 14, 2012 /
 
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

radio.txt
    
(#) kiborg válasza proba hozzászólására (») Nov 16, 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
(#) kisstom válasza kiborg hozzászólására (») Nov 16, 2012 /
 
BT modul milyen távolságra jó?
Következő: »»   494 / 840
Bejelentkezés

Belépés

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