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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.