Forum: Mikrocontroller und Digitale Elektronik Probleme mit Reset Atmega128


von Michael S. (der-mischa)


Lesenswert?

Hallo Leute!

Ich habe folgendes Problem:
Ich habe im Quellcode eine Variable definiert. Diese wird außerhalb der 
main Funktion in einem c-File deklariert. Es handelt sich um die 
Variable switch_pos_old. Nach einem RESET bzw weg- und wieder zuschalten 
der Betriebsspannung behält diese ihren Wert! Das versteh ich nicht. Die 
Variable sollte doch im RAM liegen. Wird der Inhalt vom RAM nicht beim 
RESET gelöscht? Das der Wert im RAm eine gewisse Zeit erhalten bleibt, 
auch ohne Spannung könnte mir auf Grund der Kondensatoren am atmega noch 
einleuchten, aber nach einem RESET? Bitte erklärt mir das mal!
Ein Ausschnitt aus dem File:
1
// **********************************************************************************
2
// includes
3
// **********************************************************************************
4
#include <switch_pos.h>
5
#include <atmel/io.h>
6
#include <rolling_dir.h>
7
#include <definitions.h>
8
#include <mlx_90109.h>
9
#include <dio.h>
10
11
12
//*************************************************************************
13
// functions
14
//*************************************************************************
15
uint8_t switch_pos_Detect(void);
16
17
//*************************************************************************
18
// variables
19
//*************************************************************************
20
uint8_t switch_pos_old = 0x00;
21
uint8_t switch_pos = 0x00;        //switch position
22
23
//*************************************************************************
24
// detect switch position
25
//*************************************************************************
26
uint8_t switch_pos_Detect(void)
27
  {
28
  uint8_t dir;      //direction
29
  uint8_t databyte6;   //relevant databyte for group identification
30
  uint8_t group;      //group identification
31
  uint8_t right_header;
32
  uint8_t tag = GOODTAG;
33
    
34
  .
35
  .
36
  .
37
  .
38
  .
39
// group one is not allowed to switch position center_right & right
40
// group two is not allowed to switch position right
41
  
42
  //if position center_right is activated group one must not switch
43
  if ( (switch_pos_old == CENTER_RIGHT) && (group == GROUP1) )
44
      {
45
      switch_pos = CENTER_RIGHT;
46
      }
47
    
48
  //if position right is activated group one must not switch
49
  if ( (switch_pos_old == RIGHT) && (group == GROUP1) )
50
      {
51
      switch_pos = RIGHT;
52
      }
53
    
54
  //if position right is activated group two must not switch
55
  if ( (switch_pos_old == RIGHT) && (group == GROUP2) )
56
      {
57
      switch_pos = RIGHT;
58
      }
59
60
    }
61
62
  //if there is no tag in the field switch_pos stays switch_pos_old  
63
  if (tag == NOTAG)
64
    {
65
    switch_pos = switch_pos_old;
66
    tag = GOODTAG;
67
    }
68
  
69
  switch_pos_old = switch_pos;
70
71
  return switch_pos;
72
  }

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Das RAM bleibt beim Reset, wie es ist, es sei denn, Dein Compiler (C) 
oder Dein Programm (ASM) löscht es explizit. Nach dem Einschalten ist 
der Inhalt des RAMs undefiniert.

von Karl H. (kbuchegg)


Lesenswert?

> Es handelt sich um die
> Variable switch_pos_old. Nach einem RESET bzw weg- und wieder
> zuschalten der Betriebsspannung behält diese ihren Wert!

Hmm.
Da es sich hier um eine globale Variable handelt, sollte
da eigentlich nicht so sein.
Nach einem Reset bzw. nach anlegen der Spannung läuft die
C Runtime wieder hoch und sollte eigentlich die Initialisierung
machen.

Aus deinem Code Snippet kann man nicht ersehen, wie du feststellst,
dass diese Initialisierung nicht durchgeführt wird.


NB: Du brauchst nicht explizit eine 0 zuweisen. Globale
Variablen werden in C automatisch auf 0 initialisiert sofern
nichts anderes angegeben ist.

von Michael S. (der-mischa)


Lesenswert?

