Forum: Mikrocontroller und Digitale Elektronik Pixel Negierung


von Pixel (Gast)


Lesenswert?

Hallo,

ich hatte vor kurzen schon einmal hier geschrieben.

Display Controller ist der folgende:

UC1698

Glaube aber es ist ein semantisches Problem. Habe jetzt folgende 
Funktionen erfolgreich realisiert:
1
unsigned char shadow_RAM[3840];
2
3
4
void put_pixel(unsigned char zeile, unsigned char spalte) // 1,0
5
{
6
    unsigned char zahl = fmod(spalte,8);
7
    unsigned int hilf = spalte/8;
8
9
    shadow_RAM[hilf + zeile * 240/8] |= bitMask[zahl];
10
11
}
12
13
14
void delete_pixel(unsigned char zeile, unsigned char spalte) // 1,0
15
{
16
    unsigned char zahl = fmod(spalte,8);
17
    unsigned int hilf = spalte/8;
18
19
    shadow_RAM[hilf + zeile * 240/8] &= ~(bitMask[zahl]);
20
21
22
}
23
24
void clear_window(unsigned start_zeile, unsigned start_spalte, unsigned end_zeile, unsigned end_spalte)
25
{
26
    unsigned int i,k;
27
    for(k = start_zeile; k < end_zeile; k++)
28
    {
29
        for(i = start_spalte; i < end_spalte; i++)
30
        {
31
            delete_pixel(k,i);
32
        }
33
    }
34
}

Funktioniert wunderbar. Ich würde jetzt gerne eine Funktion schreiben, 
die den derzeitigen Pixel überprüft und diesen dann negiert:
1
void negiere_pixel(unsigned char zeile, unsigned char spalte) // 1,0
2
{
3
    unsigned char zahl = fmod(spalte,8);
4
    unsigned int hilf = spalte/8;
5
6
    if(shadow_RAM[hilf + zeile * 240/8] & (1 << zahl))
7
        delete_pixel(zeile, spalte);
8
    else
9
        put_pixel(zeile, spalte);
10
11
}
12
13
void negiere_window(unsigned start_zeile, unsigned start_spalte, unsigned end_zeile, unsigned end_spalte)
14
{
15
    unsigned int i,k;
16
    for(k = start_zeile; k < end_zeile; k++)
17
    {
18
        for(i = start_spalte; i < end_spalte; i++)
19
        {
20
            negiere_pixel(k,i);
21
        }
22
    }
23
}

In der negiere_pixel Funktion frage ich das jeweilige Bit ab. Wenn es 
gesetzt ist wird es gelöscht, ansonsten gehe ich davon aus, dass es 
nicht gesetzt ist und setze es.

Was ich jetzt beobachte, wenn ich ein ganzes Fenster negiere, dass immer 
nur die ersten 4 Bits negiert werden und die darauffolgenden nicht.

Sieht jemand wo sich der Fehlerteufel eingeschlichen hat?

Danke

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Völlig unabhängig vom Fehler: Bist Du Dir ganz sicher, daß Du fmod 
benutzen willst?

Hast Du schon mal in Dein C-Buch gesehen, was % macht?

von Pixel (Gast)


Lesenswert?

> Hast Du schon mal in Dein C-Buch gesehen, was % macht?

Ok ist editiert. Danke für den Verbesserungsvorschlag.

Jemand ne Idee wo das eigentliche Problem liegen könnte?

von Luther B. (luther-blissett)


Lesenswert?

Schon mal XOR (^) probiert?
1
void neg_pixel(unsigned char zeile, unsigned char spalte) // 1,0
2
{
3
    unsigned char zahl = spalte % 8;
4
    unsigned int hilf = spalte / 8;
5
6
    shadow_RAM[hilf + zeile * 240/8] ^= bitMask[zahl];
7
}

von Pixel (Gast)


Lesenswert?

Luther B. schrieb:
> Schon mal XOR (^) probiert?void neg_pixel(unsigned char zeile,
> unsigned char spalte) // 1,0
> {
>     unsigned char zahl = spalte % 8;
>     unsigned int hilf = spalte / 8;
>
>     shadow_RAM[hilf + zeile * 240/8] ^= bitMask[zahl];
> }

Ich bin wieder mal dumm.

Wesentlich eleganter und funktioniert tadellos.
Danke.

Verstehe trotzdem nicht 100% warum das vorherige Bsp (auch wenn es sehr 
unschön ist) nicht funzt.

von W.S. (Gast)


Angehängte Dateien:

Lesenswert?

Pixel schrieb:
> UC1698..

Nein, das Problem hat mit dem konkreten Controllertyp nix zu tun.

Du solltest lieber nicht mit void Funktionen wie PutPixel oder 
DeletePixel arbeiten. Schreibe lieber sowas wie
PIXELTYPE Pixel ( int X, int Y, PIXELTYPE Farbe)
und laß diese Funktion einfach den vorherigen Zustand des Pixels 
zurückliefern. Das ist universeller und läßt sich ohne wirkliche 
Strukturänderungen auch auf Displays unterschiedlicher Farbauflösungen 
verwenden. Nee.. nicht die konkrete Funktion, sondern die Headerdatei, 
die die treiberinternen Dinge vom allgemeinen Programm abschirmt.

Guck die mal den angefügten Code an, speziell dort CgPixel_at (...
Dieses Stück Code ist für das Pollinsche Display
"https://www.pollin.de/shop/dt/MTYwOTc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Displays/LCD_Grafikmodul_VG_G120751_1WRNNA.html";
gedacht. Die Details, wo in welchem Byte denn nun das konkrete Pixel zu 
finden ist, mußt du anhand deines konkreten Displays selber festlegen 
und den Code entsprechend anpassen.

W.S.

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.