www.mikrocontroller.net

Forum: Compiler & IDEs Bresenham Linienalgorythmus --> Optimierungsfehler


Autor: Christian Paier (christian_paier)
Datum:

Bewertung
0 lesenswert
nicht 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...
int main()
{
  SSD1906_Clear();
  SSD1906_Init();
  SSD1906_DrawLine(10,10,150,150,red);
  SSD1906_DrawLine(10,20,150,150,red);
  SSD1906_DrawLine(10,30,150,150,red);
  SSD1906_DrawLine(10,40,150,150,red);
  SSD1906_DrawLine(10,50,150,150,red);

  while(1);
  return 0;
}


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)
void SSD1906_DrawLine(signed int Xstart, signed int Ystart, signed int Xende, signed int  Yende, unsigned int FGcolor)
{
  signed int distanzX=0, distanzY=0, incX=0, incY=0, distanz=0, X=0, Y=0, Xerror=0 , Yerror=0;
  unsigned long pixel=0;

  //Bestimmung des Entfernungsunterschiede in X- und Y- Richtung
  distanzX = Xende - Xstart;
  distanzY = Yende - Ystart;

  //Bestimmung des Vorzeichens des Imkrementalwerts
  if(distanzX<0) //Geht X in die negative Richtung?
  {
    incX = -1; distanzX = -distanzX;    
  }
  else incX = distanzX ? 1:0; //0 Wenn 90° oder 270°

  if(distanzY<0) //Geht X in die negative Richtung?
  {
    incY = -1; distanzY = -distanzY;
  }
  else incY = distanzY ? 1:0; //0 Wenn 0° oder 180°

  //Feststellen welche Entfernung größer ist
  distanz= (distanzX > distanzY) ? distanzX:distanzY;

  //Intialisierung der Fehlervariablen mit distanz/2
  X=Xstart; Y=Ystart;
  Xerror = Yerror = distanz>>1;

  //Berechnung der PIXEL  
  for(unsigned int i=0; i < distanz; i++)
  {
    //pixel berechnen
    //pixel ausgeben
    pixel=(unsigned long)153120-Y*(unsigned long)480+X*
                  (unsigned long)2; //SRAM Adresse berechnen
    SSD1906_SetSRAM(pixel,FGcolor);
    //Fehlervariablen aktualisieren
    Xerror += distanzX;
    Yerror += distanzY;

    //Fehler auswerten und ggf. reagieren
    if(Xerror >= distanz)
    {
      Xerror -= distanz;
      X += incX;
    }
    if(Yerror >= distanz)
    {
      Yerror -= distanz;
      Y += incY;
    }
  }
  pixel=(unsigned long)153120-Y*(unsigned long)480+X*(unsigned 
        long)2; //SRAM Adresse berechnen
  SSD1906_SetSRAM(pixel,FGcolor);
  //pixel berechnen
  //pixel ausgeben

}

Ich hoffe ihr konnt mir dabei helfen

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Compiler?

Autor: Christian Paier (christian_paier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uh sorry vor lauter Text vergessen.

AVR Studio4.4 Build 589 mit WinAVR-20080411.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Paier wrote:

> WinAVR-20080411.

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

Autor: Norgan (Gast)
Datum:

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

Autor: Christian Paier (christian_paier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werde das mal schnell in die Ahnd nehemen...

Autor: Christian Paier (christian_paier)
Datum:

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

Autor: Ralf Schwarz (spacedog) Benutzerseite
Datum:

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

Autor: Matthias Lipinsky (lippy)
Datum:

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

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.