AVR springt aus Subroutine ins Nirvana

Gast #5620364
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren