www.mikrocontroller.net

Forum: Compiler & IDEs globale Variablen


Autor: Thomas (Gast)
Datum:

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

Autor: Joerg Wunsch (Gast)
Datum:

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

Gleich die erste...

Autor: Thomas (Gast)
Datum:

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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
(& | ^).

Autor: Thomas (Gast)
Datum:

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

Autor: Joerg Wunsch (Gast)
Datum:

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

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.