www.mikrocontroller.net

Forum: Compiler & IDEs Anfängerproblem.


Autor: J.A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:

void Pset(uint8_t x, uint8_t y);
void Pclear(uint8_t x, uint8_t y);

void Pset(uint8_t x, uint8_t y)
{
  uint8_t z = PORTD;
  z &= ~(1 << (x+3));
  z |= (1 << y);
  PORTD = z;
}

void Pclear(uint8_t x, uint8_t y)
{
  uint8_t z = PORTD;
  z |= (1 << (x+3));
  z &= ~(1 << y);
  PORTD = z;
}


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.