www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Reset Atmega128


Autor: Michael Schankin (der-mischa)
Datum:

Bewertung
0 lesenswert
nicht 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:
// **********************************************************************************
// includes
// **********************************************************************************
#include <switch_pos.h>
#include <atmel/io.h>
#include <rolling_dir.h>
#include <definitions.h>
#include <mlx_90109.h>
#include <dio.h>


//*************************************************************************
// functions
//*************************************************************************
uint8_t switch_pos_Detect(void);

//*************************************************************************
// variables
//*************************************************************************
uint8_t switch_pos_old = 0x00;
uint8_t switch_pos = 0x00;        //switch position

//*************************************************************************
// detect switch position
//*************************************************************************
uint8_t switch_pos_Detect(void)
  {
  uint8_t dir;      //direction
  uint8_t databyte6;   //relevant databyte for group identification
  uint8_t group;      //group identification
  uint8_t right_header;
  uint8_t tag = GOODTAG;
    
  .
  .
  .
  .
  .
// group one is not allowed to switch position center_right & right
// group two is not allowed to switch position right
  
  //if position center_right is activated group one must not switch
  if ( (switch_pos_old == CENTER_RIGHT) && (group == GROUP1) )
      {
      switch_pos = CENTER_RIGHT;
      }
    
  //if position right is activated group one must not switch
  if ( (switch_pos_old == RIGHT) && (group == GROUP1) )
      {
      switch_pos = RIGHT;
      }
    
  //if position right is activated group two must not switch
  if ( (switch_pos_old == RIGHT) && (group == GROUP2) )
      {
      switch_pos = RIGHT;
      }

    }

  //if there is no tag in the field switch_pos stays switch_pos_old  
  if (tag == NOTAG)
    {
    switch_pos = switch_pos_old;
    tag = GOODTAG;
    }
  
  switch_pos_old = switch_pos;

  return switch_pos;
  }

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Michael Schankin (der-mischa)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Falk (Gast)
Datum:

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

Autor: Michael Schankin (der-mischa)
Datum:

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

Autor: Michael Schankin (der-mischa)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Michael Schankin (der-mischa)
Datum:

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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.