Forum: Mikrocontroller und Digitale Elektronik Wert aus Array auf Portpin legen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Balesi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich programmiere gerade einen Atmel-Controller und arbeite das 
erste mal mit Arrays.

Ich möchte eine LED-Anzeige steuern und habe "Muster" in einem Array 
abgelegt. Dieses Muster möchte ich auslesen und auf die Ausgänge legen.

Jedoch weiß ich nicht, wie ich ein einzelnes Bit des Werts aus dem Array 
auf einen Pin bekomme.

Beispiel:
Array-Wert: 0x 362 --> Binär= 0011 0110 00X0 (X, das Bit, das ausgegeben 
werden soll)


Jetzt habe ich 12 LEDs angeschlossen und jeder LED soll ein Bit aus dem 
Array zugewiesen werden. Wie mache ich das?

Das zweite Bit an LED1:

PORT_LED1 = (PIN_LED1 & (ARRAY[7] & 0x02))???
(PORTB = PB1)

Oder mit Bit schieben?

Schönen Gruß und Dank im vorraus

von Peter D. (peda)


Bewertung
1 lesenswert
nicht lesenswert
Balesi schrieb:
> Jetzt habe ich 12 LEDs angeschlossen

Schließe sie einfach schon in der richtigen Reihenfolge an, z.B.
LED11..8 an PB3..0, LED7..0 an PA7..0.
1
  PORTA = wert & 0xFF;
2
  PORTB = PORTB & 0xF0 | (wert >> 8) & 0x0F;

von Balesi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Herr Dannegger,

ja, das ist ja das Problem.
Die LEDs sind nicht an durchgängigen Ports angeschlossen sondern sind 
teilweise durch andere Belegung unterbrochen.

von Peter D. (peda)


Bewertung
1 lesenswert
nicht lesenswert
Ja dann mußt Du eben umsortieren:
1
  if( wert & 1<<0 ) LED0 = 1; else LED0 = 0;
2
  if( wert & 1<<1 ) LED1 = 1; else LED1 = 0;
3
// usw.
4
  if( wert & 1<<11 ) LED11 = 1; else LED11 = 0;

von Balesi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
OK, das ist ein Ansatz.

Vielen Dank für den Hinweis.

von Falk B. (falk)


Bewertung
0 lesenswert
nicht lesenswert

von Balesi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Falk B. schrieb:
> Siehe Bitmanipulation.

Das ist das Schlüsselwort, das mir bei der Suche fehlte.
Auch dir danke für den Hinweis.

von Stefan ⛄ F. (stefanus)


Bewertung
1 lesenswert
nicht lesenswert
Kann man so machen:
1
#define bitMaske 0b00000010
2
3
PORTB = PORTB & bitMaske | (meinByte & bitMaske);

Eventuell erzeugt die Variante mit if/else jedoch kompakteren 
Maschinen-Code, auch wenn der C-Quelltext komplexer aussieht. Denn sie 
kann dann auf Bit-Befehle zugreifen, für die es in C leider kein 1:1 
Gegenstück gibt.

1
#define bitMaske 0b00000010
2
if (meinByte & bitMaske)
3
{
4
   PORTB |= 0b10000000;
5
}
6
else
7
{
8
    PORTB &= 0b10000000;
9
}

Hier sieht es so aus, als müsste der Prozessort das PORTB Register 
zuerst lesen, dann eine UND bzw ODER Verknüpfung durchführen und dann 
zurück schreiben. In Wirklichkeit mach der Compiler daraus aber simple 
Setze-Bit und Lösche-Bit Befehle, die der Prozessor in einem Takt 
ausführt. Es bleibt also lediglich die Rechnerrei für die if() Bedingung 
übrig.

Anstelle der Bitmasken schreibt man oft auch:

(1<<0) entspricht 0b00000001
(1<<7) entspricht 0b10000000

: Bearbeitet durch User

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]
  • [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.