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


von Jens (Gast)


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

von NoLuck (Gast)


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?

von Jens (Gast)


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

von Karl H. (kbuchegg)


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
1
ISR(TIMER0_OVF_vect) {                       // Beginn Timer1 Überlauf
2
   TCNT0 = vorladen;                         // Timer0 neu vorladen
3
   Zeit++;                                   // Zeit Zähler +1 (für RS232 Ausgabe)
4
}

1
  while( 1 ) {
2
3
    ....
4
5
      // --- Tachoimpulse alle 2 Sekunden übergeben ------------------------------------
6
      if (Zeit >= 125) {                     // wenn 2 Sekunden vergangen sind, dann...
7
8
         I2C_Senden[0] = Tacho1;             // Tacho1 an Array übergeben
9
         I2C_Senden[1] = 2;
10
         I2C_Senden[2] = 3;
11
         I2C_Senden[3] = 4;
12
         I2C_Senden[4] = 5;
13
         I2C_Senden[5] = 6;
14
         I2C_Senden[6] = 7;
15
         I2C_Senden[7] = 8;
16
17
         Tacho1 = 0x00;                      // Tacho1 zurück setzen
18
      }                                      // Ende wenn 2 Sekunden vergangen sind
19
20
      .....
21
  }

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.

von Jens (Gast)


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

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.