=D>
so... mal ein Bild von meinem LCD...
habe ein Bildchen gemalt und unten rechts läuft eine Uhr, vom Start des Controllers los, mit nem Sekundeninterrupt ... cool klappt alles ohne Probleme =P~
Druckbare Version
=D>
so... mal ein Bild von meinem LCD...
habe ein Bildchen gemalt und unten rechts läuft eine Uhr, vom Start des Controllers los, mit nem Sekundeninterrupt ... cool klappt alles ohne Probleme =P~
Das geht so nicht, jedesmal wenn etwas über I2C gesendet wird, resettet das LCD.Zitat:
Der Enable vom LCD liegt somit bei mir auf SCL und der RESET auf SDA...
Kommt sich da was in die Quere?
Nur beim Initialisieren, wird der Kontrast auf einen Mittelwert eingestellt.Zitat:
Hast auch Kontrast mit in der LIB drin?
Man kann ihn aber auch nachträglich ändern.
Code:$lib "sed1565.lib"
$external Sedctrl
'Portx = Datenport LCD
Portx = &H81 '$81 = Kontrast einstellen
!Call Sedctrl
Portx = Kon 'Kon = Kontrastwert 1 - 63
!Call Sedctrl
Danke Albundy
Werd das gleich mal in mein Mega16-Menü mit einflechten...
Hab da gestern mal ein wenig Zeit gehabt und eine 3-Tasten-Menü-Struktur aufgebaut...
1. seite Kontrast und Beleuchtung
2. seite zwei PWMs für Lüfter oder so
3. seite ....
und so weiter
Ach ja, und mit dem I2C... hab da mal ne Diode an den einen gemeinsamen Pin gehängt... den mit Reset fürs GLCD.
Da hat sich nur was getan, wenn ich I2C angesprochen habe, bei den LCD-Befehlen nicht...
Kann das sein, dass, wenn man Hardware I2C aktiviert, die Pins dafür dann reserviert sind???
Danke und Grüße... Stefan
Wenn ich mich nicht irre, wird Hardware-TWI nur benutzt, wenn die "i2c_twi.lbx" eingebunden wird, sonst automatisch Software-TWI.Zitat:
Kann das sein, dass, wenn man Hardware I2C aktiviert, die Pins dafür dann reserviert sind???
Aber das ist ja auch egal, der Reset oder Enable an einem I2C Pin wird nicht funktionieren. Spätestens wenn ein I2C Device angesprochen wird, ist das LCD aus.
Hallo Albundy,
ich hatte ein wenig Zeit und hab versucht mich ein wenig schlau zu machen. Da ich von Assembler leider viel zu wenig verstehe um Deine lib modifizieren zu können, hab ich einfach den font8b modifiziert und komme so auf meine großen Zahlen.
Bei dem Font werden von Deiner lib ja jeweils 8 byte eingelesen, die 8 byte entsprechen wenn ich das richtig verstanden habe jeweils einer Spalte, aber wie ist das bei dem 5x7 font ? da liest du 6 byte ein, sehe ich das richtig, dass da jeweils nach einem Zeichen ein 00 kommt ?
Gibt es in Deiner lib eigentlich eine Einschränkung der zeichenzahl ? Könnte ich Zeichen mit ASCII Code über 127 definieren oder liest er das dann nicht mehr ein ?
Vielen Dank und nochmal danke für die tolle lib !
Markus
Hallo Markus,
wie meinst du das ? Wenn du ein Zeichen aus mehreren zusammensetzt, um auf eine Höhe von 16 Bit zu kommen, kannst du aber keine Variablen mehr benutzen.Zitat:
... hab ich einfach den font8b modifiziert und komme so auf meine großen Zahlen.
das letzte Byte ist jeweils der Abstand zum nächsten Zeichen.Zitat:
da liest du 6 byte ein, sehe ich das richtig, dass da jeweils nach einem Zeichen ein 00 kommt ?
Der ASCII Zeichensatz geht ja von 32 (davor sind Steuerzeichen) bis 127, die alle über die Tastatur zu erreichen sind.Zitat:
Gibt es in Deiner lib eigentlich eine Einschränkung der zeichenzahl ? Könnte ich Zeichen mit ASCII Code über 127 definieren oder liest er das dann nicht mehr ein ?
Du kannst jetzt auch noch weitere Zeichen ab 128 eingeben, die werden auch in der Lib verarbeitet. Aber die kannst du in Bascom nur noch über die Tastenkombination "ALT + Zeichenwert" eingeben.
Wenn ich mich nicht irre, entspricht Zeichen 128 dann "ALT+160".
Hi Albundy,
das ich Zeichen definieren kann,die über 127 liegen ist schon mal sehr gut.
Ich habe folgende Problemstellung :
Ich habe eine 11 stellige Zahl, bei der aber alle Ziffern in einer eigenen Variablen liegen. Diese Zahl, die sich natürlich verändert wird an einer festen position angezeigt.
Jetzt sorge ich eigentlich nur dafür, dass je nach position in der einen Zeile der obere Teil meiner großen Zahl angezeigt wird und in der Zeile darunter dann der untere Teil.
Auf die Zeichen jenseits von 127 könnte ich ja mit den Befehlen CHR und ASC kommen oder funktioniert das mit deiner Lib nicht ?
Eigentlich müsste Deiner lib es doch egal sein, ob sie das Zeichen fest zugewieden oder in einem String bekommt.
Gruß Markus
Das ist nicht egal, da an die Library nur die Adresse des String im Speicher übergeben wird.Zitat:
Auf die Zeichen jenseits von 127 könnte ich ja mit den Befehlen CHR und ASC kommen oder funktioniert das mit deiner Lib nicht ?
Eigentlich müsste Deiner lib es doch egal sein, ob sie das Zeichen fest zugewieden oder in einem String bekommt.
Wie gesagt, Variablen kannst du so nicht benutzen. Denn "Grdat" spaltet eine Variable in bis zu 5 Ziffern auf und gibt sie dann über "Grlcd" in einer Page (8 Pixel hoch) auf dem Display aus.
Hi Albundy,
vieleicht bin ich etwas schwer von Begriff, aber wenn ich Dein Beispielprogramm richtig gesehen habe und auch Deine Declareanweisung richtig verstehe kann ich doch mit den Befehlen:
Dim Test as String
Test = "Hallo Welt"
Call Grlocate(15 , 1)
Call Grlcd( Test , "s")
den Text auf das LCD schreiben lassen oder geht das nicht ?
Wenn ich jetzt doch sage:
Call Grlocate(15 , 1)
Call Grlcd( String1 , "s")
Call Grlocate(15 , 2)
Call Grlcd( String2 , "s")
bekomme ich 2 Buchstaben untereinander (oder halt 2 Strings)
Ich muss also nur in einer Unterroutine dafür sorgen, dass die Zeichen auch richtig positioniert werden.
Vieleicht habe ich auch einen Denkfehler, denn wie gesagt Assembler ist nun wirklich nicht meine Stärke.
Danke nochmal
Markus
Hi Markus,
Ja klar, das funktioniert. Ist doch aber sehr umständlich.Zitat:
Test = "Hallo Welt"
Call Grlocate(15 , 1)
Call Grlcd( Test , "s")
den Text auf das LCD schreiben lassen oder geht das nicht ?
Ich habe da etwas besseres ! :mrgreen:
Eine erweiterte Library. In der kannst du dir Zeichen im Format 12x16 definieren.
Das Anzeigen in der Grösse funktioniert dann auch mit Variablen.
Klasse !!!
Danke ! Werd ich gleich mal testen !!
Gruß Markus
Hi Albundy !
Nochmal vielen Dank !! Das funktioniert wirklich super !!
Ich bin ja vieleicht ein bischen nervig, aber ich möchte halt versuchen Deine lib auch zu verstehen und hoffe ich falle Dir nicht allzusehr auf die Nerven.
Wenn ich das richtig verstanden habe machst Du folgendes :
[Grlcd]
$EXTERNAL _Ctrl
...
ldi r22,8 hier lädst Du die Zeichenbreite ins Register 22
rjmp Grlcd50 und hier springst Du die Ausgaberoutine an
...
hab ich das richtig verstanden, dass die Ausgaberoutine dann soviele bytes einliest wie ins Register r22 geschrieben werden ?
Die lib ist echt klasse und ich find Deine Hilfe wirklich genial !
Gruß Markus
@Albundy:
hi, habe mir das ganze aufgebaut und es funktioniert wunderbar. habe aber noch ne frage an Dich :
Gibt es ne Möglichkeit, das geladene Bild zu drehen ? Also das man nur eine Bild.inc benötigt und das Bild dann per Code zu drehen.
mfg Kay
@Kay
Mal abgesehen vom Format (128x64 Pixel), wie soll das funktionieren ?
In der Inc-Datei sind die Bytes der Grafik in der Reihenfolge gespeichert, wie sie auf dem Display ausgegeben werden.
Das sind genau 128 Bytes auf 8 Zeilen (jede Zeile ist 8 Bit hoch)
Sieh dir mal das Beispiel mit der 8 an (Seite 2) und drehe diese 8 um 90 Grad. Dann stimmen alle Bytes nicht mehr.
Das Drehen funktioniert nur, wenn die Daten pixelweise ausgegeben werden.
Aber der SED1565-Controller kann keine Pixel ausgeben, sondern immer nur Bytes.
@albundy
danke für die Antwort. dann bleibt mir nix anderes übrig als mehrere Bilder im Programm einzufügen.
mfg Kay
Bei kleineren Symbolen ist es platzsparender diese in den Font16 einzubauen. (auf Millimeterpapier zeichnen und Bytes aufschreiben)
Ein Muster für die Anordnung der Bytes findest du auch in dem Beispiel der 8 auf Seite 2.
Das funktioniert auch jeweils mit einem vielfachen von 12 (Zeichenbreite) oder 16 (Zeichenhöhe).
Es ist zwar ein höherer Aufwand, aber man spart eine eine ganze Menge Speicherplatz. (1 Bild = 1024 Byte , Symbol 36x32 Pixel = 144 Byte)
ich hätte noch ne andere Frage an Dich:
haste davon mal was mitbekommen ?
http://www.mikrocontroller.net/forum...43641.html#new
Es gibt auch für Bascom einen Code:
http://www.xmail.net/martin-k/code/LS202-RGB.bas
Bei diesem Code, werden aber nur Balken angezeigt
meine Frage ist, denkste es wäre ein vertretbarer Aufwand, auf diesem Display mit Bascom auch Text und Bild darzustellen ?
mfg Kay
@Kay
Wie soll ich das verstehen ? ... mitbekommen ...Zitat:
haste davon mal was mitbekommen ?
keine Ahnung ! Ich habe leider keinen Sponsor, der mir die Hardware zum Testen bereitstellt.Zitat:
meine Frage ist, denkste es wäre ein vertretbarer Aufwand, auf diesem Display mit Bascom auch Text und Bild darzustellen ?
sorry, hab mich falsch ausgedrückt. ich wollte fragen, ob du diesen link kennst und auch schon mit diesem Display vielleicht gearbeitet hast.
mfg Kay
Hallo,
Ich habe heute auch mal das Display angeschlosen, bekomme es auch ans laufen, aber das problem ist das das die lionien teilweise verschoben sind und das die Buchstaben nicht OK sind.
Versuche mal zu erklären was ich meine
EDIT: Hat nicht geklappt wie ichs eigentlich vor hatte, deshalb jetzt ein Bild
also noch eine zeile drüber. Also über der normalen acht sind noch Pixel die da nicht hingehören.
Werde gleich mal ein foto machen.
Die Linien der Rahmen sind auch verschoben.
Was kann das denn sein, habe es schon mehrmals kontrolliert das lle Pins richtig sind.
Hoffe ihr könnt mir helfen
CIao Marco
Hallo Marco,
Die Anschlüsse stimmen, sonst würdest du gar nichts sehen.
Es kann sein, dass deine Drähte zu lang sind ?
Das kann man auf dem Foto nicht sehen.
Bei mir sind es max. 10cm vom Display zum Controller.
also bei mir können es schon so 20-25cm sein.
Daran kann das schon liegen?
Aber wenn ich das doch mit der beiligenden Platine am Parallelport anshcliße kann das kabel doch auch 2m oder so lang sein
Ist nur eine Vermutung, aber das könnte schon zu lang sein.Zitat:
also bei mir können es schon so 20-25cm sein.
Daran kann das schon liegen?
Das ist auch etwas ganz anderes. Dort ist das Kabel geschirmt und der Schirm ist mit der Masse vom Computer verbunden.Zitat:
Aber wenn ich das doch mit der beiligenden Platine am Parallelport anshcliße kann das kabel doch auch 2m oder so lang sein
Mit frei liegenden Drähten würde das über 2m auch nicht funktionieren.
Ja dann werde ich das morgen mal testen. Danke schonmal für den Tip.
Gibts eigentlich auch ne möglichkeit das Display zu invertieren?
Mit dem Kontrast werde ich mirgen nochmal rumspielen.
Ciao Marco
ist die gleiche Vorgehensweise, wie beim Kontrast.Zitat:
Gibts eigentlich auch ne möglichkeit das Display zu invertieren?
Den Befehl dafür hab ich jetzt nicht im Kopf, steht aber im Datenblatt.
So, die Drähte sind gekürzt,
allerdings immer noch das gleiche Problem.
Echt komisch.
Werde es morgen nochmal wie duz machen und die Dräte driekt an das Display löten.
Habe es jetzt noch so, das ich die Drähte an der Ansteuerplatzine für den Parallelport abgreife, allerdings vor den Widerständen usw.
Aber vielleicht liegts ja da dran!
Ciao Marco
Hallo,
ich habe ein ähnliches Problem wie Marco.
Mein µC ist ein 16MHz atmega128 und ich versuche damit ein HP12542R-DYO anzusteuern, habe bisher ein paar Routinen zur Ansteuerung und einen Charactergenerator in Assembler geschrieben und das funzt auch eigentlich ganz gut, bis auf eine Ausnahme: wenn 0x7f oder 0xff gesendet wird, bekomme ich zwischen dem 0x7f und dem folgenden Zeichen ein
scheinbar willkürliches Bitmuster (meistens 0xff). Ich habe alle mir sinnvoll erscheinenden Reihenfolgen für die Steuerleitungen getestet,sieht aus als wäre das völlig egal, solange die Daten anliegen und dann eine negative Flanke von EN kommt. ??? Auch Delays von einem NOP bis zig µS zeigen keine Wirkung. Laut Datenblatt muß das Teil ja auch ohne jegliche Verzögerung auskommen. (mit einem Testprog. auf dem PC tritt dieses Phänomem nur sehr selten auf.)
Hat jemand etwas ähnliches beobachtet und eine Lösung gefunden?
Gruß Achim
Hallo Achim,
ich fürchte, du musst dein Problem schon etwas genauer beschreiben.
Mit dieser Beschreibung kann ich nichts anfangen.Zitat:
... einen Charactergenerator in Assembler geschrieben und das funzt auch eigentlich ganz gut, bis auf eine Ausnahme: wenn 0x7f oder 0xff gesendet wird, bekomme ich zwischen dem 0x7f und dem folgenden Zeichen ein
scheinbar willkürliches Bitmuster (meistens 0xff).
Etwas Quellcode wäre auch sehr hilfreich.
Hallo albundy,
erst mal Danke für die schnelle Antwort.
Mit unten stehender Routine lassen sich mit und ohne delay
alle Bitmuster problemlos ausgeben bis auf 0x7f bzw. 0xff völlig unabhängig von dem Programmteil welches die Zeichen erzeugt.
folgender Code erzeugt das Phänomen:
ldi r16,0x7f
call dtaout
ldi r16, beliebiger Wert
call dtaout
loop:rjmp loop
dtaout: ;send r16 to display as databyte
sbi porte,d_dta ;set A0 pin high (cmd)
; call delay
cbi porte,d_ncs ;set /CS pin low
; call delay
sbi porte,d_en ;enable pin high
; call delay
out portb,r16 ;send data
; call delay
cbi porte,d_en ;enable pin liw
; call delay
sbi porte,d_ncs ;set /CS pin high
ret
;Display Initialisierungsfolge wird übertragen wie Daten nur halt mit A0 low
init: .db 0x40,0xA0,0xA3,0xC0,0x2F,0x20,0xAC,0x81,0x20,0xA4, 0xAF,0xA6
Ich hoffe Du kannst damit etwas mehr anfangen. Übrigen habe ich auch mit
einem zweiten Display getestet mit gleichem Resultat.
Möglicherweise ist auch einfach nur mein Verbindunskabel zu lang, ca. 40cm Flachbandkabel (IDE) .
Gruß
Achim
Hallo Achim,
laut Datenblatt müssen die Daten min. 30ns anliegen, bevor EN von High auf Low geht. Ich würde "out portb,r16" als erstes in "dtaout:" ausführen lassen, dann kannst du die delay's weglassen.Zitat:
sbi porte,d_en ;enable pin high
; call delay
out portb,r16 ;send data
; call delay
cbi porte,d_en ;enable pin liw
Aber das ist sicher nicht die Ursache.
Ich denke nicht, das es mit den Bytes $7F bzw. $FF zusammenhängt, da es sonst auch mit Kombinationen wie $7E oder $FE Probleme geben müsste.Zitat:
... bis auf 0x7f bzw. 0xff völlig unabhängig von dem Programmteil welches die Zeichen erzeugt.
Bei einem Flachbandkabel von 40cm Länge würde ich schon eher die Ursache suchen. Zumal das Übersprechen bei dieser Länge doch schon erheblich sein dürfte. Liegt eventuell die Ader für EN im Kabel neben einer Datenader ?
Hallo albundy,
es war wirklich das Kabel, eigentlich logisch bei 16 MHz Taktfrequenz.
Ich habe heute mittag mal das Kabel auf 5 cm gekürzt und wie durch
ein Wunder waren die unerwünschten Bitmuster verschwunden.
Nochmal ganz herzlichen Dank.
Hallo.
Hat schonmal jemand versucht die Displaydaten zu lesen um auf Pixelebene zu arbeiten? Ich bekomme es nicht hin (AVR-Assembler-Beginner).
Ich habe Albundys LIB als Basis genommen und wollte zum Test mal den Display-Inhalt invertieren. Teilweise gelingt das auch, aber pro Display-Spalte immer nur bei ein paar (meist aufeinanderfolgenden) Bits. Pro Display-Speicher-Seite dann aber auch unterschiedlich viele (mal 3, mal 4, 5). So habe ich ein hübsches Streifenmuster :-s (siehe Anhang)
Habe das Kabel schon auf 6cm gekürzt um Übersprechen auszuschliessen.
Hier ist der Code
Hab ich irgendwo ein Timingproblem mit den Displaydaten?Code:;----------------------------------------Modifizierte Kopie Von Seddata
[sedread]
$external Seddelay , Sedkonst
Sedread:
ldi r18,$00
Out Data_port , R18 ; Pull -ups Aus
Out Data_direction , R18 ; Datenport Auf Eingabe
ldi r18, (2^Pin_Res+2^Pin_A0+2^Pin_rw) ;High for Reset + A0 + RW
Out Ctrl_port , R18
rCall Seddelay
ldi r18, (2^Pin_Res+2^Pin_A0+2^Pin_E+2^Pin_rw) ;High for Reset + A0 + E + RW
Out Ctrl_port , R18
rCall Seddelay
ldi r18, (2^Pin_Res+2^Pin_A0+2^Pin_CS1+2^Pin_rw) ;High for Reset + A0 + CS1 + RW
Out Ctrl_port , R18
rcall Seddelay
in r24,data_port_in ;Datenport nach R24 lesen
ldi r18,$ff ;Datenport wieder auf Ausgabe
Out Data_direction , R18
ret
[end]
;----------------------------------------Modifizierte Kopie Von Grcls
[grinv]
$external Sedctrl , Seddata , Sedread , Sedkonst
Grinv:
clr r24 ;Arbeitsregister
clr r25 ;Seiten-Register
clr r26 ;Spalten-Register
Grinv10:
mov r24,r25 ;Seite ins Arbeitsregister
ori r24,$B0 ;SET-PAGE-Befehl dazu (oberes Nibble, unteres = Seite 0-7)
Out Data_port , R24
rcall Sedctrl
ldi r24,$10 ;SET-COLUMN-Befehl (Hi-Nibble der Spalte im unteren 4 Bits)
Out Data_port , R24
rcall Sedctrl
clr r24 ;2. Teil der Spaltenadresse (Lo-Nibble), hier auch 0
Out Data_port , R24
rcall Sedctrl
ldi r24,$e0 ;Read-Modify-Write-Befehl
Out Data_port , R24
rcall Sedctrl
Grinv20:
rcall Sedread ;Daten nach R24 lesen
com r24 ;Daten invertieren
Out Data_port , R24
rcall Seddata ;Daten zurueckschreiben
inc r26 ;naechste Spalte
cpi r26,128 ;schon bei 128, Dann Seite fertig!
brne grinv20 ;sonst weiter machen
ldi r24,$ee ;Ende Read-Modify-Write-Befehl (um SET-COLUMN aufrufen zu können)
Out Data_port , R24
rcall Sedctrl
clr r26 ;wieder bei Spalte 0 anfangen
inc r25 ;naechste Seite
cpi r25,8 ;schon bei 8, Dann komplett fertig!
brne grinv10 ;sonst weiter machen
ret
[end]
Ich wäre für etwas Hilfe wirklich dankbar.
Hallo,
der Ablauf beim lesen muss ein anderer sein.
Code:ldi r18, (2^Pin_Res+2^Pin_A0+2^Pin_rw) ;High for Reset + A0 + RW
Out Ctrl_port , R18
rCall Seddelay
ldi r18, (2^Pin_Res+2^Pin_A0+2^Pin_E+2^Pin_rw) ;High for Reset + A0 + E + RW
Out Ctrl_port , R18
rCall Seddelay
in r24,data_port_in ;Dummyread lt. Datenblatt
in r24,data_port_in ;Datenport nach R24 lesen
ldi r18, (2^Pin_Res+2^Pin_A0+2^Pin_CS1+2^Pin_rw) ;High for Reset + A0 + CS1 + RW
Out Ctrl_port , R18
rcall Seddelay
;hier zu lesen ist sinnlos, da CS1 jetzt High ist.
Danke Albundy!
Manchmal braucht's nur einen kleinen Hinweis!
..OK, manchmal würde es auch reichen, wenn ich das Datenblatt ordentlich lesen würde! ;-)
Der entscheidende Tipp ist der Dummy-Read. Allerdings nicht mit 2x IN ... sondern 2x Read ans Display senden (also RES, A0, E, RW auf high).
Ausserdem darf vor dem IN keine Pause sein, weil die Daten wohl nicht lange genug anliegen. So hat's bei mir gestern nach kurzem ausprobieren geklappt.
Werde mich am WE mal daran machen ein paar einfache Grafik-Routinen zu basteln.
Hallo.
Lange ist's her mit dem letzten Eintrag. Habe trotzdem 3 Fragen.
1.Muß die Quarzfrequenz auch in der lib angepasst werden ?
2.Wozu wird R/W definiert ? Wird im Code doch garnicht verwendet.
3.Wo ist das Tool zum Konvertieren der s/w Bitmaps hin ?
Danke und Gruß
Hallo,
hab mal ne frage. Womit werden die Fonts erstellt? und wofür is der 2te Parameter bei Grdat()
Declare Sub Grdat(byval Variable As String , Byval Stelle As Byte , Byval Font As String) 'Stelle = Ausgabedigits 1-5
kann ich eigene Symbole malen und in einer Font hinterlegen? z.b. anstelle der #(raute) ein eigenes Symbol?