ATMega128: Problem mit Unterprogramm

Gast #4398318
Lesenswert?

Hallo Läute,
ich habe mir einen ATMega128 vom Chinesen meines Vertrauens geholt und 
habe versucht in Betrieb zu nehmen. Den bekannten Anfängerfehler mit 
MOSI/MISO auf dem PortE habe ich rel. schnell gefunden  und behoben. 
Jetzt zeigt der µC komisches verhalten bei Unterprogrammen, nämlich 
scheint die Rückkehradresse immer die von "main" zu sein. D.h. mein 
Programm läuft durch bis zum ersten Aufruf eines Unterprogramms und dann 
fängt es von vorne an…
Hier ist das Programm:
1
 
2
#ifndef F_CPU
3
#define F_CPU 1000000
4
#endif
5

6
#include <avr/io.h>
7
#include <util/delay.h>
8
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
9
uint8_t tuMaBlinken(uint8_t Anzahl){
10
  DDRD = 0b00010000; // PIND4 als Output
11
  for(uint8_t i = 0; i < Anzahl; i++){
12
    PORTD = 0b00010000;// LED an
13
    _delay_ms(500);
14
    PORTD = 0b00000000;// LED aus
15
    _delay_ms(500);
16
  }
17
  _delay_ms(500);
18
  PORTD = 0b00010000;  //LED kurz blinken lassen um das
19
  _delay_ms(100);    // Ende des UProgramms zu markieren
20
  PORTD = 0b00000000;
21
  _delay_ms(500);
22
  return 0;
23
}
24
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25
int main(void)
26
{
27
  // 5s warte...
28
  _delay_ms(500);
29
  _delay_ms(500);
30
  
31
  _delay_ms(500);
32
  _delay_ms(500);
33
  
34
  _delay_ms(500);
35
  _delay_ms(500);
36
  
37
  _delay_ms(500);
38
  _delay_ms(500);
39
  
40
  _delay_ms(500);
41
  _delay_ms(500);
42

43
  //2x blinken
44
  tuMaBlinken(2);
45
  
46
    while(1)
47
    {
48
    //nichts tun
49
    _delay_ms(250);
50
    }
51
}
Ich würde erwarten, dass die LED 2Mal blinkt und dann passiert nichts 
mehr, tatsächlich blinkt die LED 2x (+ ein kurzes), wartet ca. 5s blinkt 
2x, wartet ca.5s usw. Und nun die Frage: habe ich etwas übersehen und 
mache wieder einen Anfängerfehler, oder ist der µC defekt? Hatte schon 
jemand das Problem?

Gruß
#4398334
Lesenswert?

Du hast bei deinem Nagelneuen M128 Prozessor die Fuse M103 nicht 
gelöscht. Dadurch verhält sich der Prozessor wie ein Mega 103. Und bei 
dem ist die Adresslage des Speichers anders. Dadurch liegt der Stack 
nicht im Speicher und daruch gehen returns in die Hose.

Demjenigen, der sich bei Atmel den Unsinn ausgedacht hat, die Mega 128 
so auszuliefern, dass diese Kompatibilitätsfuse ab Werk gesetzt ist, 
sollte man mit dem nassen Fetzen davonjagen.
Gast #4398359
Lesenswert?

Super! Vielen DANK!
Das wird es wohl sein, kann leider nur heute Abend ausprobieren...

Karl H. schrieb:
> Demjenigen, der sich bei Atmel den Unsinn ausgedacht hat, die Mega 128
> so auszuliefern, dass diese Kompatibilitätsfuse ab Werk gesetzt ist,
> sollte man mit dem nassen Fetzen davonjagen.

Wo du Recht hast…

Gruß an Alle!

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