Sziasztok!
Van egy erdekes problema: adott egy ATmega128, egy darab debug leddel (PORTB, 7. biten). (Fejleszto")ko"rnyezet: Debian/wheezy, avr-gcc, avrdude, STK200, /dev/parport. Kovetkezo" tesztprogramot nezzuk:
void blink(void)
{
PORTB ^= 0x80;
}
int main(void)
{
int i;
DDRB=0x80;
PORTB=0x00;
while ( 1 )
{ for ( i=0 ; i<8 ; i++ )
{ _delay_loop_2(0); }
blink();
};
return(0);
}
Ez igy szepen is mukodik, a led villog pont ugyanolyan u"temben, ahogy a delay_loop makro'k szerint azt varjuk (masodpercenkent kb 2-3at, 14.7456-os kvarc mellett).
Namost, ha a programot ke't re't szedju"k, azaz egy main.c modulba a main()-t, es egy blink.c modulba a blink() fuggvenyt, akkor ket dolog lehetseges:
- a fenti formaban a led ma'r nem ugy villog, mas u"temben;
- ha a blink()-et lecsereljuk int blink(void)-ra es a PORTB ^= 0x80; sor utan teszunk me'g egy return(0);-t, akkor _semmit_ nem csinal a program, azaz nem villog a led.
A problemat egy sokkal komplexebb valamibol sikerult ilyen minimalista kodra redukalni, es azalapjan ugy tunik, hogy a modulbol valo visszateres utan/helyett a teljes mikroko'd ujraindul. Mintha kapna egy pofont a kontroller, ha stack-mu"velet van soron.
Latott barki barmi ilyesmit? Van valami, amit erdemes (be)allitgatni ilyenkor? Fuse-bit szeru" dolgokra gondolok, de azok kozott ilyesmit nem talaltam.
Koszi, A.
Hozzászólások
Hm, megoldasra nincs otletem, de nezegetted esetleg a generalt assembly kodot? Hatha kiderul a turpissag...
Azt me'g nem... van me'g egy szepsege a dolognak, hogy egy masik board-on, ugyanugy atmega128-on, gyk 1:1-ben ugyanazzal a kapcs rajzzal meg megy a dolog, rendesen. Ezert is gondoltam az effele fuse bit jellegu" dolgokra, mert az az egyetlen, amiben lehet kulonbseg ilyenkor.
Én annó a linkelést rontottam el. Linkelésnél is meg kell adni a gcc-nek a -mmcu=atmega128 opciót is. Ellenkező esetben rosszul linkeli a kódot.
Imigy forditottam:
Ezt próbáld ki légyszíves még a linkelésnél: -Wl,-Map,ledblink.map
itt mit erdemes ne'zni?
Oke, megoldva, efuse = 0xff volt... az valamiert kimaradt... igy meg 103-compatible modban maradt a cucc, ahol (ezekszerint) nincs stack.
Van valami, amit erdemes (be)allitgatni ilyenkor? Fuse-bit szeru" dolgokra gondolok, de azok kozott ilyesmit nem talaltam.
ATmega64-nel van egy olyan, hogy "ATmega103 compatibility", vagy valami hasonlo nevu FUSE-bit. Ez a 128-ban is megvan, ha jol nezem az adatlapot... Ha ez be van kapcsolva, az pl. azt eredmenyezi, hogy a RAM vege 256 BYTE-tal visszabb kerul. A stack altalaban meg a RAM vegetol indul. Az alap FUSE beallitasnal ez a kompatibilis mod BE van kapcsolva. Egyszer jartam ezzel porul en is... (Hogy nalad ez e a problema, az jo kerdes, de mindenesetre ez erosen szivatos tud lenni.)
Szerk: tul sokaig irtam a hozzaszolast, ezekszerint tenyleg ez volt a gond. M103 modban van stack, csak a RAM "nem er el addig", ameddig a M128 modban.