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
Üdv!
Szeretném egy Attiny24 vezérlő 6 különböző lábát egymás után egy for ciklussal magas illetve alacsony szintre váltani. A gond az, hogy a lábak nem 1 porton belül és nem is sorban vannak. Én úgy gondoltam, hogy ha egy tömbbe berakom a portokat és a hozzájuk tartozó lábakat párban, akkor szépen végig tudok rajtuk lépegetni. De ez így nem működik, mint utólag kiderült. Milyen megoldás volna erre?
Az elképzelésed jó.
A kivitelezésben lehet a hiba. Lássuk a programod. Biztosan lessz rá megoldás.
Egy állapotautomatával tudnám még elképzelni a megoldást. A for ciklusban egy nagy switch....case utasítás és akkor minden lépésben meg tudod adni, hogy melyik kimentet kapcsolja be vagy ki.
Tokeletes a tombos megoldas, a kerdes csak az, hogy egesz pontosan mit teszel a tombbe. A port regiszternek van cime, azokat lehet tombbe tenni. Es azt is lehet tombbe tenni, hogy az adott porton melyik labat (bitet) kell kapcsolni.
A hozzászólás módosítva: Jún 22, 2014
Sziasztok!
Sikerült kizárnom magam egy ATMEGA8-ból. Rosszul írtam be a fusebiteket (D9 E1). Mivel nincs itthon másik Atmega8 és nagyon kellett volna, gyorsan építettem egy Fusebit Doctort (328 legújabb fimware van rajta) és az sem hozza helyre. Ilyenkor mi van? Kuka? Ja és a "Doctor" tökéletes (másik procival (328) próbálva). Üdv: Zsolt
Egy kis interpretácios problémám van.
Nem tudom pontosan értelmezni, hogy mit is kéne csinálnia ennek a funkcionak. or pl,ph brne xpulse A sugo is 2 változatrol beszél összehasonlitja bitenként a két registert. A bajom az, hogy a brne sort csak akkor hagyja ki, ha mind a két regiszter 0 ( pl és a ph). Minden más alkalommal a brne-re ugrik (xpulse). Megvilágositana valaki? Kösz! A hozzászólás módosítva: Jún 22, 2014
A brne/breq-t a Z (zero flag) vezérli, ami 1-be áll,ha a művelet eredménye 0,ez esetben ha mindkét érték 0. A brne Z=0-nál ,a breq Z=1-nél ugrik,tehát jól működik Ha nullára akarsz ugrást akkor a breq-t kell használni.
Elvileg az AVR-ek valahol eltárolják, hogy mi volt a reset oka (áramkimaradás, watchdog, stb). Hogy lehet ehhez az információhoz hozzájutni? Adatlapban nem találtam semmit, de lehet csak figyelmetlen voltam.
Kösz, akkor jo a progi, csak már a sok egyébb aproság miatt itt akadtam meg.
MCUSR és környéke:
- bitenként: jtag reset external reset bod power on stb...
Az "or" az logikai vagy muvelet, ami nem osszehasonlitas. Bitenkenti OR eredmenye akkor nulla, ha mindket ertek nulla.
Kösz!
A kiértékelésbe zavarodtam bele, nem a fogalomba.....(mikor 0 az eredménye ). Közben már megtaláltam a hibát miért nem azt csinálta amit akartam..... A hozzászólás módosítva: Jún 22, 2014
Sziasztok! Nem igazán fórumtéma, de valaki fel tud programozni nekem egy mega8-ast? Egy nixi csöves órát építek, de a win7 nem kezeli az avr doperemet (hestore-s). Napközben budapest belvárosában tartózkodom Károlyi kertnél.
Először is köszönöm neked, kapu48-nak és Zsolt2-nek a hozzászólásokat.
Nos, valószínűleg több helyen is hibáztam, beszúrom ide az ideillő részletet a programomból, mint látható, én először #define-al szépen sorba raktam a lábakat, neveket adtam nekik, majd ezeket az elnevezéseket tettem egy tömbbe, amit szerettem volna bejárni.
Majd futás közben így hívtam meg:
Már látom, hogy ez teljesen rossz, mert így a fordító szó szerint a PR1...PR6 és az R1..R6 argumentumokat adja át, és nem a kódot, amire mutatnak. A hozzászólás módosítva: Jún 22, 2014
Inkább: OUT P,Rr
Ldi R16,arrayr[i] out arrayp[i],r16 A hozzászólás módosítva: Jún 23, 2014
Ezzel az a baj, hogy az arrayp[i] |= az a tombot magat irja at, nem a portot. Nem tudom, hogy mennyire ertesz hozza, szoval kerlek, ne sertodj meg, ha az alapokrol kezdek magyarazni. Elsore tisztaban kell lenned azzal, hogy a PORTA |= 1 << PA0; az pontosan mit is csinal. A legfontosabb dolog, hogy ertsd a memoria fogalmat, a valtozok tarolasat es a memorai cimeket.
A PORTA az egy kozonseges 'volatile unsigned char' valtozo, aminek a memoria cime fix. Megpedig annyi, amelyik cimen az AVR-edben a PORTA regiszter van. Amikor egy valtozonak erteket adsz (pl. PORTA = 3), akkor a programod a memoraiba leteszi az erteket. Hogy a memoriaban hova teszi, azt a valtozo neve adja meg. A nevhez tartozo memoriacimet a C fordito vagy a linker tudja, attol fuggoen, hogy a valtozot hogyan deklaraltak. A te problemadra az egyik lehetseges megoldas, hogy a tombbe a megvaltoztatni kivant valtozok cimet tarolod el. Ez a topic nem pont a C programozas alapjai, es amugy is kicsit hosszabb lenne a teljes magyarazat, de par sorban megprobalom a lenyeget leirni:
Ezert aztan neked az arrayp[] tombbe a PORTA es PORTB valtozok cimet kell tarolnod, hogy utana hivatkozni tudj ja: const volatile char * arrayp[] = {&PORTA, &PORTB}; Hivatkozni meg a '*' operatorral tudsz rajuk, azaz: *arrayp[i] |= xx; A const es volatile egy masik kerdes, abba most ne meruljunk bele. A te peldadban az arrayr nem kell volatile legyen. Csak feleslegesen noveli a kodot.
Köszönöm, nagyon sokat segített a részletes magyarázatod.
Sajnos azt kell mondjam, hogy nekünk tanították a c++ programozást, de akkor sajnos csak púpnak éreztem a hátamon. Most, hogy szükségem lenne rá, nehezebb felvenni a ritmust. Keresni fogok hozzá tananyagot a neten, hogy jobban megértsem, mert úgy érzem, ha csak lemásolom a kész megoldásokat, azzal nem leszek előrébb. Meg is kell értsem.
Elegánsak a közzétett C kódok,de tartok tőle,hogy a fordító nem értékeli és lesz körítés rendesen,amíg a megoldásig,a 6db SBI utasításig eljut assembly-ben
Sziasztok! Egy éve építettem meg Topi dallam csengőjét, jól működik . Gondoltam hogy a dallamokat lecserélem. Avr studioval próbálkoztam de ezt a hiba üzenetet dobta ki, mit nem csináltam jól?
Build started 23.6.2014 at 21:17:14 avr-gcc.exe -mmcu=attiny45 -Wall -gdwarf-2 -DF_CPU=8000000UL -O0 -fsigned-char -MD -MP -MT csengo.o -MF dep/csengo.o.d -c ../csengo.c In file included from ../csengo.c:16: ../global.h:7:1: warning: "F_CPU" redefined <command-line>: warning: this is the location of the previous definition In file included from ../csengo.c:19: c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:90:3: warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed" ../csengo.c: In function 'm_delay_ms': ../csengo.c:35: error: 'for' loop initial declaration used outside C99 mode make: *** [csengo.o] Error 1 Build failed with 1 errors and 3 warnings...
Van a szabványos C és a nem szabványos C. Amit te csináltál az nem szabványos, ezért nem fordul.
Nem szabványos (C++ féle):
Szabványos:
A C99 szabvany, ami kb. 15 éves megengedi a for-on beluli deklaraciot. A hibauzenet eppen azt mondja, hogy a for-ban deklaracio van, de nem C99 modban van a fordito. Talan
a -std=gnu99 opcio eppen erre valo. Azon felul egy -Os maris ket warning-ot megszuntetne. Meg le kellene venni a -DF_CPU... opciot is, es akkor az utolso warning is eltunne. Szerintem a gond az, hogy a regi projektet nem ugyanazokkal a beallitasokkal probalja leforditani zolek forumtars.
Egy ujabb kérdésem lenne.
Egy kimenetre jo volna egyszerü modon szimmetrikus impulzusokat kiadni. Az IRQ lépteti a kodot, és ha feltételek teljesülnek akkor állitodik a kimenet bitje (set). Jo volna ugyanebben rutinban vissza is állitani a portot. De ha egyszerüen cbi-t használok akkor nagyon rövid az impulzus. Idözités nem használhato mert a frekvencia változik. Gondoltam a komplemensre csak nem tudom pontosan hogyan is kellene ezt használni. Kösz a segitséget. ( ha lehet ASM-ben)
Esetleg,ha kódot mellékelnél.1-es komplemensre gondolsz?Mert az az egész byte-ot negálja,nem jó irány.
Köszönöm a segítséget mind a kettőtöknek. Sikerült .
Valahogyan igy néz ki (a többi része már ugy ahogy megy). Szoval ha teljesülnek a feltétételek az IRQ többek között ezt hivja le:
Lehivhatom persze a következö IRQ-vel, de akkor változnak a feltételek.
Jó megoldás lehet, ha soros diódával le van választva az AVR tápja, a dióda után pedig kap egy nagyobb, 470µF-100µF kondit (fogyasztástól függően). Ilyenkor ha leesik a táp, az AVR tápjával nem történik semmi, mert a kondiból nem tud a dióda miatt áram visszafelé folyni.
Bocs,de ha megadsz egy halom macro hívást,gondolod,hogy bárki is hozzá tud szólni azok ismerete nélkül ?
Sziasztok ezt az AVR Dopert lehet használni Windows 8 alatt is? Sajnos WIN8 - hoz nem találtam drivert .
A hozzászólás módosítva: Jún 25, 2014
|
Bejelentkezés
Hirdetés |