Forum: Mikrocontroller und Digitale Elektronik Variable in Bitfeld schreiben


von Dennis (Gast)


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
1
struct
2
{
3
  unsigned int bit0    :1;
4
  unsigned int bit1    :1;
5
  unsigned int bit2    :1;
6
  unsigned int bit3    :1;
7
  unsigned int bit4    :1;
8
  unsigned int bit5    :1;
9
  unsigned int bit6    :1;
10
  unsigned int bit7    :1;
11
  unsigned int bit8    :1;
12
  unsigned int bit9    :1;
13
  unsigned int bit10    :1;
14
  unsigned int bit11    :1;
15
  unsigned int bit12    :1;
16
  unsigned int bit13    :1;
17
  unsigned int bit14    :1;
18
  unsigned int bit15    :1;
19
}  osv_taktmerker;
20
21
22
void osf_fteiler(unsigned int counterval)
23
{
24
  // Funktion schreibt Zählervariable counterval
25
  // in osv_taktmerker
26
  unsigned int *ptr;
27
28
  ptr = &osv_taktmerker;
29
  *ptr = counterval;
30
}

von slw (Gast)


Lesenswert?

du muss noch union definieren, dann klappt's auch mit Nachbarnvariable

von Dennis (Gast)


Lesenswert?

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

von Markus E. (engelmarkus)


Lesenswert?

Naja... alles, was in einer union liegt, belegt praktisch denselben 
Platz:
1
union {
2
  uint8_t bytes[2];
3
  uint16_t word;
4
} 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.

von holger (Gast)


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.

von Dennis (Gast)


Lesenswert?

So, ich hab das mal versucht. Bin mir aber bei der Union nicht sicher...
1
struct
2
{
3
  unsigned int bit0    :1;
4
  unsigned int bit1    :1;
5
  unsigned int bit2    :1;
6
  unsigned int bit3    :1;
7
  unsigned int bit4    :1;
8
  unsigned int bit5    :1;
9
  unsigned int bit6    :1;
10
  unsigned int bit7    :1;
11
  unsigned int bit8    :1;
12
  unsigned int bit9    :1;
13
  unsigned int bit10    :1;
14
  unsigned int bit11    :1;
15
  unsigned int bit12    :1;
16
  unsigned int bit13    :1;
17
  unsigned int bit14    :1;
18
  unsigned int bit15    :1;
19
}  osv_taktmerker;
20
21
22
void osf_fteiler(unsigned int counterval)
23
{
24
25
  
26
  // Funktion teilt Zählervariable counterval
27
  // auf das osv_takmerker auf
28
  
29
  union
30
  {
31
    unsigned int osv_taktmerker[16];
32
    unsigned int temp;
33
  } taktmerker;
34
35
36
  taktmerker.temp = counterval;
37
38
  
39
40
}

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?!

von Dennis (Gast)


Lesenswert?

Aber so is besser, oder?!
1
void osf_fteiler(unsigned int counterval)
2
{
3
4
  
5
  // Funktion teilt Zählervariable counterval
6
  // auf das osv_takmerker auf
7
  
8
  union
9
  {
10
    struct
11
    {
12
      unsigned int bit0    :1;
13
      unsigned int bit1    :1;
14
      unsigned int bit2    :1;
15
      unsigned int bit3    :1;
16
      unsigned int bit4    :1;
17
      unsigned int bit5    :1;
18
      unsigned int bit6    :1;
19
      unsigned int bit7    :1;
20
      unsigned int bit8    :1;
21
      unsigned int bit9    :1;
22
      unsigned int bit10    :1;
23
      unsigned int bit11    :1;
24
      unsigned int bit12    :1;
25
      unsigned int bit13    :1;
26
      unsigned int bit14    :1;
27
      unsigned int bit15    :1;
28
    }  osv_taktmerker;
29
30
    unsigned int temp;
31
  } taktmerker;
32
33
34
  taktmerker.temp = counterval;
35
36
  
37
38
}

von Kai S. (zigzeg)


Lesenswert?

Yepp, so macht man das !

von Dennis (Gast)


Lesenswert?

ok, nun habe ich das nächste Problem:

Warum kann ich mit
1
taktmerker.temp++;

den Wert nicht erhöhen?

von I. L. (Gast)


Lesenswert?

Weil es nicht in deinem Code steht ;-)


Gruß Knut

von Dennis (Gast)


Angehängte Dateien:

Lesenswert?

Okay, mal ganz konkret: Code liegt im Anhang.

Steht die Anweisung
1
 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?

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.