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
Szia mindenkinek!
Eléggé kezdő vagyok. Kérdésem: az *.ASM file-ből hogy lehet HEX filé-t készíteni az AtmelStudió, vagy a CodeVision programban. Köszönöm!
Sziasztok!
ATMega48PA-PU-val szeretnék egy akkumulátoros fúrógépből kiszerelt motort (12V-os) vezérelni. Ehhez egy IRLZ34N MOSFET-et használnék. A probléma az, hogy ha a PWM kitöltési tényezője kevesebb, mint 100%, akkor a motor megmozdul, de nem pörög föl.
Ha minden igaz, akkor így fázishelyes módban, 64-es előosztással megy az időzítő. A CPU 8MHz. A MOSFET-hez csatlakozó láb kimenet. Ha a kitöltés 100% (vagy sima I/O lábként próbálom, PWM nélkül), akkor gond nélkül megy a motor, a MOSFET nem melegszik egyáltalán. A kapcsolás valahogy így néz ki. Lehet, hogy a 270 Ohmos ellenállás túl nagy, és ezért a MOSFET nem kapcsol be elég gyorsan? A hozzászólás módosítva: Jan 15, 2017
Sziasztok!
Építettem egy 7X8 RGB led mátrixot egy ATmega8-al és terveztem rá egy animációt. Videó : ITT. A probléma az, hogy az első piros sor(a kódban red[0]) értéke végig nulla marad. Pedig annak is fel kéne töltödnie 1-255-ig. Akárhogy törtem a fejem nem találtam meg a hibát. A legmegdöbbentőbb az, hogy ha csak az animáció felét(mármint csak a feltöltődés efektust) rakom a végtelen ciklusba, akkor működik az első sor is. A multiplexezés a 8 bites Timer2 interruptjában fut, azzal nincs gond, tökéletesen működik. Valahol a végtelen ciklusban lehet a hiba.
Szinte biztos vagyok benne, hogy a nálam tapasztaltabbak százszor egyszerűbben is meg tudnák írni az animációt, de én csak erre jutottam Esetleg valami ötlet, hogy mi lehet a hiba?
Elnézést, az előző kód miatt, elég rosszul sikerült a beillesztése. Itt az új:
Köszönöm a segítségeteket!
Paritás,stop bitek rendben voltak, de az órajel nem.. Nem módosítottam fuse biteket, nem használok külső oszcillátort. Most működik, de még kellett egy kis módosítás az általad említetteken kívül:
A 8-as osztást ki lehet kapcsolni fuse bitek módosításával? Persze akkor F_CPU-t is át kell írni gondolom.
Igen ki lehet kapcsolni a fuse bitekkel.
Másik megoldás, hogy a kódba irod be a kikapcsolást.
Ezt beirod a kódod legelejére és igy 8Mhzen fog menni.
Egy debug javaslat, ezt:
cseréld le erre:
Ha egyik fény sem fut, akkor valóban a red[0] változóval van a baj. Ha mégis lefut, akkor valahol máshol a megjelenitésben.
Igen jól gondolod, viszont ezt a cikket olvasd el mielőtt belevágsz: Bővebben: Link. Másik hasznos dolog a fusebit doctor, néhány oldallal korábban adtam rá linket.
Köszi, a javaslatot. Kipróbáltam és semmi változás. Tehát az már biztos, hogy a red[0] értéke az folyamatosan növelődik. Valahol máshol lehet a hiba. Kipróbáltam, hogy a csökkenő részt kivettem az animációból: ha az összes feltöltődött, akkor lenullázódnak és újra kezdődik a feltöltődés. Na ott működik mindegyik oszlop. Fogalmam sincs, mi lehet a hiba.
Üdv!
Open-suse alatt próbálkozok az avr-gcc -vel de sikertelenül. A követketző hibát kapom mindíg:
Valaki tud esetleg megoldást erre? Illetve ha valaki tud küldeni egy AVR C forrásfájlokat HEX-re fordító minta makefile-t ami működőképes, azt örömmel fogadnám! (Lehet abban van a hiba?) Előre is köszönettel! B.
Összedobtam két másik megközelítést a ciklusodhoz, hátha némi inspirációval szolgálnak.
MCU után kell megadni az avr tipusát
F_CPU után az órajelet (érdemes ezt használni kódban is, pl.: c=8000000/8; helyett c=F_CPU/8; ) MODULES után ha a főprogramon kívül használsz modulokat LIBS után ha használsz lib-eket AVRDUDE, PORT és PROGRAMMER-t beállíthatod, ha make-el akarsz írni is (persze a programozódhoz) CFLAGS és LDFLAGS bővítheted, ha szükséges A HEADER alá bele teszi az összes könyvtárban lévő fejléc file-okat. Azt feltételezi, hogy a főprogram a main.c-ben van. használat fordítás:
takarít:
kiírja a programod és az eeprom méretét (hasznos lehet, ha épp belefér/nem fér bele méret körül vagy)
felprogramozza az MCU-t
eeprom-ot felprogramozza (ha használsz):
Makefile:
A hozzászólás módosítva: Jan 16, 2017
Köszönöm szépen a kód javaslatokat Amint lesz egy kis időm, ki is próbálom. A második kód hasonlított ahhoz amivel én próbálkoztam, ezért ugye könnyebb volt megérteni számomra. Az első viszont nagyon elegáns, mivel rövid és teljesen automatizált.
Eléggé kezdő vagyok még a programozásban, sokat kell még tanulnom Ez a sor például nem jutott volna eszembe, pedig teljesen logikus:
A hiba valószínűleg az elején levő értékadás: unsigned char s=1;
Amit a programod végén indokoltam.
A hozzászólás módosítva: Jan 17, 2017
Sziasztok!
Ha postán feladnék egy ATMega kontrollert válaszborítékkal, postaköltséggel együtt, akkor megtenné nekem valaki, hogy felprogramozza? A segítség csak abban a formában jó, ha nem Arduino ISP-s programozással van megoldva. Segítségeiteket előre is köszönöm, privátban üzenetben jelezzetek, ha tudtok. Köszönöm!
MŰKÖDIK! Köszönöm segítségedet! Plusz öröm, hogy ennek segítségével sikerült megtalálni azt is, hogy amivel eddig próbálkoztam, az miért könyökölt ki mindig a gépházból.
Csak kíváncsi vagyok, hogy az ArduinoISP miért nem jó?
Arra én is. Az IC-t ugyan nem érdekli mi programozta fel.
Bocsi, de ezt nem értem. Miért baj az, hogy miután kilépek a második while-ból, akkor egy lesz a változó értéke? Ez miben befolyásolja azt, hogy az első oszlop egyáltalán nem világít? Hiszen amikor kilépek a második while ciklusból, egy lesz az értéke a változónak és indul az elejéről a feltöltődésért felelős ciklus (első while) aminek úgy kéne kezdődnie, hogy az első oszlop első ledje világít (red[0]=1).
A hozzászólás módosítva: Jan 18, 2017
„első oszlop első ledje világít (red[0]=1).”
Az nem elég, hogy a változóknak adsz értékeket! Ezeket az értékeket még ki kellene küldeni a megfelelő portokra is! Hogy vezéreljed a LED-eket. És előtte kimenetre állítottad a portjaidat?
ATMEL AVR Tutorial 2 : How to access Input / Output Ports ? A hozzászólás módosítva: Jan 18, 2017
„első oszlop első ledje világít (red[0]=1).”
Az nem elég, hogy a változóknak adsz értékeket! Ezeket az értékeket még ki kellene küldeni a megfelelő portokra is! Hogy vezéreljed a LED-eket. És előtte kimenetre állítottad a portjaidat?
AVR programozás
Robi98 írta:
Idézet: „Akárhogy törtem a fejem nem találtam meg a hibát. A legmegdöbbentőbb az, hogy ha csak az animáció felét(mármint csak a feltöltődés efektust) rakom a végtelen ciklusba, akkor működik az első sor is. A multiplexezés a 8 bites Timer2 interruptjában fut, azzal nincs gond, tökéletesen működik. Valahol a végtelen ciklusban lehet a hiba.” Itt mellékelte a videót is, ahol látszik az animáció. Az valóban furcsa, hogy csak akkor nem jelenik meg az első sor, ha harmadik while() ciklus is benne van a kódban. Nekem az az elképzelésem, hogy olyan helyen van a hiba a kódban amit nem osztott meg. Pl.: az adatok kiírása a mátrixra. Robi98: Hogy segíthessünk légyszíves oszd meg az egész kódot, megszakítással mindennel.
Segítséget kérnék, nekem van AtTiny13A amivel akku töltőt szeretnék csinálni, de nem tudom beprogramozni.A program megvan.Ha valaki nekem beprogramozna két példányt, adnék két darabot neki.
Nekem Tőletek lenne kérdésem .Tudna valaki sagíteni ? AtTiny13A -al akku töltőt szeretnék csinálni, de nem tudom beprogramozni.A program megvan.Ha valaki nekem beprogramozna két példányt, adnék két darabot neki.
Nos, először adok egy kis hardveres betekintést:
Ugye a mátrix közös katódos RGB ledekből áll és úgy vannak összekötözgetve, hogy oszloponként vannak a közös katódok, soronként pedig a megfelelő színekhez tartozó anódok. Összesen 4 darab 74hc595 shift regiszter vezérli a ledeket: piros sorok, kék sorok, zöld sorok, és ugye az oszlopok tehát a közös katódok. A közös katódokat a shift regiszter egy tranzisztormezőn keresztül hajtja meg mert ugye itt sok áramot kell elnyelni. És ugye emiatt egy sor bekapcsolásánál nem 0-t kell elküldeni a shift regiszternek, hanem 1-et mert ugye az kapcsolja be a megfelelő tranzisztort. A shift regisztereket SPI buszon vezérli az ATmega8. A három színért felelős shift regiszter OE lábai össze vannak kötve és a mikrovezérlő vezérli a PB0-ás lábon. Erre azért van szükség, hogy egyszerre le lehessen tiltani őket és olyankor biztosan sötét az összes led, mert nem jelenik meg rajtuk az előző adat. A reset lábak is össze vannak kötve, hogy egyszerre törölhessem a beléjük írt adatot. Ennek külön oka van, hogy így csináltam. A multiplexezésről: Ugye a timer2 interruptjában fut, ahogyan előzőleg írtam, hogy a főprogramtól független legyen. A vezérlő órajele:8MHz >> 64-es előosztás >> 125000Hz >> ocr2=124 >> 1ms-ként van interrupt (plusz még az a kicsi idő még végigfut.) Azaz 1ms-ig van bekapcsolva 1 oszlop, aztán a következő és így tovább. Megpróbáltam az egyes részeket jól felkommentelni.
A hozzászólás módosítva: Jan 20, 2017
Már próbáltam felhivni a figyelmedet rá!
Kipróbáltam a main while() ciklusát, ami nálam jól megy... szimulációban.
Robi98 szerintem azért adja meg az "s" értékét a while(1) ciklusban, mivel a harmadik while() vége után s = 0 lesz. Igy amikor main while() ciklusa másodjára futna le, akkor nem lépne be a while(s) ciklusba. Megoldási javaslatom: while(s) helyett while(red[6]<255) Igy kikerülhet az "s" az első while()-ból. az én megközelitésem
Esetleg
helyett,
Lásd, a lap tetején lévő sárga négyszög 1. pontját. A hozzászólás módosítva: Jan 20, 2017
Felesleges volatile-nak deklaralni, mert csak a megszakitas hasznalja azt a valtozot. Igazsag szerint a megszakitas fuggvenyben kellene deklaralni igy:
A hozzászólás módosítva: Jan 20, 2017
Szia!
Kérdésem lenne? A legtöbb AVR-es projektben, csak a HEX file van megadva, viszont az (STK500) programozóban vannak Fuses és Lock bitek. Ha ezek nincsenek megadva honnan tudom meg, hogy mit kell odaírnom? Előre is köszönöm a segítséget, a választ. |
Bejelentkezés
Hirdetés |