Forum: Mikrocontroller und Digitale Elektronik AVR springt aus Subroutine ins Nirvana


von Harald (Gast)


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

von Falk B. (falk)


Lesenswert?

Dann stimmt was nicht mit dem Stack. Wahrscheinlich ist eine Fuse falsch 
gesetzt. Stichwort M103C Fuse . . .

von (prx) A. K. (prx)


Lesenswert?

Ist der ATmega64A eine Schrumpfversion vom ATmega128? Dann such mal nach 
einer Compatibility-Fuse für einen ATmega103 oder so. Beim 128er ist die 
aktiv und führt zu einem falschen Stackpointer mit exakt diesem 
Fehlerbild.

von Harald (Gast)


Lesenswert?

Danke!
Es war die genannte Fuse.

Gruß,
Harald

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.