mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Alle Pixeln eines LED-Displays löschen


Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie lösch ich am einfachsten alle Pixeln eines 12x10 LED Displays?

Ich hätte mir das so gedacht:
        for (xclear=0;xclear<WIDTH;xclear++)
        {
          for (yclear=0;yclear<HEIGHT;yclear++)
          {
            ClearPixel(xclear,yclear);
          }
          ClearPixel(xclear,yclear);
        }
Aber da komme ich ja immer nur bis Zur 10ten Zeile.

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Aber da komme ich ja immer nur bis Zur 10ten Zeile.

Das ist schon sehr gut für ein 2 x 16 LCD.

Autor: Sven P. (haku) Benutzerseite
Datum:

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

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, was fehlt dann an Infos?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähm,
* welches Display?
* welcher Controller?
* welche Anbindung?
* woher kommt ClearPixel?
* WIDTH?
* HEIGHT?
* 'nur bis Zur 10ten Zeile' <-- ?
* Quelltext?

Kurzum: Es fehlt eigentlich alles.

Autor: Oliver J. (helmo2004)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es sein, dass HEIGHT und WIDTH vertauscht sind? (weil ja ein
Wert davon zufällig 10).

Und das zweite clearpixel ist IMHO unnötig.

Autor: Nikos Tsohas (nikos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Display hat doch nur 10 Zeilen.

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LED!
Das heißt mein "Display" besteht aus stinknormalen LED's.
#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 */

  uint8_t xclear;
  uint8_t yclear;

        for (xclear=0;xclear<WIDTH;xclear++)
        {
          for (yclear=0;yclear<HEIGHT;yclear++)
          {
            ClearPixel(xclear,yclear);
          }
          ClearPixel(xclear,yclear);
        }

>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.

Autor: Michael Buesch (mb_)
Datum:

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

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Buesch schrieb:
> Also ich wuerde es einfach so machen:
>
>
>
> memset(&leds, 0, sizeof(leds));

Als definition, oder wie genau?

Autor: Nils S. (kruemeltee) Benutzerseite
Datum:

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

Autor: Oliver J. (helmo2004)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der gesamte Quellcode wäre auch noch interessant.

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nils S. schrieb:
> WIE die Leds angeschlossen sind, weiss von uns auch noch keiner.

So: http://www.elo-web.de/xattachment/0911PingPongSchaltbild.jpg
Es handelt sich dabei um den PingPong Bausatz von Conrad.

Autor: Nils S. (kruemeltee) Benutzerseite
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Nikos Tsohas (nikos)
Datum:

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

Autor: bix (Gast)
Datum:

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

Autor: Oliver J. (helmo2004)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An bix:
Hat er doch schon angegeben.
#define ClearPixel(x,y) leds[y]&=~(1<<x) /* Makro: Ein "Pixel" löschen */

An Manfred W.:
Wie wird das Array leds weiterverarbeitet?

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

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

Autor: Michael Buesch (mb_)
Datum:

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

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs jetzt testweise mal verdreht:
        for (yclear=0;yclear<HEIGHT;yclear++)
            {
              for (xclear=0;xclear<WIDTH;xclear++)
              {
                ClearPixel(yclear,xclear);
              }
            }
Ich bilde mir ein es funktioniert so.
Zumindest macht es das was es soll.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?
for (xclear=0;xclear<WIDTH;xclear++)
{
  leds[xclear] = 0;
}

schleifen rückwärts zählen ist auch effizenter.
(kA, ob der kompiler das in diesem Fall automatisch drehen würde, glaube 
nicht)
xclear = WIDTH;
while(xclear){
  --xclear;
  leds[xclear] = 0;
}

Autor: Nikos Tsohas (nikos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:
> Ich habs jetzt testweise mal verdreht:
>
>
>         for (yclear=0;yclear<HEIGHT;yclear++)
>             {
>               for (xclear=0;xclear<WIDTH;xclear++)
>               {
>                 ClearPixel(yclear,xclear);
>               }
>             }
> 
> 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:
> #define ClearPixel(x,y) leds[y]&=~(1<<x) /* Makro: Ein "Pixel" löschen
> */

Mit x variabel findet ein AVR das übrigens richtig geil und konstruiert 
dir jedes Mal eine Schleife :-)

Autor: Nils S. (kruemeltee) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Mit x variabel findet ein AVR das übrigens richtig geil und konstruiert
>dir jedes Mal eine Schleife :-)

Hä?

Autor: Sven P. (haku) Benutzerseite
Datum:

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

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.