Hallo,
ich hab folgenden Code:
| 1 | #define F_CPU 8000000UL
 | 
| 2 | 
 | 
| 3 | #include <avr/io.h>
 | 
| 4 | //#include <util/delay.h>
 | 
| 5 | 
 | 
| 6 | //Makros
 | 
| 7 | 
 | 
| 8 | #define EINGANG    0x00
 | 
| 9 | #define AUSGANG    0xFF
 | 
| 10 | 
 | 
| 11 | 
 | 
| 12 | //Funktionsprototypen
 | 
| 13 | 
 | 
| 14 | void ports_init(void);
 | 
| 15 | void enable(void);
 | 
| 16 | 
 | 
| 17 | //Variablen
 | 
| 18 | 
 | 
| 19 | int n;
 | 
| 20 | 
 | 
| 21 | //Funktionen
 | 
| 22 | 
 | 
| 23 | void ports_init(void)
 | 
| 24 | {
 | 
| 25 |   DDRA = AUSGANG;
 | 
| 26 |   DDRD = EINGANG;
 | 
| 27 | }
 | 
| 28 | 
 | 
| 29 | void enable(void)
 | 
| 30 | {
 | 
| 31 |   PORTA = 0b00000110;
 | 
| 32 | }
 | 
| 33 | 
 | 
| 34 | int main(void)
 | 
| 35 | {
 | 
| 36 |   ports_init();
 | 
| 37 |   //DDRA = AUSGANG;
 | 
| 38 |   //DDRD = AUSGANG;
 | 
| 39 |   enable();
 | 
| 40 |   PORTD = 0xFF;
 | 
| 41 |   
 | 
| 42 |   while(1) 
 | 
| 43 |     {
 | 
| 44 |     }
 | 
| 45 | }
 | 
Und das Problem dazu: Der Prozessor springt nach Abarbeitung von 
ports_init an eine Adresse, in der offenbar kein Coder gespeichert ist.
Ich arbeite mit GCC und Atmel Studio, der Fehler tritt sowohl mit als 
auch ohne Debugger auf. Hardware ist ein Atmega64A mit JTAG, der über 
einen ICE Mark 2 angespochen wird.
Am Ende von ports_init macht der Debuger den Disassembler auf, und da 
steht der PC dann auf irgendeiner Adresse, um die herum es seitenweise 
nur NOPs gibt. Das, was der vorher im Assemblercode steht, sieht so aus:
| 1 |     32: {
 | 
| 2 |     33:   DDRA = AUSGANG;
 | 
| 3 | 0000005A  SER R24    Set Register 
 | 
| 4 | 0000005B  OUT 0x1A,R24    Out to I/O location 
 | 
| 5 |     34:   DDRD = EINGANG;
 | 
| 6 | 0000005C  OUT 0x11,R1    Out to I/O location 
 | 
| 7 | 0000005D  RET     Subroutine return 
 | 
| 8 |     52: {
 | 
| 9 |     53:   ports_init();
 | 
| 10 | 0000005E  CALL 0x0000005A    Call subroutine 
 | 
| 11 |     48:   PORTA = 0b00000110;
 | 
| 12 | 00000060  LDI R24,0x06    Load immediate 
 | 
| 13 | 00000061  OUT 0x1B,R24    Out to I/O location 
 | 
| 14 |     57:   PORTD = 0xFF;
 | 
| 15 | 00000062  SER R24    Set Register 
 | 
| 16 | --- D:\Entwicklung\source\Brenner\Brenner\Debug/.././main.c 
 | 
| 17 | 00000063  OUT 0x12,R24    Out to I/O location 
 | 
| 18 | 00000064  RJMP PC-0x0000    Relative jump 
 | 
| 19 | --- No source file -------------------------------------------------------------
 | 
| 20 | 00000065  CLI     Global Interrupt Disable 
 | 
| 21 | 00000066  RJMP PC-0x0000    Relative jump
 | 
Und zwar geht der falsche Sprung von 05D RET aus.
Mit dem Simulator funktioniert es, auf der Hardware nicht.
Prozessor kaputt? Comiler kaputt? Oder sitzt das Problem vor dem 
Bildschirm?
Gruß,
Harald