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
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; |
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.
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; |
Falk B. schrieb: > Siehe Bitmanipulation. Das ist das Schlüsselwort, das mir bei der Suche fehlte. Auch dir danke für den Hinweis.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.