Geziehlt 0 oder 1 in Pin schreiben

Gast #178730
Hallo,

ich möchte eine Zahl parallel an Ports ausgeben. Da aber lediglich 12
bit benötigt werden und die anderen Pins schon belegt sind muss ich
einen kompletten Port und 4 Pins eines anderen Ports beschreiben.
Ich stelle mit das so vor, dass ich einer Methode den Zahlenwert
vorgebe und diese dann entsprechend die Pins aktiviert bzw deaktiviert,
je nachdem ob in der binären Schreibweise der Zahl grad ne 0 oder 1 ist.
An einen ganzen Port kann ich ja die erten 8 Bit direkt übergeben. Mein
Problem sind die 4 Einzelpins. Ich kenne zwar Befehle zum Setzen und
Rücksetzten, bin aber der Meinung, dass es einfacher gehen müsste. Kann
ich Pins evtl zu einer Gruppe zusammenfassen ähnlich wie bei Ports und
dann einfach die fehlenden 4 Bit einfach reinschreiben?

Danke für eure Hilfe.

Gruß

Steffen
Gast
Vielleicht ist mir die Frage nicht klar.
Du möchtest an einem Port ein Nibble ausgeben. Dann löscht du doch
eigentlich dieses Nibble und veroderst mit dem Nibble aus der 12bit
Zahl. Dann schreibst du in den 8bit Port. Das ändert doch die anderen
bits nicht.

Oder verstehe ich das Problem nicht richtig?
Gast
Wenn ich noch wüsste wasn nibble ist ;)
Richtig ich könnte vor dem Schreiben den Pin löschen...und dann den
Wert in der zahl mit dem pin 'verodern' <-- schönes wort :)

Portb&=~(1<<PB4);
portb|=(1<<PB4);

statt der 1 könnte ich dann das bit aus der zahl nehmen?

Ich werd das mal probieren. aber zunächst muss ich dann noch die zahl
in ihre bits trennen oder geht das auch wenn ich einfach die zahl
durchschiebe. also fürs erste bit zahl>>0 fürs zweite zahl>>1 und so
weiter?
Gast
Jau und wenn du das nicht bitweise machst, sondern direkt z.B die
unteren 4bits, das untere Nibble ;-), benutzt hast du das Beispiel von
Michael.
Müsste klappen und keinen Ärger machen
Gast
void
wr12bit(unsigned int val)
{
    /* write bits 0..7 to PORTB: */
    PORTB = (val & 0xFF);

    /* write bits 8..11 to PC0..PC3 */
    PORTC = (PORTC & 0xF0) | ((val & 0x0F00) >> 8);
}

ungetestet weil wenig Zeit, aber sollte so stimmen...
Falls nicht, wird wenigstens das Prinzip sichtbar! :-)
Gast
Jo, die Funktion tut, was sie soll, nur bin ich nicht so sicher, ob es
das ist, was der Frager will.(?)

Er sagt ja "und 4 Pins eines anderen Ports beschreiben"

Meines Erachtens will er einen 8Bit-Wert teilen (2 Nibble) und diese
getrennt auf 2 Ports geben. Im Prinizp sthet alles oben, man muss nur
die Vorhandenen BIts eines Ports retten, die neu zu Setzenden zu Null
maskieren und mit dem zu schreibenden Bits (nach  Positionskorrektur)
verordern. Ganz esay.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 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.