Forum: Compiler & IDEs Bresenham Linienalgorythmus --> Optimierungsfehler


von Christian P. (christian_paier)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

Welcher Compiler?

von Christian P. (christian_paier)


Lesenswert?

Uh sorry vor lauter Text vergessen.

AVR Studio4.4 Build 589 mit WinAVR-20080411.

von Andreas K. (a-k)


Lesenswert?

Christian Paier wrote:

> WinAVR-20080411.

Dachte ich mir's doch. Besorg dir mal die aktuelle Version.

von Norgan (Gast)


Lesenswert?

> AVR Studio4.4 Build 589 mit WinAVR-20080411.

20080411 hat diverse Fehler, auch im Bereich der Optimierung, wenn ich 
mich recht erinnere. Nimm einen neueren oder älteren WinAVR.

von Christian P. (christian_paier)


Lesenswert?

Werde das mal schnell in die Ahnd nehemen...

von Christian P. (christian_paier)


Lesenswert?

Tjaaaa.... wie soll ich sagen... das is jetzt aber peinlich...

IHR HATTET RECHT. Mit WinAVR-20080610 ist alles OK

Der Beitrag war damit  voll umsonst ganz schön schäm

Das kommt davon wenn man nicht up-to-Date ist.

Vielen vielen Dank @Andreas Kaiser & Norgan

Mit freundliche Grüßen
               Christian Paier

von Ralf S. (spacedog) Benutzerseite


Lesenswert?

> Der Beitrag war damit  voll umsonst *ganz schön schäm*
Wieso umsonst? Du hattest ein Problem, das Forum hat dir geholfen und 
viele die mitlesen, wissen nun von den Bugs in WinAVR-20080411.

> Das kommt davon wenn man nicht up-to-Date ist.
Man kann ja nicht immer up-to-date sein. Zwischen den vielen Updates 
möchte man ja gelegentlich auch mal noch schnell was löten oder 
programmieren ;-)

von Matthias L. (Gast)


Lesenswert?

>Zwischen den vielen Updates
>möchte man ja gelegentlich auch mal noch schnell was löten oder
>programmieren ;-)

Sollte das nicht lieber so heißen:
..gelegentlich auch mal noch was löten zum programmieren...?

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.