Forum: Compiler & IDEs globale Variablen


von Thomas (Gast)


Lesenswert?

Hallo,

hoffe jemand kann mir helfen!
Ich habe unter WinAVR ein Problem
mit globalen Variablen.

Ich möchte eine if-Anweisung in
Main nur nach Interruptrücksprung
ausführen, dazu benutze ich eine
globale Varibale back die ich
im Interrupt setze.

Mein Problem, weder wird die If-Anweisung
ausgeführt noch steht TCNT1 in timer_wert!
Wenn ich das mit Pointer mache funktionierts!
Das sollte doch ziemlich einfach sein,
was mache ich falsch??????

Danke Thomas,


 #include <avr/io.h>
 #include <avr/signal.h>
 #include <avr/interrupt.h>

 unsigned int timer_wert;
 unsigned char back;

 SIGNAL(SIG_INTERRUPT0)
 {
  back = 0x01;
  timer_wert = TCNT1;
 }


 int main(void)
 {

 unsigned int time;
 sei();
 back = 0x00;
 time = 0;

 while(1)
   {
   if (back == 0x01)    // Nur bei Interruptrücksprung      {
  back = 0x00;              time = timer_wert;
  }
   }
 return 0;
 }

von Joerg Wunsch (Gast)


Lesenswert?

> was mache ich falsch??????

Du hast 5 Fragezeichen zu viel geschrieben. ;-)

Du hast die FAQ nicht gelesen:

http://savannah.nongnu.org/download/avr-libc/doc/avr-libc-user-manual/FAQ.html#FAQ

Gleich die erste...

von Thomas (Gast)


Lesenswert?

Super danke,

hab die FAQ natürlich nicht gelesen. )-:
Allerdings hab ich den TCNT1-Wert trotzdem
nicht in timer_wert stehen!

Vielleicht ne dumme Frage, aber hab ich einen
Vorteil oder worin liegt der Vorteil, wenn ich
die Datentypen aus inttypes.h benutzte.
Lassen sich damit einzelne Bits direkt adressieren?

Ciao Thomas

von Joerg Wunsch (Gast)


Lesenswert?

> Allerdings hab ich den TCNT1-Wert trotzdem nicht in timer_wert
> stehen!

Trotz `volatile', oder was?

Btw., ich weiß ja nicht, was den Interrupt auslöst, aber falls das ein
Taster ist (und nicht etwa ein sauberes Rechtecksignal), mußt Du das
auf jeden Fall noch entprellen.

> ...worin liegt der Vorteil, wenn ich die Datentypen aus inttypes.h
> benutzte.

Darin, daß diese Datentypen im C-Standard vorgesehen sind.  Bessere
Lesbarkeit also auch für jemanden, der bisher mit der Materie nicht
vertraut war, aber sich mit C auskennt.

> Lassen sich damit einzelne Bits direkt adressieren?

Das geht in C schon immer. ;-)

Erstens kann man Bitfelder benutzen, zweitens die bitweisen Operatoren
(& | ^).

von Thomas (Gast)


Lesenswert?

Hatte das Problem schon länger und wußte nicht das es in
den FAQ steht. Das Programm hab ich nur geschrieben um es
zu simulieren, deswegen auch SIG_INTERRUPT0. Hab das
Programm wie du gesagt hast mit volatile ergänzt!
Aber im Debugger von AVRStuio schreibt er den aktuellen
Timerwert immer noch nicht in die Variable.

Jedenfalls Danke nochmal, dachte auch es bring mehr auf
diese Datentypen zu wechseln. Aber so wie ich das
sehe ist es ziemlich egal.

Bitweise Operatoren zum Ausmaskieren sind mir ja klar,
aber was sind Bitfelder?

Ciao Thomas

von Joerg Wunsch (Gast)


Lesenswert?

> Hab das Programm wie du gesagt hast mit volatile ergänzt!  Aber im
> Debugger von AVRStuio schreibt er den aktuellen Timerwert immer noch
> nicht in die Variable.

Traue keiner Simulation, die Du nicht selbst verbrochen hast. ;-)

Nur das `real device' zählt, alles andere nicht.

> Hab das Programm wie du gesagt hast mit volatile ergänzt!  Aber im
> Debugger von AVRStuio schreibt er den aktuellen Timerwert immer noch
> nicht in die Variable.

Traue keiner Simulation, die Du nicht selbst verbrochen hast. ;-)

Nur das `real device' zählt, alles andere nicht.

> Hab das Programm wie du gesagt hast mit volatile ergänzt!  Aber im
> Debugger von AVRStuio schreibt er den aktuellen Timerwert immer noch
> nicht in die Variable.

Traue keiner Simulation, die Du nicht selbst verbrochen hast. ;-)

Nur das `real device' zählt, alles andere nicht.

> ...aber was sind Bitfelder?

struct foo {
  uint8_t b0: 1;
  uint8_t b1_2: 2;
  uint8_t b3: 1;
  uint8_t uppernibble: 4;
};

Allerdings ist die Anordnung der Bits im Byte (oder Wort) vom Standard
nicht definiert und daher compilerabhängig.

Nachtil ist: wenn Du verschiedene Bitfelder eines Worts auf einmal
setzen willst, brauchst Du mehrere Anweisungen.  Wenn die linke Seite
der Zuweisung dann `volatile' ist (wie dies beispielsweise bei allen
IO-Register-Makros der Fall ist), darf der Compiler diese mehreren
Anweisungen auch nicht in eine optimieren.  Daher sind die
Standard-C-Operatoren für Bitmanipulation in der Praxis sehr viel
häufiger benutzt als Bitfelder.

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.