www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Byte an PORTS ausgeben


Autor: anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich möchte gerne ein Wert das als Hexadezimal (0xFF) vorliegt auf 
mehrere Ports ausgeben.

Das Problem ist, dass ich PORTB und PORTC benutzen muss, um 8 -Bits 
auszugeben.

Meine Frage ist:

Wie kann ich Werte die als Hexadezimal(z.B. 0xF4) vorliegen ausgeben, so 
das ich hinterher über 6 Ausgänge vom PORTB und 2 Ausgänge vom PORTC ein 
Byte erhalte?

Controller: ATMEGA 8a

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Programmiersprache?

MfG Spess

Autor: anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Programmiersprache: C

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier kennst du?
http://www.mikrocontroller.net/articles/Bitmanipulation

Entweder frägst du die Bits einzeln ab oder du arbeitest mit ein 
bisschen Shifting (<<, >>) und schiebst dir die Bits hin.

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da gibt es mehrere Möglichkeiten um dies Auszugeben.

z.b. kannst du ein Byte erstellen, das Bit adresierbar ist und
so jedes einzelne Bit an einem Portoutput ausgeben.

Es gibt vielleicht noch einfachere Möglichkeiten oder schönere, aber ich
poste hier mal so ein Beispielprogramm.

unsigned char bdata a; //Das Byte a welches dann Bitadressierbar wird
sbit a0 = a^0; //Das sind die Einzelnen Bit die
sbit a1 = a^1; //du benennen musst
sbit a2 = a^2;
sbit a3 = a^3;
sbit a4 = a^4;
sbit a5 = a^5;
sbit a6 = a^6;
sbit a7 = a^7;

a= 0xc3; //hier speicherst du eine zahl

PORTB_0 = a0; //Hier gibst du die einzelnen Bit an den Ports aus
PORTB_1 = a1;
PORTB_2 = a2;

PORTC_0 = a3;

Ich bin mir jetzt auch nicht zu 100% sicher ob dies funktioniert,
aber es sollte

Autor: anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen dank für die antworten.

Könnte mir jemand einen funkttionierenden Quellcode posten?

Ich bekomme es einfach nicht hin.

Danke

Autor: Rene K. (draconix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Helfer schrieb:
> Da gibt es mehrere Möglichkeiten um dies Auszugeben.
>
> z.b. kannst du ein Byte erstellen, das Bit adresierbar ist und
> so jedes einzelne Bit an einem Portoutput ausgeben.
>
> Es gibt vielleicht noch einfachere Möglichkeiten oder schönere, aber ich
> poste hier mal so ein Beispielprogramm.......

Sehr interessante Sache! Bin auch gerade dabei, nur 4 Pins eines Ports 
anzusprechen, da ich dies aber leider atomar machen kann, ist dies eine 
sehr schöne alternative!

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So z.B. werden die unteren 6 Bit von Port B und die unteren 2 Bit von 
Port C gesetzt. Die nicht benötigten Pins werden nicht verändert.
void SetzeAusgaenge(unsigned char ucData)
{
   PINB = (PINB & 0xC0) | (ucData & 0x3F);
   ucData >>= 6;
   PINC = (PINC & 0xFC) | (ucData & 0x03);
} 

Autor: jonas biensack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wichtig vorher, den Port auch als Ausgang schalten. Dafür das DDR 
Register entsprechend
setzen.

Autor: Rene K. (draconix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian schrieb:
> So z.B. werden die unteren 6 Bit von Port B und die unteren 2 Bit von
> Port C gesetzt. Die nicht benötigten Pins werden nicht verändert.
> void SetzeAusgaenge(unsigned char ucData)
> {
>    PINB = (PINB & 0xC0) | (ucData & 0x3F);
>    ucData >>= 6;
>    PINC = (PINC & 0xFC) | (ucData & 0x03);
> }


Und Vorsicht:

Das ist nicht atomar! Ein Interrupt mit Zugriff auf PortC / PortB kann 
seeeehr ungewollte Folgen haben.

http://www.mikrocontroller.net/articles/Interrupt#...

Autor: anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank!!!

Ihr seid Spitze!

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian schrieb:
> So z.B. werden die unteren 6 Bit von Port B und die unteren 2 Bit von
> Port C gesetzt. Die nicht benötigten Pins werden nicht verändert.
> void SetzeAusgaenge(unsigned char ucData)
> {
>    PINB = (PINB & 0xC0) | (ucData & 0x3F);
>    ucData >>= 6;
>    PINC = (PINC & 0xFC) | (ucData & 0x03);

hab ich da was verpasst?

früher hat man durch schreiben einer 1 auf PINx die Ausgänge getoggelt

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> hab ich da was verpasst?
>
> früher hat man durch schreiben einer 1 auf PINx die Ausgänge getoggelt

Das hängt vom verwendeten µC ab, die verhalten sich da alles andere als 
gleich. Und hier wurde nirgendwo erwähnt, um welchen µC es geht.

Autor: Route_66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
@rufus
> Und hier wurde nirgendwo erwähnt, um welchen µC es geht.

...siehe Eröffnungspost letzte Zeile.

Autor: Rene K. (draconix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann wird dies mit dem PIN Toggeln nicht klappen. Dies funktioniert erst 
mit dem Atmega88 (in der kompatiblen Reihe). Dann macht man es halt mit 
dem PORT Toggeln:
  PORTB = (PORTB & 0xC0) | (ucData & 0x3F);
  ucData >>= 6;
  PORTC = (PORTC & 0xFC) | (ucData & 0x03);

Aber wie gesagt: nicht atomar

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.