www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Variable in Bitfeld schreiben


Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,

ich möchte, dass eine Variable "wert" den gleichen Inhalt wie ein 
Bitfeld "feld" hat.

Wird das, was ich mir überlegt habe, funktionieren? Und warum nicht? :D
struct
{
  unsigned int bit0    :1;
  unsigned int bit1    :1;
  unsigned int bit2    :1;
  unsigned int bit3    :1;
  unsigned int bit4    :1;
  unsigned int bit5    :1;
  unsigned int bit6    :1;
  unsigned int bit7    :1;
  unsigned int bit8    :1;
  unsigned int bit9    :1;
  unsigned int bit10    :1;
  unsigned int bit11    :1;
  unsigned int bit12    :1;
  unsigned int bit13    :1;
  unsigned int bit14    :1;
  unsigned int bit15    :1;
}  osv_taktmerker;


void osf_fteiler(unsigned int counterval)
{
  // Funktion schreibt Zählervariable counterval
  // in osv_taktmerker
  unsigned int *ptr;

  ptr = &osv_taktmerker;
  *ptr = counterval;
}

Autor: slw (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du muss noch union definieren, dann klappt's auch mit Nachbarnvariable

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich kenne mich mit Unions nicht aus. Kannst Du mir auf die Sprünge 
helfen?

Autor: Markus E. (engelmarkus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja... alles, was in einer union liegt, belegt praktisch denselben 
Platz:
union {
  uint8_t bytes[2];
  uint16_t word;
} bw;

Du kannst jetzt z. B. was reinfüllen: bw.word = 12345;
Und dann auf die Bytes der Zahl einzeln zugreifen: bw.bytes[1] wäre das 
zweite...
D. h. du musst dein struct in eine union zusammen mit einem uint16_t 
packen.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ich kenne mich mit Unions nicht aus. Kannst Du mir auf die Sprünge
>helfen?

Ein C-Buch kaufen oder einfach mal googeln?
Oder die Strukturgeschichte vergessen und Bits
auf die bewährte alte Art und Weise setzen und löschen?

Du sparst dir mit solchen Bitstrukturen weder
Flash noch RAM. Der Compiler macht daraus wieder
nur die UND und ODER Geschichten die du dir sparen möchtest.

Mach es zu Fuß , dann bleibst du fit im Schritt
was logische Verknüpfungen und Bitmanipulationen angeht.

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, ich hab das mal versucht. Bin mir aber bei der Union nicht sicher...
struct
{
  unsigned int bit0    :1;
  unsigned int bit1    :1;
  unsigned int bit2    :1;
  unsigned int bit3    :1;
  unsigned int bit4    :1;
  unsigned int bit5    :1;
  unsigned int bit6    :1;
  unsigned int bit7    :1;
  unsigned int bit8    :1;
  unsigned int bit9    :1;
  unsigned int bit10    :1;
  unsigned int bit11    :1;
  unsigned int bit12    :1;
  unsigned int bit13    :1;
  unsigned int bit14    :1;
  unsigned int bit15    :1;
}  osv_taktmerker;


void osf_fteiler(unsigned int counterval)
{

  
  // Funktion teilt Zählervariable counterval
  // auf das osv_takmerker auf
  
  union
  {
    unsigned int osv_taktmerker[16];
    unsigned int temp;
  } taktmerker;


  taktmerker.temp = counterval;

  

}

Aber jetzt ist osv_taktmerker doppelt vorhanden, oder nicht? Brauche ich 
die Struct nun überhaupt noch? Kann doch mit osv_taktmerker[x] auf die 
Bits zugreifen, oder nicht?!

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber so is besser, oder?!
void osf_fteiler(unsigned int counterval)
{

  
  // Funktion teilt Zählervariable counterval
  // auf das osv_takmerker auf
  
  union
  {
    struct
    {
      unsigned int bit0    :1;
      unsigned int bit1    :1;
      unsigned int bit2    :1;
      unsigned int bit3    :1;
      unsigned int bit4    :1;
      unsigned int bit5    :1;
      unsigned int bit6    :1;
      unsigned int bit7    :1;
      unsigned int bit8    :1;
      unsigned int bit9    :1;
      unsigned int bit10    :1;
      unsigned int bit11    :1;
      unsigned int bit12    :1;
      unsigned int bit13    :1;
      unsigned int bit14    :1;
      unsigned int bit15    :1;
    }  osv_taktmerker;

    unsigned int temp;
  } taktmerker;


  taktmerker.temp = counterval;

  

}

Autor: Kai S. (zigzeg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yepp, so macht man das !

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, nun habe ich das nächste Problem:

Warum kann ich mit
taktmerker.temp++;

den Wert nicht erhöhen?

Autor: I. L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil es nicht in deinem Code steht ;-)


Gruß Knut

Autor: Dennis (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Okay, mal ganz konkret: Code liegt im Anhang.

Steht die Anweisung
 PORTC = osv_clock0.cval0;

in der Funktion ISR_TIMER0_OVERFLOW, funktioniert alles wie es soll und 
auf PORT C wird der Zählwert der Variable ausgegeben.

Steht dieselbe Anweisung in der Endlosschleife des Hauptprogrammes, so 
funktioniert nichts mehr und der Wert auf PORT C bleibt 0x00.

Kurz zum Programm:
STK500.c ist das Hauptprogramm.
OS_ATMEGA32.c wird eine Sammlung von Funktionen, die ich immer brauche 
und mit der ich bestimmte Einstellungen automatisiert vornehmen will, 
indem ich im Hauptprogramm über #define die Funktionen angebe, die ich 
benötige.
Soll nur ein Versuch sein.

Die Aufgabe, die ich im Moment verwirklichen will, ist, dass  auf PORT C 
der Zählwert von osv_clock0.cval0 angezeigt wird. Mehr nicht.
Und wie oben beschrieben funktioniert das nur, wenn die Anweisung in der 
Funktion ISR_TIMER0_OVERFLOW steht.

Warum?

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.