Anfängerproblem.

Gast #711367
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!
Persönliche Seite
Ü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
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.