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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Harald (Gast)


Bewertung
0 lesenswert
nicht 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)


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

von (prx) A. K. (prx)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht lesenswert
Danke!
Es war die genannte Fuse.

Gruß,
Harald

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.