Nabend!!!
Vielleicht erbarmt sich mal jemand, und schaut mal kurzerhand über den
code drüber, denn der will einfach nicht funktionieren; mache jez den 3
tag daran rum.
was soll passieren: LCD-Ansteuerung mit einer 4-bit datenleitung an ein
2x8 display. das LCD wird initialisiert, danach bleibt es dunkel, bzw.
hell. die obere reihe wird nach dem einschalten hell, also gehe ich
davon aus, das es zumindest mal initialisiert wird. demnach muss der
fehler irgendwo in dem unterprogramm Daten: stecken, oder nach der
eigentlichen ini der falsche code für den 4 bit ansteuermodus. ich finde
nur leider kein fehler :(.
im 8 bit modus funktioniert fast der selbe code allergings tadellos.
kann es sein, das das display nur im 8 bit modus angesteuert werden
kann?!
und von mir schonmal ein fettes danke an die, die sich die mühe machen
und mal scnell drüberschauen.
Mhh, also, ich hab die letzten Tage auch an meinen Display verbracht und
mich damit abgequält. In deinem Code kann ich eigentlich kein Fehler
finden. Was nicht heißt das keiner drin ist smile!
Aber wie hast du denn das Display mit Port D verbunden?? So??
Display: Port D:
DB7 PB7
DB6 PB6
DB5 PB5
DB4 PB4
Und was ist mit deinem RW Pin?? Liegt der die ganze Zeit auf Low?
MfG BlueMorph
Also! Ich würde spontan sagen das Du vergessen hast die Datenleitungen
von
µC Portd 4-7 zu Display D0-D3 richtig anzuschliessen.
Sieht so aus als ob Du wie im 8-Bit Modus senden würdest.
Ausserdem fällt mir auf das Du trotzdem noch einen zweiten Port
verbratest.
Du könntest alles über einen Port senden. Z.B. Portd in dem Format:
7 6 5 4 3 2 1 0
EN RS RW D a t e n b y t e
> Also! Ich würde spontan sagen das Du vergessen hast die Datenleitungen> von µC Portd 4-7 zu Display D0-D3 richtig anzuschliessen.
D0-D3 des LCDs bleibt im 4-Bit-Modus normalerweise unbeschaltet, es wird
D4-D7 verwendet.
...
Moin!!!
danke erstmal für die ersten antworten.
"
Aber wie hast du denn das Display mit Port D verbunden?? So??
Display: Port D:
DB7 PB7
DB6 PB6
DB5 PB5
DB4 PB4
"
richtig, genau so. der rest liegt am port c. rw liegt auf gnd, brauch
ich erstmal nicht, da ich das busy noch nicht abfrage und alles über
diese warteschleifen auf gut dünken steuere.
aber das freut mich schonmal ein wenig, ads ich nicht der einzigste bin,
der keinen fehler entdeckt. der code vom tutorial funktioniert leider
nämlich auch nicht, und dabei wird noch nichtmal das lcd initialisiert.
um weitere kommentare wäre ich dankbar :)
achso, noch was:
"
Also! Ich würde spontan sagen das Du vergessen hast die Datenleitungen
von
µC Portd 4-7 zu Display D0-D3 richtig anzuschliessen.
Sieht so aus als ob Du wie im 8-Bit Modus senden würdest.
Ausserdem fällt mir auf das Du trotzdem noch einen zweiten Port
verbratest.
Du könntest alles über einen Port senden. Z.B. Portd in dem Format:
7 6 5 4 3 2 1 0
EN RS RW D a t e n b y t e
"
die anschluss belegung spielt nun erstmal keine rolle, ich habs für
mich, der besseren übersicht halber, alles auf 2 ports gelegt. ich will
erstmal nur, das ich einen funktionierenden code habe, dann wird
optimiert und mehr elemente hinzugefügt.
Hallo!
Hannes hat natürlich recht. Sorry!
>D0-D3 des LCDs bleibt im 4-Bit-Modus normalerweise unbeschaltet, es wird>D4-D7 verwendet
Aber hier meine ich hast Du ein paar Probleme. Es fehlen Pausen.
Mach mal ein paar Warteschleifen rein wie im nachfolgenden Beispiel.
>ini:
Mach mal hier ne größere Pause rein
> ldi r17, 0x00> out portd, r17> ldi r17, $30 ;$30 = 3 mal auf ausgang> rcall befehlini ; 1 befehl senden
Pause > 100ms
> rcall befehlini ; 2 befehl senden
Pause > 100ms
> rcall befehlini ; 3 befehl senden
Pause > 100ms
> ldi r17, 0b00100000 ; 4-bit interface> rcall befehlini
Pause > 100ms
> ;Function set> ldi r17, 0b00101000 ;Funtion set, DL, N, F> rcall befehl> ldi r17, 0b00000001 ;display löschen> rcall befehl
Pause > 500ms wegen Display löschen
> ldi r17, 0b00000110 ;Kursor nach rechts wandernd, kein Display> rcall befehl> ldi r17, 0b00001100 ;Display ein> rcall befehl
ret
Das nicht einhalten der Pausen kann zu fehlerhaften Initialiserung
führen vor allem beim beim Start der Ini und Display löschen sollte man
ausreichend warten.
Manche Displays machen da ganz schön Probleme z.b. c-control I2C-Display
ldi arg, 0x28 ;NOW: 2 lines, 5*7 font, 4-BIT MODE! ** this change to 4bit 2 lines **
49
rcall LCD_command ;after this point you don't can change anything 'show HD44780 Datasheet'
50
51
rcall LCD_wait
52
ldi arg, 0x0F ;now proceed as usual: Display on, cursor on, blinking
53
rcall LCD_command
54
55
rcall LCD_wait
56
ldi arg, 0x01 ;clear display, cursor -> home
57
rcall LCD_command
58
59
rcall LCD_wait
60
ldi arg, 0x06 ;auto-inc cursor
61
rcall LCD_command
62
ret
das delay wird nur für die Init sequenz benutzt , danach abfrage des
busy flags ( geht auch im 4bit-modus ) find ich pers. besser da keine
Delay's mehr erforderlich .
> das delay wird nur für die Init sequenz benutzt , danach abfrage des> busy flags ( geht auch im 4bit-modus ) find ich pers. besser da keine> Delay's mehr erforderlich .
Busy-Flag lese ich schon lange nicht mehr ein, stattdessen opfere ich
etwas AVR-SRAM für einen Bildschirmspeicher. Die Print-Routinen werden
dadurch sauschnell, denn sie schreiben nur über Pointer auf SRAM.
Ein Hintergrundjob, der vom Timer auf einen Abstand von etwa 1ms
synchronisiert wird, schaufelt dann je ein Byte aus dem
Bildschirmspeicher an das LCD und entwirrt dabei gleich die
DD-RAM-Adressen, der Bildschirmspeicher hat daher
fortlaufende/durchgängige Adressen, kann also mit Fließtext beschrieben
werden.
...
Hannes Lux wrote:
> Busy-Flag lese ich schon lange nicht mehr ein, stattdessen opfere ich> etwas AVR-SRAM für einen Bildschirmspeicher.
Außer, daß ich in C schreibe, scheinen wir wohl zu dem gleichen Schluß
gekommen zu sein.
Es programmiert sich einfach viel angenehmer so, z.B.:
Beitrag "Formatierte Zahlenausgabe in C"
Peter
> Außer, daß ich in C schreibe, scheinen wir wohl zu dem gleichen Schluß> gekommen zu sein.
Peter, ich habe sehr viel von Dir gelernt, was AVR-ASM und allgemeine
Herangehensweise an das Programmieren betrifft. Ich habe mir auch einige
Algorithmen von Dir abgeschaut und etliche Ratschläge angenommen, die Du
Anderen gegeben hast.
Mit C kann ich mich aber leider nicht anfreunden, das ist mir (trotz
vorhandenem K&R) zu kryptisch. Ich habe von Kindheit an große Probleme
mit Sprachen und Auswendiglernen, aber nur geringe Probleme, etwas, was
ich einmal verstanden habe, neu abzuleiten bzw. in Varianten umzusetzen.
Dazu kommt die Tatsache, dass ich ungern unverstandenen fremden Code
(auch in LIBs) verwende, also lieber kleinere Brötchen backe, dafür aber
meine eigenen. Ich bin da eher der Selbermacher als der Benutzer, auch
wenn der weg mühsamer ist und das Ergebnis etwas kleiner.
AVRASM empfinde ich als eindeutig und sehr angenehm (ich hatte mal etwas
Kontakt zu C16-6502-ASM und MFA-8085-ASM). Und da es für mich Hobby ist,
sehe ich auch keinen Grund mehr, mit fast 60 mühsam eine neue Sprache zu
erlernen.
...
@Hannes
Deine Meinung teile ich voll und ganz. Die Variante mit dem gemappten
Display im RAM ist auch immer mein Favorit. Da sind dann auch ganz
einfach Scrollen und Full-Screen-Editing drin. Den Vorteil des
Umsortierens der Zeilenanfänge - je nach Display und Hersteller -
hattest Du ja bereits erwähnt.
hmm, ich konnte das problem immernoch nicht lösen. habe nun mal 4 andere
LCD´s versucht, keines funktioniert, alle jedoch im 8 bit modus. der
code von der Homepage funktioniert zu meiner überraschung auch nicht. wo
hängts da, was mache ich falsch?
achso, andere megas habe ich auch schon verwendet, ohne erfolg.
nochmal zum besseren verständnis. im 4 bit modus funktioniert keines der
lcd, mit keinem der beiden codes ( aus dem tutorial und der code aus dem
ersten beitrag)
im 8 bit mlodus funktioniert jedoch alles tadellos.