Forum: Compiler & IDEs Anfängerproblem.


von J.A. (Gast)


Lesenswert?

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!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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