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
Akkor mar csak szoftveres problema lehet. Ellenorizd, hogy jo orajelrol jar-e az ic, a clkdiv8 fuse ki van-e kapcsolva. Ha ezek is rendben vannak, akkor mar csak a koddal lehet gond. Ha esetleg nem bizol az ic-ben akkor rakj be helyette egy ujat, de szerintem nem ez lessz a gond.
Sziasztok!
Az lenne a kérdésem ha az Atmega8 Timer2-jét fast PWM módba állítom akkor megy a tulcsordulás megszakítás is? Üdvözlettel: Suncorgo
Elvileg mennie kell.
Lehet hogy hülye kérdés, de az adatirány regiszterben az uC Rx lábát bemenetként, a Tx lábat kimenetként kell beállítani ugye ? Én így csináltam...
NAH végre működik ! Baud rate-t kellett levinni nagyon alacsonyra (2400). Nem is gondoltam hogy ilyen kicsi érték kell hozzá. Köszönöm a segítségedet, üdv.
Az erdekes. Nekem FTDI-vel 230400 baudig menni szokott.
Sziasztok!
Sajnos ( mivel még csak kezdő vagyok) nem sokat tudok a programozók fajtájáról. Nemtudom ,hogy melyiknek mi a hátránya,előnye. Például avr dragon, avr jtag, avr doper: HID mód,CDC mód, MK(kettő) (nem találtam római számokat a billentyűzeten ), avr jtag ice, STK 500, STK 200, avr simulator, STK 500 v2 és még rengeteg programozófajtát nem ismerek ,legaláb is,hogy mi köztük a különbség. Előre is köszi!
Sziasztok!
LCD-re szeretnék kiíratni float vagy double számot! A kiírató függvény LCDstring(uint8_t* data, uint8_t byte) alakban várja a paramétereket. Hogyan tudnám átalakítani egy analóg bemenet értékét, hogy itt megjelenjen? A jelenlegi fordítási hibaüzenet 'LCDstring' differ in signedness. Amikor a függvényt átírtam LCDstring(char* data, uint8_t byte) -ra , akkor ez megszűnt, de a kijelzőn ugyanúgy csak egy kérdőjel jelenik meg, mint amikor nem volt átírva.
Ez az a kód ami csak kérdőjelet eredményez. Ha az eredmenyt akarom kiíratni itoa(eredmeny,buffer,10) után szépen kiíródik, de nem ezt szeretném, hanem a tizedes tört alakot! Előre is nagyon köszönöm a segítséget!
A lebegopontossal vigyazni kell. 1. sok helyet foglal. 2 . nincs beforditva alapbol az sprintf-be a lebegopontos tamogatas.
És akkor mit tudok tenni?
Most eljutottam odáig, hogy egy 0.00 megjelenik, de nincs értéke. Miközben az alatta kijelzett itoa(eredmeny,buffer2,10) értéke most éppen 536, aminek éppen 2,61 voltot kellene jelenteni.
Hat kellene kovetkezzen, hogy meg kell keresni az avr-libc dokumentaciojaban pl. hogy milyen libraryt kell beforditani az sprintf-hez. Vagy egesz szamokkal dolgozni, majd a vegen felbontani.
-Wl,-u,vfprintf -lprintf_min
Ennyit találtam. Erre gondolsz? Az előbb már volt 0.00 de azt is elveszítettem. A volt nem adott értéket. Azt hiszem, kezdem elölről. Ezt : -Wl,-u,vfprintf -lprintf_min hová kell beilleszteni? Compiler vagy linker opció? Mert nekem volt már mindkettőben is, mégsem reklamált. Ja, AVR Studio 4.
Valami olyasmi, pontosan nem tudom a lib nevet.Bővebben: Link
Innen vettem én is az ötletet.
Eddig még a legjobb eredmény a 0.00. Hogyan lehetne ennek pontosabb értéket adni? Most kiírja a felső sorban a 0.00-t alatta pedig az 536-ot. Az első a volt a második az eredmeny értéke. A kettőnek összhangban kellene lennie!
Megküzdöttem vele.
Ez kell a linker opciókhoz: -Wl,-u,vfprintf -lprintf_min . A libm.a és a libprint_flt.a fájlokat pedig hozzá kellett adni a "Link with These Objects"-hez a projekt opcióknál. Aztán nem utolsósorban így kellett módosítani a kódot:
És innen már tizedes törtet ír. Csak valóban nagynak tűnik a kód, így írhatom az integeres felbontását máris. Jut eszembe, az adatlap szerint 1024-gyel kell osztani, máshol meg 1023-at láttam. Melyik az igaz? És nem pontos a mérésem sem, van vagy három tized eltérés. Ez mitől lehet?
A gond az volt ,hogy akármilyen ISP frekvrenciát adtam meg mindig kiírta,hogy az órajel 1/4-ed részénél kisebbnek kell lenni,pedig kisebb volt.Az ISP freki :115,2 Khz,az órajel 1Mhz volt.És sajnos még így is kiírta. :no:
Sziasztok!
Egy egyszerű kérdésre keresek választ. Az Mjoy16 nevezetű projectben szereplő USB-s joystickot szeretném megépíteni. Amely ATmega16 -16PI AVR-t használ. Sehol nem találtam megegyező típust. A kérdés az lenne, hogy esetleg tudjátok-e hol tudnám beszerezni vagy ha nem lehetséges akkor helyettesíthető-e valamivel ? Előre is köszönöm válaszotok.
mega16-16PI nincsen csak PU vegu. Valoszinuleg erre gondoltak, de attervezheted AU vegure is (annyi a kulonbseg, hogy TQFP a tokozas es nem DIP). Megfelelo helyettesito meg a mega16A-PU(/AU) is. Realis bolti ara ezeknek kb 1000 Ft.
Sziasztok!
Kísérletezek AVR-el, egész jól megy, most már tudok küldeni karaktereket az AVRnek soros porton, Hála üldözze Fizikus-t örök hála érte. De vajon hogy lehet neki sztringet küldeni? Ilyenkor a záró karakter az ENTER kódja, és a feltolgozást akkor kell elkezdeni amikor megkapja ezt a karaktert? Vagy hogyan kezdjek hozzá? Köszönöm a segítségeteket
Köszönöm válaszod. Ha lesz időm megnézem a két adatlapot és meglátom mire jutok. Ha akadna probléma írok.
Igen, igy celszeru. A buffertulcsordulasra figyelj.
Sziasztok! Hogy tudnem ezt a void-ot úgy megcsinálni, hogy String-et tudjak küldeni uart-on
Tehát mit írjak void UARTKuldSTR( ide ) ? Estleg azt, hogy void UARTKuldSTR( char msg[] ) ? Előre is köszi!
Azert a megoldast ide is kirakhatnad, hatha mast is erdekel (pl engem szemely szerint igen).
Ha nem nagy keres, ezt picit reszletesebben is kifejthetned.
Probaltam fejleszteni egy soros LCD vezerlopanelt, es ott akadtam el, hogy hogyan fogadjak szoveget UART-on, hogyan buffereljem, meddig olvassam be a karaktereket, utana ezekben hogyan keressek adott karaktereket/szamokat, hogyan valasszam szet a kiirando szoveget az LCD parancsoktol stb.. A C tudasom ehez keves. Ezert inkabb (szamomra) erdekesebb projectekbe keztem...
Szerintem:
Kozben rajottem, hogy en is hasznaltam mar egy hasonlot az egyik kodomban:
De maig nem vilagos hogy a C-ben mit jelent a *p, es hogyan tortenik a karakterek indexelese (miert eppen *p++ ?) Ha valaki tud valamilyen jo weboldalt/irodalmat stb, ahol ez erthetoen (lehetoleg peldakkal) le van irva, azt megkoszonnem
A char *p deklarálás p-ből char-ra mutató memóriacímet deklarál. ha *p-t írunk a programban akkor megkapjuk azon a címen szereplő karaktert. Ha a következöt akarjuk megkapni, akkor növeljük a p-t. *(p++).
Viszont a p kezdöcimű karaktertömbként is kezeli a C. tehát p[0] a tömb elsö eleme és megfelel *p-nek. p[1] a tömb második eleme és megfelel jelen esetben *(p+1)-nek. Ha a tömb elemei nagyobbak pl 2byte akkor értelemszerűen hosszabbat kell lépni a következő elemig. Továbbá ha van egy c karakterünk és annak meg akarjuk tudni a memóriacímét akkor használjuk az & jelet p=&c. így *p a c karaktert fogja adni. Kicsit megkavartam. Remélem valamennyire érhető.
Akkor kicsit a karakterláncokról. A karakterláncok valójában char típusú tömbök. A tömb minden eleme egy egy karakter. A karakterlánc végét a karakterlánc lezáró karakter jelzi '\0'.
A karaktertömbünk mindig egy elemmel hosszabb kell legyen mint a valós karakterlánc, hogy legyen hely a karakterlánc vég jelző karakternek.
|
Bejelentkezés
Hirdetés |