Byte an PORTS ausgeben

Gast #2087578
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
Gast #2087672
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
#2087862
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!
Gast #2087971
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.
1
void SetzeAusgaenge(unsigned char ucData)
2
{
3
   PINB = (PINB & 0xC0) | (ucData & 0x3F);
4
   ucData >>= 6;
5
   PINC = (PINC & 0xFC) | (ucData & 0x03);
6
}
#2088137
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#Atomarer_Datenzugriff
Gast #2088323
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
#2088755
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:
1
  PORTB = (PORTB & 0xC0) | (ucData & 0x3F);
2
  ucData >>= 6;
3
  PORTC = (PORTC & 0xFC) | (ucData & 0x03);

Aber wie gesagt: nicht atomar

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.