Ich kämpfe mit dem oben angegebenen board. Eigentlich ohne Hal und ohne
arduino. Ohne Hal hab ich bereits aufgegeben.
Problem mit dem ili9341: Irgendwie klappt die Initialisierung nicht. Es
sieht so aus, als gäbe es zwei Speicherbereiche, die parallel
beschrieben werden. In früheren ilis konnte man Orientation einstellen:
Bildaufbau von oben links bis von unten rechts. Das finde ich weder im
Init-code noch im manual (240 Seiten). Das nit Anfangs- und Endwert
klappt auch nicht. Der Bereich zwischen Anfangs- und Endwert wird n i c
h t beschrieben (weißer Rahmen). Warum?
Hier der init-code:
Wenn du Pixels auf das Display bringst dann ist die Initialisierung
schon mal nicht sooo schlecht.
Konzentriere dich darauf dass du bei jeder Operation wo du
Pixel malen willst, immer die Beriche/Grenzen setzen musst.
Also damit
1
LCD_REG=ILI9341_COLUMN_ADDR;
2
LCD_RAM=0x00;
3
LCD_RAM=0x00;
4
LCD_RAM=0x00;
5
LCD_RAM=0xEF;
6
7
LCD_REG=ILI9341_PAGE_ADDR;
8
LCD_RAM=0x00;
9
LCD_RAM=0x00;
10
LCD_RAM=0x01;
11
LCD_RAM=0x3F;
Dann ist die Abfolge des Setzens mehrerer Pixel davon abhängig
wie die Orientungsbits gesetzt sind. Das zuständige Register
dass du dabei selbst in der Hand haben musst ist
ILI9341_MADCTL 0x36
Ich habe die Erfahrung gemacht dass dieses Register bzw seine
Bit-Definitionen bei jedem Hersteller bzw Display-Typ anders
zu interpretieren ist bzw seine Richtungen unterschiedlich sind.
Nachdem ich keine Treiber öffentlich gefunden habe die die
Display-Orientierung für alle vier Möglichkeiten korrekt
behandeln blieb mir auch nur der steinige Weg dies selbst
durch trial-and-error herauszufinden da die Angaben im Manual
nicht sehr klar sind.
Durch ungeeignetes Setzen der Orientierungs-Bits bekommt man
oft seltsame Effekte die deiner Darstellung ähneln. Oft kommt
es bei mehrfachen Schreiben dann zu Über-/Unterläufen bei den
Parametern (die ja automatisch inkrementiert werden) von
ILI9341_COLUMN_ADDR und/oder ILI9341_PAGE_ADDR.
Dass man die Parameter-Liste der Kommandos immer 8-bittig
schreibt hast du ja erfreulicherweise bereits herausgefunden
(was ich dir gestern nicht so deutlich mitgeteilt habe).
Arduinoquäler schrieb:> ILI9341_MADCTL 0x36
danke für den Hinweis. Habe das manual jetzt ausgedruckt. 9.3 /S.201
enthält eine Übersicht über die Einstellung von MV/MX/MY - MADCTl.
Ich kann jetzt 240x240 px sinnvoll Beschreiben(Bild). Schön wäre esw
natürlich, wenn die gesamte Bildschirmbreite mit 320 px genutzt werden
könnte. Wo wird eingestellt, ob nach 240 oder 320px umgebrochen wirde?
Gut!
Es wird dann umgebrochen wenn das X-Ende oder Y-Ende deines
aktuell gesetzten Fensters erreicht ist. Abhängig davon wie du
die Schreibrichtung des MAD_CTRL Registers gesetzt hast.
Also entweder wird zuerst von x1 bis x2 geschrieben, dann der
y-Wert inkrementiert, oder es wird von y1 bis y2 geschrieben und
dann x inkrementiert.
Das Inkrementieren kann aber auch Dekrementieren sein.
Schreibe dir doch erst mal die Fillscreen-Funktion die dir
einen ganzen schwarzen bzw einfarbigen Screen liefert.
grundschüler schrieb:> Wo wird eingestellt, ob nach 240 oder 320px umgebrochen wirde?
Wenn du so fragst habe ich den Eindruck dass du noch nicht
verstanden hast was ich dir schon vorher beschrieben habe:
Arduinoquäler schrieb:> Konzentriere dich darauf dass du bei jeder Operation wo du> Pixel malen willst, immer die Beriche/Grenzen setzen musst.>> Also damit> LCD_REG = ILI9341_COLUMN_ADDR;> LCD_RAM = 0x00; // start> LCD_RAM = 0x00;> LCD_RAM = 0x00; // ende> LCD_RAM = 0xEF;>> LCD_REG = ILI9341_PAGE_ADDR;> LCD_RAM = 0x00; // start> LCD_RAM = 0x00;> LCD_RAM = 0x01; // ende> LCD_RAM = 0x3F;
Arduinoquäler schrieb:> Wenn du so fragst habe ich den Eindruck dass du noch nicht> verstanden hast was ich dir schon vorher beschrieben habe:
Ich habe das schon verstanden und auch ausprobiert. Nur war das
Ergebnis, dass bei 0,0,240,320 gar nichts angezeigt wurde und bei
0,0,10,20 ein unbeschriebener weißer Rand von 10 bzw. 20 blieb -auf dem
Foto gut sichtbar.
Vielleicht habe ich es dann doch nicht richtig verstanden - jedenfalls
der Bereich zwischen Start- und Endwert wird nicht beschrieben, erst der
Bereich nach dem Endwert...
Warum?
Poste doch mal deine Setwindow Funktion.
Vermutlich verwechselst du irgedwas in Richtung:
xxxfunction (x1, y1, x2, y2)
und
xxxfunction (x1, x2, y1, y2)
Erkennst du den Unterschied?
Arduinoquäler schrieb:> Poste doch mal deine Setwindow Funktion.
mach ich nach feierabend. Meine aber genau mein Problem ab Seite 127 des
manuals gefunden zu haben. Probiere es heute abend aus.
Damit bekomme ich den auf den Fotos ersichtlichen weißen Rand zwischen
Start- und Endwert. Der Cursor wird auf den Endwert gesetzt und ab da
dann die angegebene Anzahl pixel gesetzt. Umgebrochen wird nicht.
Allerdings wird jetzt der gesamte Bildschirm beschrieben. Fehler lag an
MV.
Ich versuche mich jetzt mal an einem fonts.
Ich bekomme
grundschüler schrieb:> hier der Code:
Der ist nicht korrekt.
column address set und row address set verlangen
nach 4 (in Worten: vier) Parameter à 8 Bit.
Du kannst Kommando-Parameter nicht 16 Bit breit schreiben.
Das Datenblatt schreibt dir das vor. Schau es dir nochmals an!
Arduinoquäler schrieb:> Dass man die Parameter-Liste der Kommandos immer 8-bittig> schreibt hast du ja erfreulicherweise bereits herausgefunden
Aber offensichtlich nicht konsequent weitergeführt.
grundschüler schrieb:> LcdWriteData(Color);
Warum schreibst du an dieser Stelle nicht
LCD_RAM = Color;
grundschüler schrieb:> LcdWriteReg(0x002c);
Warum schreibst du an dieser Stelle nicht
LCD_REG = 0x002c;
Es ist doch erbärmlich umständlich für einen einfachen
Write-Vorgang extra eine Funktion aufzurufen.
Arduinoquäler schrieb:> nach 4 (in Worten: vier) Parameter à 8 Bit.
du hast recht. Deswegen klappt der ganze code nicht richtig, danke,
hätte ich selbst nicht gefunden.
Arduinoquäler schrieb:> Es ist doch erbärmlich umständlich für einen einfachen> Write-Vorgang extra eine Funktion aufzurufen.
Das ist überbleibsel von dem Versuch, meinen eigenen Standard-code
abzuändern. Wird geändert.
Die RTC läuft. Nach dem rst ändert sich die Zeit. Allerdings im
laufenden Programm wird die Zeit mit "HAL_RTC_GetTime" nicht
aktualisiert. Was mach ich falsch?
hast du dir HAL_RTC_GetTime mal genauer angesehen?
Kann man doch wunderbar im Debugger durchgehen.
Ich glaube nicht, daß der doppelte Aufruf der Weisheit letzter Schluß
ist.
Harry L. schrieb:> der Weisheit letzter Schluss
Das sehe ich genauso. Aber:
* @note You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to
unlock the values
* in the higher-order calendar shadow registers to ensure
consistency between the time and date values.
* Reading RTC current time locks the values in calendar shadow
registers until current date is read.
Eine endlose hal-Funktion für einen einfachen Registeraufruf. Ich
benutze diese nur zum Abgleich und ansonsten einen systick-timer. Hal
ist gut für ein lauffähiges Grundgerüst.
Hänge immer noch an der rtc bzw. die rtc hängt immer noch.
Es gibt doch sicher Jemanden, der beim black-board die rtc korrekt zum
laufen gebracht hat. Muss man etwa etwas umlöten, damit die rtc nach
Power_down über Batterie weiterläuft???