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


von Balesi (Gast)


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)


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)


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)


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)


Lesenswert?

OK, das ist ein Ansatz.

Vielen Dank für den Hinweis.

von Falk B. (falk)


Lesenswert?


von Balesi (Gast)


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. (Gast)


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

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
Noch kein Account? Hier anmelden.