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
Ez lemaradt az előzőből, nem töltötte fel mellé...
T-bird panelen van, szóval a bekötés jónak kell, hogy legyen. Az órajelnek utána nézek köszi!!
Következők kellenek:
-Táp (egyszerűség kedvéért minden lábra, vcc, avcc) -Föld -Közös föld programozó és AVR között -programozó lábak helyes bekötése -az isp programozó órajele max 1/4-e legyen az AVR-nek, az atmega168-nál ez 1MHz/4 = 250kHz -bekötés újraellenőrzése
Linkeld be az egész kódot. Vagy legalábbis annyit biztosan, amiben biztos vagy, hogy önmagában is megcsinálná ezt a funkciót. (Tehát ha 2 ezer másik irreleváns programsor is van amúgy, akkor az nem kell).
A lényeg, hogy amit belinkelsz, az önmagában képes legyen fordulni és ezt a nem működő funkciót tartalmazza. Akkor sokkal gyorsabban rájövünk a hibádra.
Idézet: „Hogy tegyem buffer[k] tartalmát egy változó értékévé?” Ez most arra kell, hogy a buffer lenne szerinted az a változó, amivel írsz az SD kártyára? Itt mindenesetre van egy csúnya tömbön kívülre írásod. A kiértékelés után növeled az értékét a byteCounter-nak. Tehát a 4 hosszú start_counter tömbbe 5-ször írsz bele. Ettől úgy igazán megbolondulhatnak a dolgok.
Meg nem értem, a
két helyen is definiálva van Ha a readFile_counter függvényben lévő start_counter -t el szeretnéd érni a main függvényből, akkor azt mondjuk definiáld a fat32.c -ben a mainben pedig
hivatkozz rá. Szegény linker ne kapjon sokkot.
Nem vagyok biztos benne, hogy tudom mi zajlik itt, vagy hogy mit szeretnél, de ha amiatt aggódsz, hogy feleslegesen másolsz onnan, akkor mutass be oda egy mutatóval és azt használd fel. De vigyázat a volatile-ra nem lehet csak úgy pointerelni. Bevallom, most nem ugrik be fejből hogyan kell, de keress rá, hogy "pointer avr volatile" és megtalálod.
Köszönöm a gyors választ db_Thunder de sajnos nincs signál generátorom esetleg valami kis kapcsolást tudnátok küldeni/ajánlani amit ha megépítek el tudom indítani vele a chipet előre is köszi.Üdv.
Inkább fájl-ban válaszolok, nem akarok spam-elni.
És köszönöm a gyors választ!
Nos látom sok minden zavaros C programnyelv ügyében.
Szerintem jobban jársz, hogyha szépen leülsz egy könyv mellé és ezekre a kérdésekre válaszokat keresel. Egyrészt könnyen lehet, hogy egy fórumon valaki pontatlanságot mond. Javaslom ezt a könyvet: A C programozási nyelv Az ilyen megoldások előtt le a kalappal, hiszen alkottál:
De ez is tanúságot ad, hogy nem tudod, hogy van egy C standard library. Az AVR-nél ez az avrlibc pont az ilyen sokat használt dolgokra lehet alkalmazni, mint int->string váltás stb. A fenti példát az itoa függvénnyel lehet megoldani. A string->integer irány pedig a atoi -val oldható meg. Érdemes körüllesni az oldalon. Sőt én elolvasnám az egész manualt is, mert eléggé sokat lehet tanulni belőle. Kezdésnek szerintem jó lesz.
A kötések biztosan jók, tápot a programozó ad neki a kapcsolás szerint 20MHz-es kvarcról megy az atmega, azzal próbáltam, a programozómban meg 3,6867MHz-es kristály van. Ha a programozásig adok neki máshonnan más értékű órajelet akkor jó lesz? (bocsi a hülye kérdésekért de eléggé kezdő vagyok)
Szia! Velem is megesett már, vagy tíz alkalommal minimum sorozatgyártás közben . Szerencsére nekem volt függvénygenerátorom. Itt nem olyan kritikus a frekvencia értéke, én pl 4MHz-el hajtottam meg, de szerintem kisebbel is lehet. A programozásnál nem kritikus. Mivel Te külső RC órajelre állítottad akaratodon kívül, ezért külső RC taggal megoldható a dolog. Ami gondolom minden kezdő-haladó fiókjában elszórva megtalálható. Ezzel számolhatsz kb: f = 1/(3RC). A leírás a kontroller adatlapján megtalálható, konkrétan a 28. oldalon. Esetleg ha van még egy vezérlőd a közelben, akkor azzal is meghajthatod .
Köszönöm segítséged közben átnézegetem a chip doksiját meg fogom próbálni amit leírtál.Üdv.
Hali mindenki!
Leszögezném hogy erősen kezdő vagyok a programozásban ( C) . Van egy olyan gondom, hogy egy alapban bemenetként definiált lábon elvégzem AD konverziót, de utána kimenetre kellene állítani, hogy kisüsse (ellenálláson keresztül) a kondenzátort melynek feszültségét mérte. Tehát lehet e változtatgatni DDRB regiszter értékét program közbe ? (sajnos nincs már több szabad "lábom")
Szia!
Persze, a program futása közben gond nélkül állítható a lábak ki-be iránya. Ugyanúgy kell, mint ahogy bemenetnek inicializáltad, csak most 0 helyett 1-esre állítsd, és nem ártana ilyenkor az előzőleg bekapcsolt AD-is dolgokat kilőni. Ajánlatos megfelelő kisütő ellenállást választani, hogy kisütés közben ne haladja meg a láb maximális terhelhetőségét.
Az rendben van, hogy a kapcsolás szerint 20MHz a kristály rajta, de ha default fuse beállítása van, akkor az bizony 1MHz-en jár. Ha korábban még nem sikerült programoznod, akkor az 1MHz. Illetve felhívom a figyelmed a CKDIV8 fuse-ra, ami 8-cal osztja az órajelét, legyen az belső oszcillátor, vagy külső kristály.
Próbáltam meghajtani xtal1 -et 4MHz-es órajellel is, de az a baj hogy semmit nem tudok beállítani rajta amíg nem látja a chipet. Azért kérdeztem hogy mit lehet ezzel kezdeni. AVR910 programozó felújított változatát használom, mást sikerült már programoznom de ezt valamiért nem karja.
Sziasztok!
Azt szeretném kérdezni tőletek, hogy hogyan kell vezérelni a hardware-s USB-t az AVR-ben??? atmega8u2-au a fajtája.
Köszi nekem amúgy még nehezebb lesz mivel első saját tervezésú AVR-es kapcsolásom lesz
Sziasztok!
A timerek beállításéval kapcsolatos kérdésem lenne. Két frekvenciát szimuláltam le matlab segítségével és valamiért nem úgy jöttek ki a frekvenciák ahogy kellettek volna. A rendszer órajele 7.3728MHz a soros porttal való kommunikáció miatt. 1.mód: Gyors PWM: COM1A1,COM1B1,WGM11,WGM12,WGM13,CS10=1, a többi=0 a) 737Hz ICR1=9999; TCCR1A=0xA2; TCCR1B=0x19; OCR1A=4999; OCR1B=4999; //50% kitoltes b) 1946Hz ICR1=3788; TCCR1A=0xA2; TCCR1B=0x19; OCR1A=973; OCR1B=973; //50% kitoltes 2.mód: Fázishelyes PWM: COM1A1, COM1B1, WGM11, WGM13, CS10=1, a többi=0 a) 737Hz ICR1=5000; TCCR1A=0xA2; TCCR1B=0x11; OCR1A=2500; OCR1B=2500; //50% kitoltes b) 1946Hz ICR1=1894; TCCR1A=0xA2; TCCR1B=0x11; OCR1A=947; OCR1B=947; //50% kitoltes Kérdés hogy miért gyérebb a nagyobb frekvencia jele mint a kicsié? Utólag kipróbáltam kisebb frekvenciákra is (pár Hz-re), és minél nagyobb értéket adtam ICR1-nek, annál gyorsabban pillogott a vezérelt LED, ami ellentmond a Timer képletének. Segítségetek előre is köszönöm.
Kipróbáltam élesben, és valóban nem a Timerekkel volt gond. Nem tartottam fontosnak hogy megjegyezzem, de a csatolt képek eredményei 50 darab ADC konverzióból származnak, tehát nem rögtön a PWM-el megvezérelt lábról vettem a jelt, hanem az azt vevő fototranzisztorok által vett jelt. Így gondolom az ADC beállításokkal lesz gond:
Aztán a main-ben: Konfig8bitADC(); és a while(1)-ben: adat = Beolvas8bitADC(5); //5-os csatorna Erről az "adat" -ról véltem hogy megeggyezik a PWM jellel, de tévedtem. A probléma továbbra is fent áll, csak a kérdés más: hogyan állítsam az ADC-t hogy azt vegye amit a PWM ad?
Hogy az ADC mintavételi frekvenciája 50 és 200 kHz közé essen, változtattam az ADPS biteken, és 100Hz-re állítottam a timert. Az eredmény továbbra sem lett meggyőző
További képek 264Hz-ről. Miért nincs különbség a 100Hz-eshez viszonyítva?
Sziasztok!
A Nyolc lábbal AVR IV. részében talált RGB ledes hangulat világítást szeretném megépíteni. Annyi extrát szeretnék a dologba, hogy legyen rajta egy nyomó gomb amivel lehetne előre beállított színeket bekapcsolni és egy fehér szín is lenne. Különálló piros kék zöld ledekből. Nem tudom mennyire lenne jó, egy Fet-en keresztül szeretnék többet meghajtani. Ehez szeretném a segítséget kérni hogy a kódot eképpen kiegészíteni. Valamennyire értem, de nem tudom hol nyúljak bele(pedig jelenleg is tanulok C-ben AVR-t programozni).
A segítséget előre is köszönöm. Üdv: Tecsa
A képek láttán én inkább gondolkodnék, mielőtt megkérdek valakit.
A mintavételi freki tényleg annyi amennyit írsz? Most a "100Hz 57,6kHzmintavetellel"-t nézem: Most VAGY a jeled 21.926kHz, vagy a mintavételi frekid 263Hz(esetleg ez alatt és akkor alulmintavételezel). Én mondok valamit, az AVR-ek ADC-je egyáltalán nem olyan gyors mint azt hiszed. Kb. 13kHz-en (de több jel együttes vizsgálatánál még kisebb) még jó, de az fölött ne várj csodákat! A másik hogy az ADC konverzió is időbe kerül, 13 ADC órajelbe(amit egy osztóval állítasz be). Azt javasolnám hogy a PWM vizsgálatát inkább frekvenciamérővel valósítsd meg! Ha nincs ilyen multimétered akkor kösd a T0 lábra az AVR-en ami a Timer0 számláló bemenete és úgy sasold meg!
Sziasztok azt szeretném kérdezni hogy hogyan tudok felprogramozni egy AVR-t ??? AVR-dragonnal ?? nem akarja sehogy megcsinálni nekem mi lehet a probléma ?
A kapcsolások között Topi közlekedési lámpáját szeretném meg csinálni de nem tudom felprogramozni az AVR-t ugyan azt a kapcsolást csináltam meg de nem tudom fel programozni.
Lehet hogy a LED-ek leterhelik a programozólábat...
azt írja hogy meg van az 5-volt
azt nem tudom hogy probléma e hogy a reset gombot nem 10K-s ellenállással kötöttem rá hanem nagyobbal az baj ? frekvenciával írt ki valamit de nem tudom beállítani 115.2khz-re 125-re tudom meg 111-re :S remélem ez nem gond
A freki nem gond, lényeg hogy legfeljebb az AVR órajel negyede lehet. Ez gyárilag 1-1.2MHz, így a 115kHz jó.
Nem az 5V-ról beszélek, hanem azokról a lábakról amelyeken keresztül programozol. Tudod? MOSI-MISO-SCK. |
Bejelentkezés
Hirdetés |