mikrocontroller.net

Forum: Compiler & IDEs Geziehlt 0 oder 1 in Pin schreiben


Autor: Steffen Brüssel (Gast)
Datum:

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

Autor: chrissy (Gast)
Datum:

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

Autor: Michael (ein anderer) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Steffen Brüssel:

In 'C':

PORTx = PORTx & 0xf0 | daten & 0x0f;

Autor: Steffen Brüssel (Gast)
Datum:

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

Autor: chrissy (Gast)
Datum:

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

Autor: OldBug (Gast)
Datum:

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

Autor: Jürgen Schuhmacher (Gast)
Datum:

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

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.