Forum: Mikrocontroller und Digitale Elektronik S65 display library on AT90CAN128: Compile errors


von Stefan L. (tarabas)


Lesenswert?

Hallo Leute,

ich versuche gerade die S65 display library von Christian Kranz auf 
einem AT90CAN128 zum laufen zu bekommen.
(Querverweise:
 Beitrag "The Siemens S65 132x176, 65536 color display with AVR"
 Beitrag "Nokia 6100 Grafiklibrary die Zweite")

Die mitgelieferte Demo für den Mega128 geht prima, nur auf dem CANxxx 
gibt es folgende Fehler:
1
glcd_init.asm:91: Error: number must be positive and less than 32
2
glcd_init.asm:94: Error: number must be positive and less than 32

das bezieht sich auf folgende Zeilen in "glcd_init.asm":
1
...
2
SPI_SEND:   
3
    sbi     LCD_SPCR,SPE        ;enable SPI
4
...
5
SPI_SEND_0: 
6
    sbis    LCD_SPSR,SPIF
7
...

Ursache ist klar: beim Mega128 sind die SPI-Register im Bereich 
0x0d-0x0f, also noch im IO-Bereich (unterste 32 Byte). Beim CANxxx sind 
sie jedoch bei 0x2c-0x2f und damit für SBI/SBIS u.ä. unerreichbar.

Habt Ihr eine Idee, wie man das umschreiben könnte? Ich hab da momentan 
einen Knoten im Gehirn.

Mir fällt nur folgendes ein, kommt mir aber doof und ineffizient vor, 
außerdem ist mir unklar, welches Register noch frei ist. Hier eins mit 
PUSH/POP zu sichern, macht es noch ineffizienter.
1
...
2
SPI_SEND:   
3
    in      Rxx, LCD_SPCR
4
    ori     Rxx, 1<<SPE
5
    out     LCD_SPCR,Rxx
6
...
7
SPI_SEND_0:
8
    in      Rxx, LCD_SPSR
9
    sbrs    Rxx, SPIF
10
...

An dem gleichen Problemchen klemmt übrigends auch Hagens glcd-library.

Please advise!

Grüße, Stefan

von Stefan L. (tarabas)


Lesenswert?

Also die erste Frage kann ich schonmal halbwegs beantworten:

der o.g. Code kann angepaßt werden zu, glcd_init.asm ab Zeile 90:
1
SPI_SEND:   
2
    push r16                    ;* register sichern
3
    in r16,LCD_SPCR             ;* SPI Control in register
4
    ori r16,1<<SPE              ;* Bit setzen
5
    out LCD_SPCR,r16            ;* wieder augeben
6
    pop r16                     ;* register wiederherstellen
7
    out     LCD_SPDR,T1         ;load byte in SPI data register
8
9
    push    r0                  ;short time workaround to be fixed
10
SPI_SEND_0: 
11
    in r0, LCD_SPSR             ;* SPI Status lesen
12
    sbrs r0,SPIF                ;* nächste Überspringen wenn SPIF in R0 gesetzt
13
    rjmp    SPI_SEND_0          ;transmitt byte to LCD
14
    in  r0,LCD_SPDR
15
    pop r0

Nicht elegant, aber damit geht erstmal die Grundlegende Ansteuerung.

Trotzdem steh ich grade Kopf, weil alles auf dem Kopf steht.
Soll heißen, die Orientierung im Display ist nicht ok.
Habe schon rumgespielt mit glcdSetOrientation(ORIENTATION_0)
und anderen Werten, aber immer noch Kopfstand.

Hat jemand dieses Feature der Lib zum laufen bekommen? In welcher 
Reihenfolge müssen diese Aufrufe kommen? Vor/Nach glcdDisplayInit();??

Please Help!  // Stefan

von Hagen R. (hagen)


Lesenswert?

1
...
2
    in  r0,LCD_SPDR
3
    pop r0
4
...

und was soll nach dem pop r0 in r0 drinnen stehen ? bestimmt nicht dasw 
as du vorher mit in darin geladen hast, oder ?

Gruß Hagen

von Stefan L. (tarabas)


Lesenswert?

Hagen Re schrieb:

> und was soll nach dem pop r0 in r0 drinnen stehen ? bestimmt nicht dasw
> as du vorher mit in darin geladen hast, oder ?

Nein, das, was mit dem push r0 in der Zeile vor SPI_SEND_0: gerettet 
wurde.

Da die Ausgabe prinzipiell funktioniert, ist dieser Workaround für mich 
ok.

