Hallo
Ich arbeite gerade im Rahmen meiner Diplomarbeit an den Steuerroutinen
für ein 320x240 FarbLCD. Mittlerweile habe ich schon erfolgreich das
Display initialisiert, kann Pixel gezielt mit der geqünschten Farbe
setzen und mein selbstprogramierter Charactergenerator funktioniert auch
schon wunderbar.
Jetzt arbeite ich gerade an der Funktion zum Zeichnen von Linien nach
dem Schmema Startkoordinate und Endkkoordinate.
Ich verwende dazu einen Bresenheim-Algorythmus ähnlich dem in Wikipedia.
Die Algorythmus funkitionier auch schon fast perfekt.
Ich habe folgendens Problem:
Wenn ich bei eingeschalter Optimierung -0s im Hauptprogramm die
Linienfunktion mehrmals Aufrufe, also zb...
1 | int main()
|
2 | {
|
3 | SSD1906_Clear();
|
4 | SSD1906_Init();
|
5 | SSD1906_DrawLine(10,10,150,150,red);
|
6 | SSD1906_DrawLine(10,20,150,150,red);
|
7 | SSD1906_DrawLine(10,30,150,150,red);
|
8 | SSD1906_DrawLine(10,40,150,150,red);
|
9 | SSD1906_DrawLine(10,50,150,150,red);
|
10 |
|
11 | while(1);
|
12 | return 0;
|
13 | }
|
Am Display werden alle Linien richtig gezeichnet. Das Problem ist das
alle Linien nach der ersten in einer anderen Farbe gezeichnet werden.
Das interressante ist dass bei abgeschalteter Optimierung die Farben
stimmen.
Wo optimiert der Compiler mir was weg???
Den Code habe ich folgendermaßen iplementiert. (ATMEGA168)
1 | void SSD1906_DrawLine(signed int Xstart, signed int Ystart, signed int Xende, signed int Yende, unsigned int FGcolor)
|
2 | {
|
3 | signed int distanzX=0, distanzY=0, incX=0, incY=0, distanz=0, X=0, Y=0, Xerror=0 , Yerror=0;
|
4 | unsigned long pixel=0;
|
5 |
|
6 | //Bestimmung des Entfernungsunterschiede in X- und Y- Richtung
|
7 | distanzX = Xende - Xstart;
|
8 | distanzY = Yende - Ystart;
|
9 |
|
10 | //Bestimmung des Vorzeichens des Imkrementalwerts
|
11 | if(distanzX<0) //Geht X in die negative Richtung?
|
12 | {
|
13 | incX = -1; distanzX = -distanzX;
|
14 | }
|
15 | else incX = distanzX ? 1:0; //0 Wenn 90° oder 270°
|
16 |
|
17 | if(distanzY<0) //Geht X in die negative Richtung?
|
18 | {
|
19 | incY = -1; distanzY = -distanzY;
|
20 | }
|
21 | else incY = distanzY ? 1:0; //0 Wenn 0° oder 180°
|
22 |
|
23 | //Feststellen welche Entfernung größer ist
|
24 | distanz= (distanzX > distanzY) ? distanzX:distanzY;
|
25 |
|
26 | //Intialisierung der Fehlervariablen mit distanz/2
|
27 | X=Xstart; Y=Ystart;
|
28 | Xerror = Yerror = distanz>>1;
|
29 |
|
30 | //Berechnung der PIXEL
|
31 | for(unsigned int i=0; i < distanz; i++)
|
32 | {
|
33 | //pixel berechnen
|
34 | //pixel ausgeben
|
35 | pixel=(unsigned long)153120-Y*(unsigned long)480+X*
|
36 | (unsigned long)2; //SRAM Adresse berechnen
|
37 | SSD1906_SetSRAM(pixel,FGcolor);
|
38 | //Fehlervariablen aktualisieren
|
39 | Xerror += distanzX;
|
40 | Yerror += distanzY;
|
41 |
|
42 | //Fehler auswerten und ggf. reagieren
|
43 | if(Xerror >= distanz)
|
44 | {
|
45 | Xerror -= distanz;
|
46 | X += incX;
|
47 | }
|
48 | if(Yerror >= distanz)
|
49 | {
|
50 | Yerror -= distanz;
|
51 | Y += incY;
|
52 | }
|
53 | }
|
54 | pixel=(unsigned long)153120-Y*(unsigned long)480+X*(unsigned
|
55 | long)2; //SRAM Adresse berechnen
|
56 | SSD1906_SetSRAM(pixel,FGcolor);
|
57 | //pixel berechnen
|
58 | //pixel ausgeben
|
59 |
|
60 | }
|
Ich hoffe ihr konnt mir dabei helfen