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
Ugyan nem a legszebb megoldás, de megnéztem melyik függvény kéri be előbb a fejlécfájlt és a második kérésnél, kitiltom a változó deklaráció beolvasását. Így most minden a helyén van.
Egyelőre marad így... ha valakinek van jobb ötlete, azt várom
Igen, külön-külön fordít, majd utána linkel (mint C fordítók általában). Másképp nehéz lenne elképzelni.
És jól gondoltad, az "include guard"-ok pont erre valók. Nem értem miért problémázik ezen a WinAVR. Lehet ez valamiféle bug, de lehet rosszul értem a problémád. Kódot tudnál mutatni?
Esztetikailag igy szokott kinezni:
vagy kipróbálhatod ezt is:
Sehogyan sem boldogulok az eepromom kiolvasásával asm-ben. Nekifogok megtanulni a c-t. Ha jól értem vannak kész library-k hozzá? Vannak szintaktikai különbségek is (>> ilyenek, meg << ilyenek, stb. ). Van olyan linketek amin el lehet indulni?
Köszönöm a segítséget.
2008.12.05. majd a 2009.03.06. WinAvr is felkerült a helyzet ugyanaz. Kipróbáltam úgy is, hogy egy "c" forráson belül kétszer include-oltam be ugyanazt a fejlécfájlt (#warning-al meg néztem a futások számát). Ekkor az adott fejlécfájl csak egyszer került meghívásra. Amint ez a második hívás egy másik forrásban történik, az "include guard" (köszi a nevét) nem működik. Ezért is lett egyértelmű, hogy külön fordítja a forrásokat, így konyhanyelven amikor elsőnek találkozik a két "include" az "include guard" már nincs ott, mivel már le van fordítva. Biztos vagyok bene, hogy valamilyen módon lehet tájékoztatni a linkert a szándékomról, de erre nem jöttem rá. Mivel lényeges a hordozhatóság is, ezért a headerben deklarált változókat elláttam egy védelemmel, melynek a kifejezése a main fájlban (az első hívást követően) értékelődik hamisra, így a változó deklaráció már nem történik meg újra. megj.: egyébként CodeVision-ban rosszabb volt a helyzet, de az egy másik történet. A "linker option" -ról nincs valakinek anyaga? Milyen kapcsolók vannak és mit jelentenek?
Ugyan nem a reklám helye, de a C/Cpp alapok megszerzéséhez az egyik (szerintem) legjobb könyv a "24 óra alatt" sorozatból a "Tanuljuk meg a C++ programozási nyelvet"
Az MCU adatlapokat továbbra sem kell eldobni, továbbá érdemes beszerezni a fordítód "gépkönyvét".
Olyan nincs hogy nem mukodik, olyan lehet, hogy valamit nem jol irtal meg.
Sziasztok
Szeretnék magamnak építeni egy GPS vevőt úgymond, amivel a modulból érkező adatokat szeretném USB-n számítógépre küldeni. A GPS modul ugye soros adatokat küld. Ezt szeretném átküldeni USB-n a számítógépnek amit szoftveresen formázok. Találtam egy tuti kis projektet, de nem tudom hogy ez kell-e nekem. Ezt ahogy nézem "az RS232-t lefordítja USB-re". Szeretném kérdezni hogy ez így van-e és hogy jó lesz-e erre a feladatra? Köszönöm szépen
Lehet hogy jó lesz ,de a gps hez nem árulnak ilyen kábelt?
Esetleg ha nem akarsz programozni FT232 chip meg szintillesztő .
Ilyen kábelre gondoltál?
Vagy ez a kütyü - amit linkeltem - egy sima USB - RS232 adapter lenne? Jobban szeretném egyébként "itthoni" alkatrészekből megcsinálni. Akkor azt mondod hogy ez jó lesz? Mert csak a GPS modulból jövő szoveget szeretném átvinni USB-n keresztül a számítógépre, amit egy azon futó progival kezelek... A programozást pontosabban mire értetted? Számítógépen futó programra - az nem nagy gond, ígyis úgyis kell - vagy az AVR-en levő programra gondoltál - mert annak megvan a firmware-je.
LCD kijelzőt üzemelnék be, de nem megy.
gtk által készített drivert használnám. AVRStudio-ba létrehoztem új projektet, beálítottam a procit, bemásoltam a 2 simple_driver fájlt és a main-t. Fordításkor az alábbi hibát írja: lásd melléklet Olvastam hogy avrlibc-t használ, rá is kerestem, de nem tudtam meg mi az. Csak mindenféle verziószámmal exe-ket találtam. Lehet ezt kéne feltelepítenem? (winavr már fent van) köszi zoli
Nem vagyok egy zseni, de szerintem a pontosvessző nem kell a kapcsos zárójel elé.
Ha kiveszem akkor 5x ennyi hibaüzenetet kapok...
Ja és ha WinAVR-be csinálom a fordítást akkor jó, beégetés után jól is működik.
Szia!
Szerintem csak a bekarikázott nem kell.....
Így próbáld:
Üdv! megj.: sztem jobb az eepromba tenni mint a flash memóriát tömni vele.
És valóban az volt a ludas... pontosabban az is.
Nekem is az tünt hibásnak, de mikor kivettem sokkal több hibaüzenetet adott. Most kiderült, hogy azért mert nem vettem bele a projekt-be a simple_driver.c fájlt, és panaszkodott a függvényekre. Köszi
Hogyan oldható meg egyszerűen a számok helyiérték szerinti kiírása?
Pontosabban az időt szeretném kiírni LCD-re de amíg 10 alatt vannak a számok kéne elé egy 0. így néz ki pl.:
10 fölött már jó pl.:
A változókat így konvertálom szöveggé:
Úgy meg tudnám csinálni, hogy IF függvénnyel megvizsgálom 10 alatt van-e, és ha igen akkor kiírk egy 0-t, majd utánna a számot. Létezik-e egyszerűbb megoldás?
Hali!
Cben nem vagyok otthon, de egy jótanács. Ha az órákat írod ki, ne rakj ki 0-t ! Ezt hívják nullakioltásnak. Meg kell különböztetned a perceket és órákat. Szerintem sokkal szebben mutat az hogy 9:23, mint 09:23. Nem ? Üdv Kiborg
Igaz... de a percnél már kell a 0 is elé pl.: 9:05
De a fő problémám, hogy az egyes helyi értékű számok a tízes helyi érték helyén vannak amíg a szám kisebb mint 10. Másik ötletem, hogy nem egybe írom ki az órákat, perceket, hanem számjegyenként... talán ez lesz a legegyszerűbb. MOD: valahogy így...
Javaslom átnézni az sprintf fügvényt.
Neked valami lyesmi kéne:
Én ezt ASM ben úgy oldottam meg, hogy eleve BCD kódban számoltam, ahol 8 biten két számot tudtam tárolni és később kijelezni is.
Előnye, hogy a pozíció már eleve rögzítve volt. Kiborg
Sziasztok!
Miért van az, hogy optimalizáció nélkül nem műdökik a következő kód se? egy elég összetett programot írtam, ami nem működött, ezért írtam ezt az egyszerűt, ami csak egy ledet villantana ki, de ez se fut le. Az init(); függvényből nem tér vissza, azaz amit az init(); függvénybe írok (pl ledkivillantás) elvégződik, de amit a main() függvénybe, az init(); után, már nem hajtódik végre. Ugyan ez egyébként a panasz optimalizálva is, de csak sokkal nagyobb programoknál fordul elő. Atmega128-as mikrokontrollert használok. Forráskód:
Köszi előre is a segítséget! Fontos lenne
az include után ott van ami kell, valamiért nem másolta be a fórumba.
(code=c) majd (/code)
Így szurd be a kódot. Nem hiszem, hogy van köze hozzád, de nekem akkor sem akart működni ha a main-be használt függvényeket a main után írtam le. Amint átmásoltam elé... ment is.
Üdv!
Úgy is próbáltam, de úgy se működött. Sajnos. És egyébként úgy próbáltam beilleszteni ahogy mondtad, de lényegtelen hogy nem sikerült berakni, a programba jól van, de mégse működik.
A felhasználd függvényeknek hozd létre a prototípusát, ez tartalmazza a visszatérési érték típusát, a függvény nevét, és a paraméterek típusát. A deklarálást mindig pontosvesszővel le kell zárni.
Pl.: uint8_t _fuggveny_nev(uint8_t); Paraméternév megadása a deklarálásnál nem szükséges, maximum ajánlott. A deklarálást ajánlatos elvégezni a fejlécfájlban, de lehet magában a forrásfájlban is. Szóval ha a függvényeidet előre deklarálod, akkor nem kell figyelni a definiálás sorrendjére (a meghívott függvény akár a meghívó után is állhat). ui.: szögletes zárójel [ code].... |
Bejelentkezés
Hirdetés |