Forum: Mikrocontroller und Digitale Elektronik ATMega128: Problem mit Unterprogramm


von Verunsicherter (Gast)


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ß

von Peter II (Gast)


Lesenswert?

Hast du auch dir richte CPU zum Compilern eingestellt?

Man kann auch einfach
1
_delay_ms(5000);

schreiben, das sieht besser lesbar aus.

von klönnich (Gast)


Lesenswert?

Verunsicherter schrieb:
> ich habe mir einen ATMega128 vom Chinesen meines Vertrauens geholt und

Gib ihn zurück und hol ihn dir bei einem Händler, der allgemeines 
Vertrauen genießt. Dann kannst du die µC-HW-Fehlerquelle schon mal 
ausschließen.

von Verunsicherter (Gast)


Lesenswert?

Laut Aufdruck ist es ATMega128A. Den habe ich auch bei Prj. Definition 
eingestellt.
Aber auch wenn ich den ATMega128  auswähle, ändert sich das Ergebnis 
nicht….

von Peter II (Gast)


Lesenswert?

Verunsicherter schrieb:
> Laut Aufdruck ist es ATMega128A. Den habe ich auch bei Prj. Definition
> eingestellt.
> Aber auch wenn ich den ATMega128  auswähle, ändert sich das Ergebnis
> nicht….

was macht der Simulator - geht es dort?

von Peter II (Gast)


Lesenswert?

eventuell an den Fuse rumgespielt?

ATmega103 compatibility mode

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Verunsicherter (Gast)


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!

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.