www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme bei der Variabeln Übergabe


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe ein kleines Verständnis Problem bei der Übergabe einer 
Variabeln an eine Array:

Global
char I2C_Senden[8];

Hauptschleife
int main(void) {
   uint8_t Signal1 = 0;
   while(1) {
   ...
   ...


      if (Zeit >= 125) {
         I2C_Senden[0] = Signal1;       // Übergabe
         Signal1 = 0x00;                // zurück setzen
      }

   }
}

Das Signal soll in die Array[0] geschrieben werden, was auch 
funktioniert. So wie ich aber die Variable „Signal1“ wieder zurück 
setze, verschwindet auch der Wert aus der Array[0]. Was mache ich hier 
falsch, bzw. warum wird hier die Array[0] auch mit gelöscht?

LG Jens

Autor: NoLuck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wann genau setzt er denn I2C_Senden[0] zurück?
so wie der Code jetzt aussieht denke ich mal, dass er es beim nächsten 
durchlaufen der While-Schleife das ganze zurücksetzt. Jedoch ist es auch 
nur ein kleiner Teil deines Codes.
Bleibt der Wert erhalten, wenn du nen Breakpoint hinter dem 
Überschreiben der Variable Signal1 setzt?

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> wann genau setzt er denn I2C_Senden[0] zurück?

In dem Augenblick wo ich die Variable lösche. Lösche ich die Variable 
nicht, dann stehen die Werte auch in der Array. Da die Variable aber ab 
einen bestimmten Punkt überläuft, steht auch nur Murks in der Array. Das 
Problem tritt übrigens auch auf wenn ich an stelle der Array eine 
„uint8_t“ verwende.

Ich habe das gesamte Projekt einmal hoch geladen. (erstellt mit 
AVRstudio, WinAVR-20100110 und es soll auf einen ATmega8 laufen)
http://www.pcfilter.de/Hallo1001/Temp/Daten.rar

LG Jens

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

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
>> wann genau setzt er denn I2C_Senden[0] zurück?
>
> In dem Augenblick wo ich die Variable lösche.

Mit Sicherheit nicht.

Dein 'Problem' ist ein ganz anderes
ISR(TIMER0_OVF_vect) {                       // Beginn Timer1 Überlauf
   TCNT0 = vorladen;                         // Timer0 neu vorladen
   Zeit++;                                   // Zeit Zähler +1 (für RS232 Ausgabe)
} 


  while( 1 ) {

    ....

      // --- Tachoimpulse alle 2 Sekunden übergeben ------------------------------------
      if (Zeit >= 125) {                     // wenn 2 Sekunden vergangen sind, dann...

         I2C_Senden[0] = Tacho1;             // Tacho1 an Array übergeben
         I2C_Senden[1] = 2;
         I2C_Senden[2] = 3;
         I2C_Senden[3] = 4;
         I2C_Senden[4] = 5;
         I2C_Senden[5] = 6;
         I2C_Senden[6] = 7;
         I2C_Senden[7] = 8;

         Tacho1 = 0x00;                      // Tacho1 zurück setzen
      }                                      // Ende wenn 2 Sekunden vergangen sind

      .....
  }

Zeit wird nie auf 0 zurückgesetzt, sondern immer nur hochgezählt. Das 
ist ja auch in Ordnung.

Irgendwann wird der Wert in Zeit zu 128 und die Zuweisungen zum Array 
finden statt. Danach setzt du Tacho1 auf 0.
Aber: Zeit bleibt nach wie vor auf 128. Das hißt, die Bedingung Zeit >= 
128 ist im nächsten Durchlauf durch die Hauptschleife schon wieder true 
und wieder laufen die Zuweisungen ab. Nur ist diesmal Tacho1 schon auf 0 
und dann wird natürlich auch I2C_Senden[0] auf 0 gesetzt.


Du musst dir da einen anderen Mechanismus einfallen lassen.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Karl heinz

Danke für die schnelle Antwort. Manchmal sieht man den Baum vor lauter 
Bäumen nicht. Ich habe die „Zeit“ Variable jetzt zurück gesetzt und nun 
läuft alles wunderbar... Danke...

if (Zeit >= 125) {            // wenn 2 Sekunden vergangen sind, dann...
   Zeit = 0x00;               // Reset – Zähler zurück setzen

   I2C_Senden[0] = Tacho1;    // Tacho1 an Array übergeben
   ...
   Tacho1 = 0x00;             // Tacho1 zurück setzen
   ...
}                             // Ende wenn 2 Sekunden vergangen sind

LG Jens

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.