Das Problem liegt in der Orientierung :( es steht alles Kopf und ich 
weiß nicht wieso oder wie das zu ändern ist.

Mein Display ist von Display3000, es ist ein Nokia mit LS020....

von volltroll.de (Gast)


Lesenswert?

"Nokia mit LS020." Äh, ist der LS020 nicht im S65er Display, oder in 
beiden?
Bei einen von den beiden Displays gibts nen Kommando um das Display zu 
spiegeln/Drehen. Steht auch in dem Quellcode drin(afair).

von Stefan L. (tarabas)


Lesenswert?

Hagen Re schrieb: (die 2te)
> und was soll nach dem pop r0 in r0 drinnen stehen ? bestimmt nicht dasw
> as du vorher mit in darin geladen hast, oder ?

Nein, das, was mit dem push r0 in der Zeile vor SPI_SEND_0: gerettet 
wurde.

Mal nochmals mit dem Originalcode vergleichen:
1
SPI_SEND:   
2
    sbi     LCD_SPCR,SPE        ;enable SPI
3
    out     LCD_SPDR,T1         ;load byte in SPI data register
4
SPI_SEND_0: 
5
    sbis    LCD_SPSR,SPIF
6
    rjmp    SPI_SEND_0              ;transmitt byte to LCD
7
    push    r0          ; short time workaround to be fixed
8
    in  r0,LCD_SPDR
9
    pop r0
10
    sbi     LCD_PORT,LCD_CS     ;deselect Display
11
    ret

Tja, die Frage ist, wofür dient der "short time workaround". Scheinbar 
geht es nur darum, eine Lese-Operation auf LCD_SPDR auszuführen. Was 
dort gelesen wurde, ist wohl uninteressant!?
Ich habe in meinem Code das pusc r0 vor die Warteschleife SPI_SEND_0; 
geschoben, da ich ebenfalls r0 brauchte... liegt hier mein 
Orientierungsproblem? Da SPI_SEND_0 von nirgends sonst angesprungen 
wird, sollte das gehen.

Da die Ausgabe prinzipiell funktioniert, scheint dieser Workaround für 
mich ok.

volltroll.de schrieb:
> "Nokia mit LS020." Äh, ist der LS020 nicht im S65er Display, oder in
> beiden?
Mein Display ist das ganz links, siehe
http://www.superkranz.de/christian/S65_Display/DisplayIndex.html

volltroll.de schrieb:
> Bei einen von den beiden Displays gibts nen Kommando um das Display zu
> spiegeln/Drehen. Steht auch in dem Quellcode drin(afair).
Really? Hm, wo nur.... **äug**

von Hagen R. (hagen)


Lesenswert?

also ich habe die Lib ursprünglich fürs Nokia entwickelt und Chrisian 
hats dann portiert fürs S65. Meine eigene S65 lib unterstützt nur das 
LPH und das aus gutem Grund. Bei dem ist nämlich die Ansteuersequenz für 
die Orientierung etc.pp. bekannt.

Gruß Hagen

von Stefan L. (tarabas)


Lesenswert?

Hagen Re schrieb:

> Bei dem ist nämlich die Ansteuersequenz für
> die Orientierung etc.pp. bekannt.

Hallo Hagen.

Wo genau in deinen Source passiert die Orientierungs-Umschaltung in 
deinem Code?

*Ich glaube, ich weiß jetzt, wie man diese Umschaltet beim LS020.*

Da ich zusammen mit dem Display eine library bekommen habe (die ich 
leider nicht als Quelle veröffentlichen darf), kann ich dort aber nach 
diesem Kommando schauen. Dort funktioniert das nämlich :D

Dort passiert das in einer Routine, die nebenbei ein Ausgabefenster 
festlegt. Diese wird vor allen Ausgaben aufgerufen (CLS, Plot, Font, 
Line etc) und legt dort immer den nötigen Bereich oder das gesamte 
Display als Bereich fest, zusammen mit der Orientierung.
1
//folgende Kommandobytes müssen an das LS020 Display gesendet werden,
2
//um die Orientierung umzuschalten
3
4
//default (PORTRAIT)
5
0xEF, 0x08,
6
0x18, 0x00,            //0x00 ist der mode PORTRAIT
7
0x12, x1, 
8
0x15, x2,
9
0x13, y1,
10
0x16, y2 
11
12
//default (PORTRAIT180)
13
0xEF, 0x08,
14
0x18, 0x03,            //0x03 ist der mode PORTRAIT180
15
0x12, breite-1 - x1, 
16
0x15, breite-1 - x2,
17
0x13, hoehe-1 - y1,
18
0x16, hoehe-1 - y2 
19
20
//default (LANDSCAPE)
21
0xEF, 0x08,
22
0x18, 0x05,            //0x05 ist der mode LANDSCAPE
23
0x12, breite-1 - y1, 
24
0x15, breite-1 - y2,
25
0x13, x1,
26
0x16, x2 
27
28
//default (LANDSCAPE180)
29
0xEF, 0x08,
30
0x18, 0x06,            //0x06 ist der mode LANDSCAPE180
31
0x12, y1, 
32
0x15, y2,
33
0x13, hoehe-1 - x1,
34
0x16, hoehe-1 - x2

Die Frage ist eher, wo man das in deiner bzw. Christians library 
einpflegen muss/kann. Über Tips wäre ich sehr erfreut!

Grüße, Stefan

von Hagen R. (hagen)


Lesenswert?

Deine Aussagen sind sehr interersant für mich ;)

