mikrocontroller.net

Forum: Compiler & IDEs Problem mit volatile Variablen


Autor: Thomas P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe ein Problem mit einer volatile Variable die im Unterprogramm
stets Null ist!

main.c
volatile uint8_t mysreg = 0;

int main(void)
{
  mysreg |= (1 << 0); //BIT 0 setzen

  {..
  //zyklischer aufruf von testfunk...
  testfunk();  
  }..
  return 0;
}

main.h
extern volatile uint8_t mysreg;

test.c
void testfunk()
{
  if(mysreg & (1 << 0))
  {
  //mache irgendewas
  portd |= 0b00010000;
  }
}

Die testfunk wird wie geschrieben zyklisch aufgerufen. Jedoch hat das
mysreg in der testfunk stets den Wert 0!
Wie kann das sein? In der test.c ist selbstverständlich die main.h
includiert, so dass die Variable mysreg bekannt ist!
mysreg wird nirgends anders gelöscht; lediglich in einer
Interrupt-Funktion (Timer-Overflow) wird das zweite BIT getoggelt. Das
kann ich dann auch in der main-Funktion auswerten - aber nicht mehr in
der testfunk! -> kurz und knapp, ausserhalb main.c ist die Variable
mysreg ungleich der Variable mysreg in main.c !

Vlt. hat jemand einen Hinweis für mich.

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Endlosschleife in main fehlt.

MW

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
{..
//zyklischer aufruf von testfunk...  testfunk();
}..


ich hätte jetzt erwartet die Endlosschleife würde sich in den Punkten
verstecken ;-)

Autor: Thomas P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja!

So ist das...
..
while(1)
{
//...
testfunk();
fwait(1000);
}
..

Und diese Endlosschleife steckt hinter den Punkten ;-) Bitte sagt jetzt
nicht, dass euch noch fwait fehlt :-( Das ist eine Verzögerungsfunktion,
die hier lediglich 1000ms wartet!

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach doch bitte mal ein komplettes Program fertig.
So dass wir es per Copy&Paste in unsere Entwicklungsumgebungen
übernehmen können und uns dort mal anschauen können was
da los ist.

Autor: Thomas P. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also

Anbei mein komplettes Projekt.

es geht um "ui_dcfsreg" - diese Variable ist in Funktionen von
dcf77.c stets Null!

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ich nicht bestätigen.

Wenn ich das ganze durch den Simulator jage (ist etwas
schwierig da ich nicht deine Hardware habe. Ein eigenes
Testprogramm nur zu diesem Problem wäre besser gewesen),
dann verhält sich das Teil so wie es soll: Wenn im
SIG_INTERUPT0 ui_dcfsreg verändert wird, so kann ich die
Änderung beim nächsten Aufruf von dcf77_out sehen.
Das ist auch ok so, da mir der Debugger zeigt, dass es sich
um ein und dieselbe Variable handelt, da in beiden Fällen
dieselbe Speicheradresse für ui_dcfsreg angegeben wird.

Autor: Thomas P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach meinem Wissen ist die Deklaration in der main.h mit extern auch
richtig, sonst könnte ich nicht in dcf77.c auf die Variable zugreifen.

Wie kann es sein, dass es letztendlich auf der Hardware nicht läuft?
Kann doch eigentlich unmöglich sein...

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nach meinem Wissen ist die Deklaration in der main.h mit extern
> auch richtig, sonst könnte ich nicht in dcf77.c auf die Variable
> zugreifen.

Ja, das ist alles richtig so wie du das gemacht hast.

Dein Problem muss also nach meinem Ermessen wo anders liegen.
Wie hast du überprüft, dass ui_dcfsreg überhaupt jemals
auf 0x01 gesetzt wird?

Autor: Thomas P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich lasse mir das "byte" via USART ausgeben. Direkt dort wo es
beschrieben wird, und dann ein zweites mal in dcf77_out! Dort sind sie
dann unterschiedlich!

Besten Dank für deine Mühen

Autor: Karsten Brandt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Karl Heinz mit seiner Aussage richtig liegt, dass die Variable
korrekt geändert wird, dann hast Du einen Fehler in Deiner Auswertung
oder ein Timing- bzw. Synchronisationsproblem.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn Karl Heinz mit seiner Aussage richtig liegt

Ich kann nur sagen, was ich im Simulator gesehen habe.
Und dort siehts eigentlich gut aus.

> Du einen Fehler in Deiner Auswertung oder ein Timing- bzw.
> Synchronisationsproblem

Wäre eine Möglichkeit.

Ich würde mal mit 2 Leds debuggen. Die eine wird
eingeschaltet wenn im Interrupt die Umschaltung erfolgt,
die andere wenn in der dcf77_out das 1 Bit erkannt wird.

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.