Grafik Library AT-Mega, AT-XMega

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Grafik Library AT-Mega, AT-XMega

      Hi,
      ich habe angefangen, eine Grafik Library zu programmieren, welche Hardware unabhängige Funktionen haben soll (hat).
      Das Konstrukt ist so aufgebaut, dass man den Displaytyp wählt, im Hintergrund dann die entsprechenden Chip Treiber eingebunden werden, man aber einen festen Grafikbefehlssatz zur Verfügung hat.
      Die Routinen erkennen über das eingebundene Prozessor DAT File, ob es ein XMega ist und verwenden virtuelle Ports, um die Geschwindigkeit zu erhöhen.

      In der Anwendung ganz simpel.

      Ich werde die Library hier an dieser Stelle veröffentlichen, sobald ich einen Stand 0.9 Beta habe a_38_b45e201d
      Die Routine zur Textausgabe habe ich komplett neu geschrieben. Bisheriger Code basierte eigentlich immer auf Evert Decker Code.
      Ich bin von dem Restore/Read weg auf Lookup und setze nicht mehr die Positionen der einzelnen Punkte auf dem Screen zum zeichenen, sondern öffne ein "Schreibfenster" am Display, welches genau der Größe des auszugebenden Zeichen entspricht und schreibe die Zeichendaten seriell in diesen Bereich, ohne erneut positionieren zu müssen.
      Das geht so schnell, das man Schrift problemlos ein- und ausfaden kann...

      Zunächst das Video (Stand 24.01.2017 Full Sample)



      Grafik_xm128a1.zip (30.01.2017)
      Code first, think later - Natural programmer :D
    • six1 schrieb:

      Die Routine zur Textausgabe habe ich komplett neu geschrieben. Bisheriger Code basierte eigentlich immer auf Evert Decker Code.
      Ich bin von dem Restore/Read weg auf Lookup und setze nicht mehr die Positionen der einzelnen Punkte auf dem Screen zum zeichenen, sondern öffne ein "Schreibfenster" am Display, welches genau der Größe des auszugebenden Zeichen entspricht und schreibe die Zeichendaten seriell in diesen Bereich, ohne erneut positionieren zu müssen
      Hallo Six

      Ich kenne den Evert Decker Code nicht, deshalb meine Frage. Wird denn zum einfachen wechseln des Font auch setfont funktionieren? In Codes die ich bisher sah, wurde das immer etwas plastisch gelöst, was mich selbst einst dazu veranlasste eine neue Textausgabe zu schreiben. Sogar auch mit einer "Fensterlösung". Die TrueType-Geschichte fand ich etwas kniffelig.

      Eine weitere Anregung noch:
      Bei den ganzen Call's in Display-Funktionen werden immer so viele Parameter mit gezerrt, Color ist da so ein schönes Beispiel.
      In der Regel hat man ja nur ein Display und so fände ich es richtig, entsprechende Membervariablen wie TFT_Backcolor, TFT_Fontcolor, etc. zu nutzen.
      Habe sogar auf sämtliche Local - Variablen aus Gründen der Geschwindigkeit zu verzichten und statt dessen globale Hilfsvariablen genutzt, die einem s.g. TFT_Temp(x) - Array überlagert waren.

      So, muss jetzt weiter arbeiten.
    • Deine Anregung mit SETFONT schaue ich mir an.
      Im Moment aktiviert man die zu nutzenden Fonts im Setup der Grafik-Lib und kann den Font als Parameter mitgeben.

      Die Farbe ist nicht mehr Bestandteil eines Aufrufes!
      Diese wird so festgelegt:

      BASCOM-Quellcode

      1. Call Set_pen_color(white)
      Die Geschwindigkeit werde ich, soweit ich das kann, durch ASM Abschnitte erhöhen.
      Code first, think later - Natural programmer :D
    • Ok, habe mal die Beta V0.x angehängt.

      Im Grunde funktioniert es so, dass man Befehle der Grafics_lib.inc aufruft.
      Hier sind alle Befehle gekapselt, welche man benutzen kann.
      Die Treiber für das SSD1962 Display stellen die nötigen Funktionen bereit.

      Die 2d und 3d Lib wird von Grafics_lib eingebunden.

      Die aktuelle Farbe zum Zeichnen wird über

      Call Set_pen_color(white)

      eingestellt. Danach kann der Befehl erfolgen "etwas" zu zeichnen.
      z.B. eine Box
      Call Gl_box_filled(0 , 0 , 100 , 100)
      oder auch den Bildschirm in der gewählten Zeichenfarbe löschen
      Call Disp_clear()


      Bei der 2D und 3D Library ist das etwas anders!
      Da ich eine Art Doublebuffering implementiert habe, um "Flickering" zu unterdrücken, muss ich die Hintergrundfarbe und Zeichenfarbe haben.
      Diese werden bei 2D und 3D den Zeichenfunktionen mit übergeben!

      Der 2D Zeichenbefehl lautet:
      Restore Triangle
      Call 2d_draw_object( Flip_x, Flip_y, Rot_angle, Fix_x, Fix_y, Offset_x, Offset_y, Pen_color, Back_color, Del_old)

      Flip_x --> Rotation in X-Richtung
      Flip_y --> Rotation in Y-Richtung
      Rot_Angle --> Drehung um Zentrum Fix_x, Fix_y
      Offset_x, Offset_y --> Offset zu den Objektdaten
      Da das Objekt als DATA Lines definiert ist, ist die Position relativ... über die Offset Parameter kann die Relation zum Display hergestellt werden.
      Dies nennt man auch "World Parameter"
      Pen_color --> Zeichenfarbe
      Back_color --> Hintergrundfarbe
      Del_old --> 1=löscht automatisch das ZUVOR gezeichnete Objekt( mit den vorherigen Koordinaten!)
      Vor jedem Zeichnungsaufruf MUSS Restore des jeweiligen Objektes aufgerufen werden!
      Dies setzt den Lesezeiger von "READ" auf den Anfang des jeweiligen Objektes!
      Die Objekte für 2D sind in der Datei 2d_Objects.inc definiert.

      Der 3D Zeichnungsbefehl:
      Restore Cube
      Call 3d_draw_object( Rotate_x, Rotate_y, Rotate_z, Offset_x, Offset_y, Pen_color, Back_color, Del_old )
      Rotate_x, Rotate_y, Rotate_z --> Drehachsen -180° .. 180°
      Offset_x, Offset_y --> "World Parameter"
      Del_old --> 1=löscht automatisch das ZUVOR gezeichnete Objekt( mit den vorherigen Koordinaten!)
      Vor jedem Zeichnungsaufruf MUSS Restore des jeweiligen Objektes aufgerufen werden!
      Dies setzt den Lesezeiger von "READ" auf den Anfang des jeweiligen Objektes!
      Die Objekte für 3D sind in der Datei 3d_Objects.inc definiert.

      So, jetzt erstmal viel Spaß beim Entdecken und probieren.
      Sicher kann man das auch alles "zerreisen" bzw "ausschlachten".
      Lieber wäre mir aber, wenn ihr das System beibehalten würdet, so könnte man diese Library ausbauen und für jeden Einsatzzweck einbinden.
      Es fehlen noch einige Dinge, wie Compilerschalter für das zu und abschalten der 2D und 3D Funktionen usw...

      Ich will also nicht ausschließen, dass es bei euren Versuchen damit "krachen" kann :D
      Code first, think later - Natural programmer :D
    • Kleines Update:

      2D Objekt Definition den 3D Objekt Definitionen angepasst.

      Font-Zeiger mit RampZ geladen, damit diese auf >64K funktionieren.
      Es werden jetzt die Schriftarten in "Klartext" übergeben.
      z.B.
      Call Gl_text( "Graphic Library 2D & 3D" , 10 , 35 , Font_12x16 , X1 )

      Bisschen aufgeräumt.

      Die 2D und 3D Lib (2D.inc und 3D.inc) benötigen im Endeffekt nur eine LINE Funktion des jeweiligen Display und sind somit sehr einfach in eigene, andere Projekte zu übernehmen.

      Download im ersten Beitrag
      Code first, think later - Natural programmer :D
    • Dafür hast du dich aber flott rausgeputzt! Für die Brillenreparatur hättest du aber ein farbenfrohes Kinderpflaster verwenden können. Fesch!

      (kannst gleich nach meta verschieben)
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Update:

      Mark hat Anpassungen vorgenommen; LoadLabel wird zukünftig automatisch die RampZ laden.

      Hintergrund:
      Wenn über LoadLabel versucht wird, Zeiger auf Speicher oberhalb von $FFFF zu laden (<= Bascom 2.0.8.0), dann funktioniert dies nicht ohne weiteres.
      Man muss dies über Laden der RampZ erledigen:

      BASCOM-Quellcode

      1. Dim _Font_8x8 As Dword
      2. Dim Font_8x8_dwr As Byte At _Font_8x8 + 2 Overlay 'create a dword and an overly byte for the rampz
      3. _Font_8x8 = Loadlabel(font8x8) ' load 16 bit address in dword
      4. Font_8x8_dwr = Rampz ' since rampz is loaded as well , store that too
      5. !.org &H8000 'Lade Fontdaten oberhalb von $FFFF
      6. $include "Font8x8.font"


      Zukünftig erkennt LoadLabel die Übergabe eines DWord Parameter und erledigt das Laden der RampZ automatisch.

      Quellcode

      1. Dim _font_8x8 as DWord
      2. _font_8x8 = Loadlabel(font8x8) ' load 24 bit address in dword
      Code first, think later - Natural programmer :D