mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega16 und Bitfelder


Autor: Greenhorn (Gast)
Datum:

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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Greenhorn (Gast)
Datum:

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

Autor: Falk (Gast)
Datum:

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


Autor: Greenhorn (Gast)
Datum:

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

Autor: Gast (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Greenhorn (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> wo eine Erklärung für diesen C-Code steht

Eigentlich in jedem Grundlagenbuch über C

"Kernighan & Ritchie, Programmieren in C"

Autor: Gast (Gast)
Datum:

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

:-)

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.