Atmel - ATmega16 Mikroprozessor (AVR-GCC)
-
Guten Abend,
zur Zeit wird in der Schule mit Mikroprozessoren rumhantiert. Ich hatte neulich die Aufgabe, nur eine Lampe leuchten zu lassen. Mein Code dazu sah so aus:
#include <avr/io.h> int main() { DDRB = 255; //alle Ports auf Ausgang PORTB = 1 << 7; // letzte Lampe leuchten lassen (hier zu meine Frage) while(1) { } }
Da komischerweiße bei dem Mikroprozessor, welchen wir benutzt haben, die Ports umgedreht sind, sprich low wird zu high und high zu low, leuchten mit 1 << 7 alle Lampe, außer die Letzte. Entweder müsste ich mit dem Windowsrechner von Binär immer in Dezimal rumrechnen, oder folgendes machen
PORTB = (1 << 6) | (1 << 5) | (1 << 4);
Wodurch dann nur die Letzte leuchtet. Das finde ich aber ziemlich hässlig und undynamisch. Wenn ich 30 LEDs habe, kann ich wohl kaum erstmal 30x das Zeug da hinkopieren. Also versuchte ich einfach mal statt die 1 die 0 zunehmen, aber da kommt bei der bitweisen Verschiebung immer 0 raus.
Nochmal kurz und knapp.
Bei 1 << 7 kommt dez 128 raus, womit nur die eine LED leuchten sollte. Da low und high vertauscht ist und ich diesen umständlichen Weg mit (1 << 6) | (1 << 5) | (1 << 4) nehmen muss, frage ich, ob jemandem eine bessere Methode einfällt.
Ich bedanke mich im Voraus.Mit freundlichen Grüßen,
Freaky
-
PORTB = ~(1 << 7);
Die Tilde invertiert Dir das Ergebins von (1 << 7). Aus 128 wird so 127, also genau das was Du willst.
-
Okay vielen dank, ich werde es mal ausprobieren.
-
Schau mal hier bei Asuro in den Code:
http://henkessoft.de/Roboter/ASURO.htmDa findest du viele Beispiele.
... und hier, Bit-Manipulation: http://en.wikipedia.org/wiki/Bit_manipulation