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
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.
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
Hallo, vielen dank für die antworten. Könnte mir jemand einen funkttionierenden Quellcode posten? Ich bekomme es einfach nicht hin. Danke
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!
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 | }
|
wichtig vorher, den Port auch als Ausgang schalten. Dafür das DDR Register entsprechend setzen.
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
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
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.
Hallo!
@rufus
> Und hier wurde nirgendwo erwähnt, um welchen µC es geht.
...siehe Eröffnungspost letzte Zeile.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.