Da fehlt ja auch noch ne Menge Code. Fakt ist aber, das die Variable 
nach dem RESET den selben Wert hat, wie vorher. Das sehe ich an meiner 
Elektronik, und auch mit dem Debugger.
Habe grad eben mal nen anderen atmega129 probiert, und mit dem 
funktionierts so wies soll. Wahrscheinlich hat also der Prozessor einen 
weg. Unverständlich ist es aber trotzdem. Eine Frage stellt sich mir 
trotzdem noch, so rein verständnistechnisch:
Wie läuft eigentlich die Vergabe der adressen für solche Variablen ab?
Wird das durch den Compiler festgelegt? Oder macht das der Controller 
jedesmal wenn er das Programm startet? Kannst du mir mal den ungefähren 
Ablauf bei einer solchen globalen Variable erklären?

von Johannes M. (johnny-m)


Lesenswert?

Michael Schankin wrote:
> Da fehlt ja auch noch ne Menge Code.
Und warum?

> Fakt ist aber, das die Variable
> nach dem RESET den selben Wert hat, wie vorher. Das sehe ich an meiner
> Elektronik, und auch mit dem Debugger.
Strange...

> Habe grad eben mal nen anderen atmega129 probiert,
Ist das der Nachfolger vom Mega128? Kannte ich noch gar nicht... SCNR

> Wie läuft eigentlich die Vergabe der adressen für solche Variablen ab?
> Wird das durch den Compiler festgelegt? Oder macht das der Controller
> jedesmal wenn er das Programm startet? Kannst du mir mal den ungefähren
> Ablauf bei einer solchen globalen Variable erklären?
Für die Platzierung der Daten im Speicher (also das Ersetzen der 
symbolischen Bezeichner durch Speicheradressen) ist der Linker 
zuständig. Im Prinzip fügt der Linker die vom Compiler übersetzten 
Module zu einem lauffähigen Programm zusammen. Im Programmspeicher des 
Controllers stehen schließlich keine Variablen, sondern nur Adressen. 
Und die sind fest, also zur Laufzeit des Programms nicht änderbar.

von Falk (Gast)


Lesenswert?

@ Michael Schankin (der-mischa)

>funktionierts so wies soll. Wahrscheinlich hat also der Prozessor einen
>weg.

Das glaube ich kaum.

>Wie läuft eigentlich die Vergabe der adressen für solche Variablen ab?
>Wird das durch den Compiler festgelegt?

Sicher, von wem sonst.

> Oder macht das der Controller jedesmal wenn er das Programm startet?

Wie soll er das machen? Der COMPILER ist nicht auf dem AVR, er ist auf 
deinem PC. Auf dem AVR ist nur ein klitzekleines 
Initialisierungsprogramm, das die Vaiablem zum Programmstart 
initialisiert (surprise, surprise). Und zwar immer auf die gleichen 
Adressen.

MFG
Falk

von Michael S. (der-mischa)


Lesenswert?

@Johannes M.
Das heißt, wenn das Programm einmal auf dem Controller ist haben die 
Variablen immer die gleichen Adressen im RAM. Also kann es ja sein, dass 
wenn der Inhalt der VAriable stehen bleibt, warum auch immer. Diese bei 
Neustrat des Controllers noch den gleichen wert haben. Oder?

@Falk
Dann erklär mir mal warum es mit dem einen atmega geht und mit dem 
anderen nicht!

Gruß

von Michael S. (der-mischa)


Lesenswert?

@Johannes M.
> Da fehlt ja auch noch ne Menge Code.
> Und warum?


Ich kann ja nicht den ganzen Code hier rein stellen, das liest ja keine 
Sau und hat auch nichts mit dem Problem zu tun.

von Johannes M. (johnny-m)


Lesenswert?

Michael Schankin wrote:
> @Johannes M.
> Das heißt, wenn das Programm einmal auf dem Controller ist haben die
> Variablen immer die gleichen Adressen im RAM.
Richtig.

> Also kann es ja sein, dass
> wenn der Inhalt der VAriable stehen bleibt, warum auch immer. Diese bei
> Neustrat des Controllers noch den gleichen wert haben. Oder?
Normalerweise nicht, da alle globalen Variablen bei Programmstart 
automatisch mit "0" initialisiert werden. Das hat Karl Heinz ja bereits 
angedeutet.

von Michael S. (der-mischa)


Lesenswert?

Dann muss ja aber der atmega defekt sein! Ich versteh nur nicht ganz was 
da defekt sein soll, was solche Effekte hervorruft?

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.