Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
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
Lapozás: OK   109 / 840
(#) Slope válasza Slope hozzászólására (») Márc 9, 2009 /
 
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


(#) tpeter válasza Slope hozzászólására (») Márc 10, 2009 /
 
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?
(#) gtk válasza Slope hozzászólására (») Márc 10, 2009 /
 
Esztetikailag igy szokott kinezni:

  1. #ifndef  __AKARMI_H__
  2. #define __AKARMI_H__
  3.  
  4. #endif
(#) tpeter válasza tpeter hozzászólására (») Márc 10, 2009 /
 
vagy kipróbálhatod ezt is:
  1. #pragma once
(#) fecus hozzászólása Márc 10, 2009 /
 
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?
(#) Slope válasza tpeter hozzászólására (») Márc 10, 2009 /
 
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?
(#) Slope válasza fecus hozzászólására (») Márc 10, 2009 /
 
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".
(#) gtk válasza fecus hozzászólására (») Márc 10, 2009 /
 
Adatlapban vannak asm peldak is.
(#) gtk válasza Slope hozzászólására (») Márc 10, 2009 /
 
Olyan nincs hogy nem mukodik, olyan lehet, hogy valamit nem jol irtal meg.
(#) Slope válasza gtk hozzászólására (») Márc 10, 2009 /
 
Ezen a 3 soron nem sok elrontani való van
(#) vtsoftware hozzászólása Márc 12, 2009 /
 
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
(#) proba válasza vtsoftware hozzászólására (») Márc 13, 2009 /
 
Lehet hogy jó lesz ,de a gps hez nem árulnak ilyen kábelt?
Esetleg ha nem akarsz programozni FT232 chip meg szintillesztő .
(#) vtsoftware válasza proba hozzászólására (») Márc 14, 2009 /
 
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.
(#) vzoole hozzászólása Márc 14, 2009 /
 
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




LCD-hiba.gif
    
(#) Ricsi89 válasza vzoole hozzászólására (») Márc 14, 2009 /
 
Nem vagyok egy zseni, de szerintem a pontosvessző nem kell a kapcsos zárójel elé.
(#) vzoole válasza Ricsi89 hozzászólására (») Márc 14, 2009 /
 
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.
(#) Hp41C válasza vzoole hozzászólására (») Márc 14, 2009 /
 
Szia!

Szerintem csak a bekarikázott nem kell.....

(#) Slope válasza vzoole hozzászólására (») Márc 14, 2009 /
 
Így próbáld:
  1. const uint8_t anim[4][8] PROGMEM = {
  2. { 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00,0x00 },
  3. { 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00,0x00 },
  4. { 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00,0x00 },
  5. { 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00,0x00 }
  6. };


Üdv!
megj.: sztem jobb az eepromba tenni mint a flash memóriát tömni vele.
(#) vzoole válasza Hp41C hozzászólására (») Márc 14, 2009 /
 
É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
(#) vzoole hozzászólása Márc 15, 2009 /
 
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.:
  1. 1 :5 perc

10 fölött már jó pl.:
  1. 12:51perc


A változókat így konvertálom szöveggé:
  1. itoa( min , buffer, 10);
  2. lcd_putstr (buffer, LCD_FIRST_LN_ADDR + 9);
  3.  
  4. itoa( sec , buffer, 10);
  5. lcd_putstr (buffer, LCD_FIRST_LN_ADDR + 12);


Ú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?
(#) kiborg válasza vzoole hozzászólására (») Márc 15, 2009 /
 
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
(#) vzoole válasza kiborg hozzászólására (») Márc 15, 2009 /
 
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...

  1. itoa( min/10 , buffer, 10);
  2. lcd_putstr (buffer, LCD_FIRST_LN_ADDR + 9);
  3.  
  4. itoa( min%10 , buffer, 10);
  5. lcd_putstr (buffer, LCD_FIRST_LN_ADDR + 10);
  6.  
  7. itoa( sec/10 , buffer, 10);
  8. lcd_putstr (buffer, LCD_FIRST_LN_ADDR + 12);
  9.  
  10. itoa( sec%10 , buffer, 10);
  11. lcd_putstr (buffer, LCD_FIRST_LN_ADDR + 13);
(#) ATtiny válasza vzoole hozzászólására (») Márc 15, 2009 / 1
 
Javaslom átnézni az sprintf fügvényt.
Neked valami lyesmi kéne:

  1. sprintf(buffer,"%.2u:%.2u",ora,perc);
(#) vzoole válasza ATtiny hozzászólására (») Márc 15, 2009 /
 
Köszi! ez az ami kell nekem
(#) kiborg válasza vzoole hozzászólására (») Márc 15, 2009 /
 
É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
(#) BlueFox hozzászólása Márc 15, 2009 /
 
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:

  1. #include <avr/io.h>
  2.  
  3. void init(void);
  4.  
  5. int main()
  6. {
  7.         init();
  8.  
  9.         while(1) //ha ez nincs itt, akkor se megy
  10.         {
  11.                 PORTB=0xF0;
  12.         }
  13. }
  14.  
  15. void init()
  16. {
  17.         DDRB=0xF0;
  18. }


Köszi előre is a segítséget! Fontos lenne
(#) BlueFox válasza BlueFox hozzászólására (») Márc 15, 2009 /
 
az include után ott van ami kell, valamiért nem másolta be a fórumba.
(#) vzoole válasza BlueFox hozzászólására (») Márc 15, 2009 /
 
(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.
(#) BlueFox válasza vzoole hozzászólására (») Márc 15, 2009 /
 
Ü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.
(#) Slope válasza vzoole hozzászólására (») Márc 15, 2009 /
 
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]....
Következő: »»   109 / 840
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem