Hallo! Grüble seit langem an folgendem Problem und hoffe hier kann mir jemand helfen... Ich habe folgenden Quelltext um eine 3*3 LED Matrix anzusteuern: #include <avr/io.h> #include <stdint.h> void Pset(uint8_t x, uint8_t y); uint8_t xpos; uint8_t ypos; int main(void) { DDRD = 0xFF; ypos= 2; xpos = 2; Pset(xpos,ypos); while(1){ } return 0; } void Pset(uint8_t x, uint8_t y) { uint8_t z; z = 0b00111000; //Bei dieser Bit-Konfiguration sind alle Leds aus z |= (1<< y); z ^= (1<< (x+3)); PORTD = z; } Alledings werden die Berechnungen in der Funktion Pset komplett falsch:( z |= (1<< y); // 0<y<3 Hierdurch soll Bit0-Bit2 anktiviert werden z ^= (1<< (x+3)); Hierdurch Bit 3-5 deaktiviert. Irgenwie funktioniert das ganze aber gar nicht... wenn ich einfach PORTD = 0b00101010 schreibe (Bit 4 deaktiviert, Bit 1 aktiviert) geht das gewünscht Led an, mit meiner funktion nicht.... Danke schon einmal!
Über das Setzen und Löschen von Bits steht was im Artikel Bitmanipulation. Ich denke, du benutzt mit XOR (^) den falschen Bitoperator zum löschen. Man nimmt da ein UND des NEGIERTEN Wertes. Deine Aufgabenstellung habe ich nicht verstanden. Mir fehlt der Zusammenhang zwischen dem xpos, ypos und dem was zu setzen und was zu löschen ist. Die einzige grobe Idee kommt aus der Beschreibung von z; Rein intuitiv hätte ich aus dem Namen Pset geschlossen, dass diese Funktion einen Punkt in der Matrix anschaltet und dass die beiden Parameter die Zeile und die Spalte angeben. Eine Pclear Funktion könnte dann entsprechend einen Punkt löschen. Für diesen Fall hätte ich die Funktionen so geschrieben:
1 | void Pset(uint8_t x, uint8_t y); |
2 | void Pclear(uint8_t x, uint8_t y); |
3 | |
4 | void Pset(uint8_t x, uint8_t y) |
5 | {
|
6 | uint8_t z = PORTD; |
7 | z &= ~(1 << (x+3)); |
8 | z |= (1 << y); |
9 | PORTD = z; |
10 | }
|
11 | |
12 | void Pclear(uint8_t x, uint8_t y) |
13 | {
|
14 | uint8_t z = PORTD; |
15 | z |= (1 << (x+3)); |
16 | z &= ~(1 << y); |
17 | PORTD = z; |
18 | }
|
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.