Forum: Mikrocontroller und Digitale Elektronik ATmega16 und Bitfelder


von Greenhorn (Gast)


Lesenswert?

Hallo,

ich versuche seit längerem einzelne Bits, festgelegt in einer Struktur, 
auf den Ausgang PORTB  meines ATmega16 zu schreiben.

struct test
           {
           bit_0:1;
           bit_1:1;
           bit_2:1;
           bit_3:5;
         }port;

PORTB=port;

Kann mir jemand den richtigen Weg weisen, da ich schon einiges versucht 
habe. Eine weitere Frage, wäre wie kann ich mit einer selbstdefinierten 
Variable z.B. auf den Speicherbereich des PORTB verweisen kann, um damit 
z.B. port (im obigen Beispiel ) zuzuweisen.

Danke

von johnny.m (Gast)


Lesenswert?


von Greenhorn (Gast)


Lesenswert?

Diesen Teil des Skripts habe ich mir schon durchgelesen. Doch leider 
steht nicht drin, wie ich die einzelen Bitfelder mit PORTB verknüpfen 
kann.

von Falk (Gast)


Lesenswert?

PORTB |= (1<<bitnumber);  // einzelnes Bit setzen
PORTB &= ~(1<<bitnumber);  // einzelnes Bit löschen
PORTB |= bitmask;          // mehrere Bits setzen
PORTB &= ~bitmask;          // mehrere Bits löschen

MfG
Falk


von Greenhorn (Gast)


Lesenswert?


Hallo,

vielen Dank für die bisherigen Antworten.

Ich wollte es so realisieren, das ich zb.

port.bit_0=1 in der obigen Struktur setze... und er mir automatisch das 
Bit0 auf PORTB setzt...

doch irgendwie klappt es bisher nicht ..

von Gast (Gast)


Lesenswert?

Mach doch folgendes :

typedef union
{
  unsigned char ucAll;
  struct
  {
    bit_0:1;
             bit_1:1;
             bit_2:1;
             bit_3:5;
  }Bit;
}typeDeineStruktur;


// Variablen Deklaration
typeDeineStruktur tDeineStruktur;

// Der Zugriff

1. tDeineStruktur.ucAll = 0x?? // Beschreibt das ganze Byte
2. tDeineStruktur.Bit.bit_0 // Beschreibt Bit 0 usw.

Der Zugriff auf den Port könnze so aussehen :

PORTB = tDeineStruktur.ucAll // Setzt PortB komplett

Probiers mal aus :-)

von Karl H. (kbuchegg)


Lesenswert?

Wenn schon, dann muss das so heissen

typedef union
{
  unsigned char ucAll;
  struct
  {
    unsigned char bit_0:1;
    unsigned char bit_1:1;
    unsigned char bit_2:1;
    unsigned char bit_3:5;
  }Bit;
}typeDeineStruktur;


Es ist aber IMHO den Aufwand nicht wirklich wert.

von Greenhorn (Gast)


Lesenswert?

@ Gast:

vielen Danke es klappt.. könntest du mir kurz erklären warum so.. oder 
vielleicht sagen, wo eine Erklärung für diesen C-Code steht..

Vielen Dank

von Karl H. (kbuchegg)


Lesenswert?

> wo eine Erklärung für diesen C-Code steht

Eigentlich in jedem Grundlagenbuch über C

"Kernighan & Ritchie, Programmieren in C"

von Gast (Gast)


Lesenswert?

Hi,
schön das es klappt :-)

u.a. findest Du mehr Info im Buch C für Mikrocontroller von Burkhard 
Mann
(1´ste Auflage : Kapitel Anonyme Strukturen und Union auf Seite 187)

:-)

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.