So wie ich es in meiner GLCD umgesetzt habe ist der beste Punkt die 
Orientierung zu setzen direkt vor den gemeinsam genutzen Basisfunktionen 
wenn man das Fenster und die Start Addresse an der man zeichnen möchte 
setzt. Also exakt so wie du es schreibst und in deiner nicht zu 
veröffentlichen Lib auch gelösst ist.

Allerdings ist es in meiner Lib so aufgebaut das man die Orientierung 
nicht zur Laufzeit sondern zur Compilezeit festlegt. Man legt also die 
Ausrichtung des LCDs auf Grund der Bauform der eigenen HW fest.
Bestimmte Funktionen wie Linien, Fonts, Bitamps ändern dann zur Laufzeit 
die Orientierung, spiegeln oder rotieren um +-90 Grad um effizienter zu 
sein. Zb. die Linienfunktion kann nur in einem der vier Quadranten 
zeichnen. Sie wird also für die anderen drei Quadranten die Orientierung 
verändern und somit kann man die Linienroutine effizienter machen und 
sie arbeitet in ihrer Liniendarstellung immer rotationssymmetrisch.
Die Fonts arbeiten grundsätzlich mit um +-90 Grad rotierter Orientierung 
in Relation zur eingestellten Orientierung, da meine Fonts Spalten- 
statt Zeilenweise die Pixel zeichnen.
Die Standardorientierung ist als zur Compiletime festgelegt und wir zur 
Runtime bei der Initialisierung des LCDs das erste mal gesetzt. Werden 
nun Grafikroutinen benutzt entscheiden diese ob sie mit einer 
abweichenden Orientierung arbeiten müssen und setzen die aktuell 
eingestellte dynamisch um und restaurieren diese dann wieder am Ende der 
Funktion. Da dieser Switch wesentlich weniger wahrscheinlich ist als 
nicht zu switchen hat man so den Kommunikationsoverhead minimiert und 
damit die Gesamtperformance gesteigert.

In meiner Lib sind alle LCD spezifischen Kommandos als Makros umgesetzt, 
also nicht in speziellen Funktionen. Damit werden sie erstens inlined 
und zweitens kann man die Lib relativ einfach an andere LCDs anpassen.

Im CodeLib Thread habe ich es schon angeboten das man über eine PN bei 
mir durchaus anfragen kann und den Source bekommt.

Gruß Hagen

von Stefan L. (tarabas)


Lesenswert?

Hagen, es freut mich dein Interesse zu sehen. Vielleicht haben wir ja 
alle was davon, wenn das Problem verschwindet :)

Wenn ich ehrlich bin, finde ich es praktischer, nicht jedesmal die lib 
compilieren zu müssen. Da ich mehrere Projekte mit verschiedenen CPUs 
habe, wo das Display auch verschieden angeschlossen ist, würde ich das 
lieber im Projekt als der lib festlegen, soll heißen, ich könnte auch 
ohne Lib und nur mit Includes leben. Ist aber egal...

Dein Makro-Style ist atemberaubend, so daß ich noch nicht genug 
durchsehe, um die o.g. Sache einzupflegen ;) oing

Jedenfalls schlug ein Test fehl, deine Lib und die mitgelieferte 
gleichzeitig zu nutzen (mit deiner Ausgeben und mit der anderen die 
Orientierung schalten). Hierbei ist die Ausgabe mit Portrait_0 ok, die 
anderne sind verkrüppelt irgendwie. Mal sehen.

Stefan

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.