Jetzt liest du dir deine Fragestellung nochmal in Ruhe durch. Und dann
erklärst du mir doch bitte, wie ich bei meinem Ethernet-zu-DMX-Wandler
die Versorgungsspannung zu IC4 am besten route, ohne eine zweite
Platinenlage anfangen zu müssen...
LED!
Das heißt mein "Display" besteht aus stinknormalen LED's.
1
#define WIDTH 12 /* Breite des Displays */
2
#define HEIGHT 10 /* Höhe des Displays */
3
4
#define ClearPixel(x,y) leds[y]&=~(1<<x) /* Makro: Ein "Pixel" löschen */
5
6
uint8_txclear;
7
uint8_tyclear;
8
9
for(xclear=0;xclear<WIDTH;xclear++)
10
{
11
for(yclear=0;yclear<HEIGHT;yclear++)
12
{
13
ClearPixel(xclear,yclear);
14
}
15
ClearPixel(xclear,yclear);
16
}
>Dein Display hat doch nur 10 Zeilen
Stimmt auch wieder. Mein Fehler. Ich meinte natürlich:
Die Schleife läuft nur bis Spalte Nr. 10
Die letzten beiden Pixelreihen bleiben immer übrig.
Manfred W. schrieb:
> LED!> Das heißt mein "Display" besteht aus stinknormalen LED's.>> [c]> #define WIDTH 12 /* Breite des Displays */> #define HEIGHT 10 /* Höhe des Displays */>> #define ClearPixel(x,y) leds[y]&=~(1<<x) /* Makro: Ein "Pixel" löschen> */
...
Also ich wuerde es einfach so machen:
memset(&leds, 0, sizeof(leds));
> memset(&leds, 0, sizeof(leds));
Dazu muss aber der "Inhalt" des Displays an die Speicherstelle &leds
gemappt sein. Wenn das Display per I2C läuft oder z.B. ein HD44780 wäre,
dann gehts wieder nicht.
WIE die Leds angeschlossen sind, weiss von uns auch noch keiner.
memset geht da nicht und du bist mit deinem Code schon mal sehr nah
dran, das Prinzip stimmt. Schau dir am besten mal an was bei rauskommt
wenn du die Werte von WIDTH und HEIGHT vertauschst. Wurde schonmal
gesagt, kam aber noch keine Antwort dazu von dir.
Nils S. schrieb:
>> memset(&leds, 0, sizeof(leds));> Dazu muss aber der "Inhalt" des Displays an die Speicherstelle &leds> gemappt sein.
Genauso, wie für das Makro, das Manfred W. in seinem Code benutzt.
Manfred W. schrieb:
>> memset(&leds, 0, sizeof(leds));>> Als definition, oder wie genau?
Definition? Das ist ein Funktionsaufruf.
Ich vermute der Fehler liegt in dem ClearPixel Makro.
Einfach mal ein Pixel direkt mit ClearPixel(11,1) löschen und probieren
ob das geht.
Das zweite ClearPixel ist wirklich unnötig.
Manfred W. schrieb:
> ClearPixel(xclear,yclear);
Kann es sein, dass Du ClearPixel zwei Parameter übergibst aber intern
nur einen Parameter für beide Richtungen benutzt?
Zeig doch mal den Code von ClearPixel.
PS.
Zeig nicht alle Infos auf einmal - so bleibt es länger spannend.
Gruß bix
bix schrieb:
> Manfred W. schrieb:>> ClearPixel(xclear,yclear);>> Kann es sein, dass Du ClearPixel zwei Parameter übergibst aber intern> nur einen Parameter für beide Richtungen benutzt?>> Zeig doch mal den Code von ClearPixel.
hat er doch schon.
das ist ein Makro, was ein bit in einem Array aus (hoffentlich)
wenigstens 16bit ints löscht.
die genaue definition von leds würde mich aber auch interessieren.
prinzipiell würde ich _mb aber zustimmen.
memset ist wahrscheinlich am effizeintesten.
Andererseits sehe ich auch keinen grund, warum der Code nicht
funktionieren sollte.
Das einzige, was ich mir vorstellen könnte, ist, das leds nicht Zeilen,
sondern Spalten enthält
Manfred W. schrieb:
> Michael Buesch schrieb:>> Also ich wuerde es einfach so machen:>>>>>>>> memset(&leds, 0, sizeof(leds));>> Als definition, oder wie genau?
??
memset(leds, 0, sizeof(leds)) setzt alle bits in deinem "leds" array auf
0.
Das willst du doch, oder? Zumindest interpretiere ich so dein clearpixel
macro. Also einfach anstatt der zwei for-loops ein memset aufrufen.
Vlad Tepesch schrieb:
> Das einzige, was ich mir vorstellen könnte, ist, das leds nicht Zeilen,> sondern Spalten enthält
bingo,
dann ist dein Makro aber auch falsch definiert (Parameter-bezeichenr
vertauscht).
hättest du von anfang an die definition von ClearPixel und leds gegeben,
wär das ganze schneller gegangen.
aber warum jedes bit einzeln löschen?
1
for(xclear=0;xclear<WIDTH;xclear++)
2
{
3
leds[xclear]=0;
4
}
schleifen rückwärts zählen ist auch effizenter.
(kA, ob der kompiler das in diesem Fall automatisch drehen würde, glaube
nicht)
Manfred W. schrieb:
> Ich habs jetzt testweise mal verdreht:>>
1
>for(yclear=0;yclear<HEIGHT;yclear++)
2
>{
3
>for(xclear=0;xclear<WIDTH;xclear++)
4
>{
5
>ClearPixel(yclear,xclear);
6
>}
7
>}
8
>
> Ich bilde mir ein es funktioniert so.> Zumindest macht es das was es soll.
OK, dann hasst du vorher auch nur die falschen Parameter an ClearPixel
übergeben.
Eigentlich sollte es egal sein ob Zeilen- oder Spaltenweise das Display
löscht.
Nils S. schrieb:
>>Mit x variabel findet ein AVR das übrigens richtig geil und konstruiert>>dir jedes Mal eine Schleife :-)>> Hä?
Ein ATmega8-AU hat keinen Barrel-Shifter.