Hallo
Nochmals danke. Der Aufruf in main() war auch das, was mir seltsam vorkam, weil hier die Initialisierung ja schon gelaufen ist. Mit dem Löschen des MCUSR-Registers sieht's dann so aus:
Ich werde die zwei Zeilen mal einbauen und hoffe, dass ich nun keine Kontroller mehr töte.
Gruß
mic
[Edit]
Code:
cam.elf: file format elf32-avr
Disassembly of section .text:
00000000 <__vectors>:
0: 12 c0 rjmp .+36 ; 0x26 <__ctors_end>
2: 28 c0 rjmp .+80 ; 0x54 <__bad_interrupt>
4: 27 c0 rjmp .+78 ; 0x54 <__bad_interrupt>
6: db c1 rjmp .+950 ; 0x3be <__vector_3>
8: fd c1 rjmp .+1018 ; 0x404 <__vector_4>
a: 24 c0 rjmp .+72 ; 0x54 <__bad_interrupt>
c: 23 c0 rjmp .+70 ; 0x54 <__bad_interrupt>
e: 22 c0 rjmp .+68 ; 0x54 <__bad_interrupt>
10: 21 c0 rjmp .+66 ; 0x54 <__bad_interrupt>
12: 20 c0 rjmp .+64 ; 0x54 <__bad_interrupt>
14: 1f c0 rjmp .+62 ; 0x54 <__bad_interrupt>
16: 1e c0 rjmp .+60 ; 0x54 <__bad_interrupt>
18: 1d c0 rjmp .+58 ; 0x54 <__bad_interrupt>
1a: 1c c0 rjmp .+56 ; 0x54 <__bad_interrupt>
1c: 1b c0 rjmp .+54 ; 0x54 <__bad_interrupt>
1e: 1a c0 rjmp .+52 ; 0x54 <__bad_interrupt>
20: 19 c0 rjmp .+50 ; 0x54 <__bad_interrupt>
22: 18 c0 rjmp .+48 ; 0x54 <__bad_interrupt>
24: 17 c0 rjmp .+46 ; 0x54 <__bad_interrupt>
00000026 <__ctors_end>:
26: 11 24 eor r1, r1
28: 1f be out 0x3f, r1 ; 63
2a: cf e5 ldi r28, 0x5F ; 95
2c: d4 e0 ldi r29, 0x04 ; 4
2e: de bf out 0x3e, r29 ; 62
30: cd bf out 0x3d, r28 ; 61
00000032 <kill_WD>:
}
// WatchDog beim Initialisieren ausschalten
// https://www.roboternetz.de/phpBB2/vi...=531597#531597
void kill_WD(void) __attribute__((naked)) __attribute__((section(".init3")));
void kill_WD(void) { MCUSR = 0; wdt_disable(); }
32: 14 be out 0x34, r1 ; 52
r1 hat nach eor r1, r1 null als Inhalt und wird an 0x34 ausgegeben. Das ist allerdings (beim Mega8) die Adresse des MCUCSR-Register. Aber ich nehme mal an, das ist richtig so ;)
Auf jeden Fall steht es recht weit vorne im Programm. Nach dem Initialisieren des SREG (0x3F) und dem Stackpointer (0x3E/3D) wird das MCUCSR gelöscht. Echt spitze :)
Lesezeichen