mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe! LCD-Ansteuerung


Autor: Bernd Kehr (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab nach Studium des LCD-Tutorials mich mal am Ansteuern einer LCD
Anzeige versucht.

Es ist ein 4-Zeiliges Disply mit HD44780-Chip.

Habe das Display folgendermaßen angeschlossen:
(für 4-Bit Modus)

Datenleitungen 4-7 hängen an den Ports PC0-PC3
Enabelleitungen E1 und E1 an den Ports PC4 und PC5

Die RS-Leitung liegt am Port B Pin 5!

R/W und Datenleitungen 0-3 liegen auf Masse

Die Anschlüsse hab ich schon x-mal gecheckt.

Ich glaube eher es liegt noch an der Programmierung aber ich komme
nicht drauf.

Als Anhang findet ihr mein ASM-Programm. Wenn es fertig ist soll es
eine Uhr geben.

Hab die ASM-Datein einigermaßen ausführlich kommentiert.
Kann mal jemand bitte reinschauen? Besonders in die LCD-Routine.

Vielen Dank.

Gruß Bernd.

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fehlerbeschreibung?

Autor: Bernd Kehr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso. Okay. :-)

Eigentlich geht gar nix. Das heißt wenn ich das Disply einschalte seh
ich in der erste und dritten zeile jeweils einen schwarzen balken.

Das Display trägt die Bezeichnung: WINTEK WD-C2704M-1HNN

Vielen Dank!

Bernd.

Autor: Helmut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe deinen Code ueberflogen - das in diesem Display 2 unabhaengige
Controller drin sind (deshalb 2 Enable) ist dir entgangen ? oder habe
ich da was uebersehen ?
Servus,
Helmut

Autor: ...HanneS... (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das LCD hat doch sicherlich 2 Controller, oder?

Dann versuchs mal hiermit (Anhang)

Die "PRINT-Erweiterung" folgt im nächsten Beitrag.

...

Autor: ...HanneS... (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und hier die Print-Erweiterung (Anhang)

Damit dürftest du die meisten Probleme erschlagen können.

...

Autor: Bernd Kehr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,

@Helmut: Ja, das hab ich bedacht. Nur die Frage ob ich beide
gleichzeitig verwenden kann oder ob ich erst den einen oder den anderen
aktivieren muß.



@Hannes: Vielen Dank. Nur hab ich bei dem Code das Problem schon von
Anfang an, dass die Meldung:

C:\Dokumente und Einstellungen\Bernd\Desktop\LCD_4x27.inc(261):
error: zl: Unknown instruction or macro
C:\Dokumente und Einstellungen\Bernd\Desktop\LCD_4x27.inc(261):
error: syntax error, unexpected ','

kommt und zwar bei der Zeile:  sbiw zh:zl,1               ;-1 (2
weitere Takte)



Danke an Euch beide.

Bernd.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Hannes!

Eigentlich ist es bei dem Enable-Puls nicht nötig 2 x 7 Takte zu
warten, und das bis 16MHz.
Probier mal, ob es auch ohne 14 Takte dazwischen geht.
Keine Ahnung, ob das an dem KS0066u in meinem LCD liegt oder ob das
allgemein so ist.
Das mit dem LCD-Busy hatte ich auch mal probiert und es gab nur
Probleme.
Nach ein paar Stunden Laufzeit ist der µC nicht mehr aus der
Busy-Routine rausgekommen weil das LCD den Status No-Busy nicht mehr
gesendet hat, keine Ahnung, warum.
Jetzt mach ich die Ausgabe Zeichen für Zeichen in einer 10KHz-ISR.
Die Zeichen werden aus einem LCD-Buffer im SRAM alle 100µS ausgegeben.
Nach einer kompletten LCD-Ausgabe über die ISR laufen die Zeilen- und
Spaltenzähler als Timer bis zu einem bestimmten 16Bit-Wert.
Dadurch wird eine LCD-Ausgabe auf z. B. 16 mal je Sekunde reduziert.
Ausserdem wird nach jeder LCD-Ausgabe der starre Underline-Cursor auf
eine bestimmbare Position gesetzt.
Mittels eines Blink-Zählers wird dem Underline-Cursor dann noch das
blinken beigebracht.
Das geht wahrscheinlich nur bei den trägen Standard-LCDs, weniger mit
OLED oder PLED.
Ich stell das irgend wann mal in die Code-Sammlung rein aber vielleicht
kannst Du das vorher mit deinen LCDs testen.

Gruß
Andi

Autor: Bernd Kehr (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hannes und Andi,

hab mal versucht Euer Programm zum laufen zu bewegen. Aber irgendwie
kapier ich da einiges nicht.

Ich kapier irgendwie nicht was in das Hauptprogram reingehört. Wie muß
ich FLAGS und LCDController 1 und 2 definieren?

Hab mal mein Hauptprogramme angehängt soweit ich gekommen bin.

Gruß Bernd.

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
";Für die Auswahl des zuständigen Controllers werden die zwei Bits
;"lcdcontroller1" und "lcdcontroller2" im Register "FLAGS"
;des Hauptprogramms genutzt. Sie müssen dort deklariert werden.
;Die Übergabe der Daten erfolgt über das Register "wl", das im
Hauptprogramm
;zu deklarieren ist. Weiterhin muss das Register "wh" deklariert
sein."

Autor: Bernd Kehr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andi,

hab das schon probiert.

Erhalte aber die Fehlermeldung:

"syntax error, unexpected REGDEF"

und zwar für die Zeile:

 sbr flags,(1<<lcdcontroller1)|(1<<lcdcontroller2)

Habe folgende Definitionen:

.def wh=r17
.def wl=r18
.def flags=r19
.def clock=r20
.def lcdcontroller1=r21
.def lcdcontroller2=r22


Danke.

Gruß Bernd.

Autor: ...HanneS... (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Moin...

Hoffentlich vergesse ich jetzt nix...

@Bernd:
So wird das nix...
Erstmal muss m8def.inc als allererstes eingebunden werden, sonst können
die anderen Includes nicht auf die Labels der Ports usw zugreifen.
Dann darfst du Includes, die Code enthalten, erst nach den
Interrupt-Vektoren einbinden, da sonst deine Int-Sprungtabelle nicht
stimmt.

Die Bits lcdcontroller1 und lcdcontroller2 sind keine Register, sondern
nur Bits innerhalb des Registers "flags". Sie werden von LOCATE
gesetzt und von IMPULS (LCD-Routinen) ausgewertet. Damit wird der
benötigte Controller ausgewählt.

Versuchs mal mit dem Code hier im Anhang und versuche mal, es zu
verstehen. Wenn was unklar ist, dann frag...

Das ist zwar auch nur was Halbfertiges (Unfertiges), zeigt dir aber,
wie die Dateien eingebunden werden und einige Anzeigefunktionen
aufgerufen werden.
Die etwas fortgeschrittene Version des Programms (mit angefangenem Menü
und Stellmöglichkeit der Uhr) ist aber für ein LCD mit 8x24 Zeichen
(Controller M50530) ausgelegt und gibt daher Zeichen auf Zeilen aus,
die das 4x27-LCD nunmal nicht hat.
Viel Spaß damit beim Weiterentwickeln...

@Andi:
Enable 2x7 Takte... Stimmt, es waren auch nur 1x7 Takte geplant. Aber
beim Umstellen von 1MHz auf 8MHz gab es Probleme, weshalb ich erstmal
den Impuls verlängerte. Es war aber eine kalte Lötstelle an einem
Adapter zum STK500, die Änderung ist aber noch nicht zurückgenommen.
Nunja, schaden tun die 7 Takte nicht, denn durch die Busy-Abfrage wird
die Wartezeit recht kurz gehalten.
Das Problem mit dem Festfahren in der Busy-Warteschleife wird es nicht
geben, da die Busy-Routine einen "Notausstieg" hat.

Das periodische Senden von Zeichen will ich auch noch realisieren. Aber
nicht in der ISR, sondern in der Mainloop, aber mit niedrigster
Priorität, synchronisiert vom Timer-Int mit 10ms. Aber bis das Konzept
steht, werde ich noch etliche male schlafen gehen... ;-) Außerdem ist
das nicht besonders dringend, denn die jetzige Version läuft recht
gut.

Den Underline-Cursor benutze ich nicht (auch nicht beim 8x24 mit
M50530), denn ich brauche keine "Eingabeaufforderung", will
schließlich keinen PC bauen. Und im Menü lasse ich Text oder Zahlen
blinken, so wie im Anhang die Doppelpunkte.

@Tobi:
Jawoll... Aber ich sehe ein, dass man diese Hinweise auch anders
interpretieren kann, was dann zu Missverständnissen führt.

...

Autor: Bernd Kehr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hannes,

Vielen Dank! Ich denke es wird mir weiterhelfen.

Das Includen der m8def.inc hab ich natürlich davor eingebunden und die
IR-Vektoren auch.

Vielen Dank.
Gruß vom Bodensee
Bernd.

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat es denn nun geholfen?

...

Autor: Bernd Kehr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hannes,

bin noch dabei. Komme wahrscheinlich aber erst an Wochenende dazu..
:-(

Gruß Bernd.

Autor: Bernd Kehr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Es funktioniert soweit!

Das heißt...es passiert schonmal was.
Ich hab mir das obige Programm mal angeschaut und ein bißchen
verändert.
Einzelne Bekomme ich nun dargestellt!

Nur ist das Problem, dass meine Anzeige ziemliche Probleme mit
Störungen hat. Bei jedem mal resetten zeigt sie was anderes an und nur
ganz selten  das was ich will....

das ist doch nicht normal, oder?

Gruß Bernd.

Autor: Thomas Forster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe auch das WINTEC von Pollin, dazu ein anderes 2x20 von Pollin.
Beide haben keinen original HD44780, sondern kompatible Typen. Ich habe
die gleichen Probleme wie du und vermute, es liegt am 4-Bit-Mode. Bei
8-Bit am Parallel-Port funktionieren beide immer, egal welches Timing.
Jetzt habe ich ein Batron von Pollin mit original HD44780 und das
funktioniert.

Kannst du nochmal deinen letzten ASM-Code posten, ich würde es bei
Gelegenheit mal bei mir probieren.

Thomas

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi...

Es kann sein, dass der "Notausstieg" der Busy-Abfrage etwas zu knapp
bemessen ist.
Ich wollte das 'rcall Delay5ms' hinter lcd_clear entfernen, doch da
gab das LCD nur noch Mist aus (falsche Position).

Ich habe 'Uhr2.asm' nochmal überflogen und dabei festgestellt, dass
ich vergessen habe, die Kommentare zu ändern, als ich halbfertige Dinge
gelöscht hatte. Auch einige Register und SRAM-Zellen sind schon
deklariert, werden aber von der abgespeckten Version nicht genutzt,
sorry...

Nun nochmal konkret:
Was hast du geändert und was geht jetzt nicht?
Wie ist das LCD angeschlossen?
Ist r/w auch angeschlossen?

Kannst du Hardwarefehler ausschließen? (Ich hatte auch Probleme, das
LCD zeigte nur Mist an, manchmal stimmten aber einige Zeichen und
Positionen. Es war eine fehlerhafte Lötstelle an einem Adapter zwischen
STK500 und LCD.)

...

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe ein gebrauchtes 4x16-er - mag ursprünglich auch von Pollin
gewesen sein - das mit dem üblichen Timing auf Kriegsfuss steht. Ob das
am Display liegt, oder daran, dass der angeschlossene µC mit 3V arbeitet
und die LCD-Controller einen High-Pegel von 2.8V wollen? Jedenfalls
funktioniert es wunderbar mit grundsätzlich doppelt so langem Timing.

Autor: Bernd Kehr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe aus der Datei Uhr2 alles rausgeworfen was ich nicht brauche und
rufe jeweils nur die Print Makros auf. Das sieht dann so aus:

-----------------------------------------
.include "m8def.inc"        ;Hardwaredefinitionen einbinden
.equ clock=3500000          ;Taktfrequenz des AVR

.def null=r2                ;immer Null

.def flags=r23              ;diverse Flags

.equ lcdcontroller1=6       ;Flag für Controller 1
.equ lcdcontroller2=7       ;Flag für Controller 2

.def wl=r24                 ;Working L
.def wh=r25                 ;Working H

.cseg
.org 0              ;Reset- und Interrupt-Vektoren AT-Mega 8



 rjmp reset         ;Reset Handler

.include"LCDprint.inc"      ;LCD-Ausgabefunktionen
.include"LCD_4x27.inc"      ;LCD-Treiber-Routinen für LCDs mit 2
HD44780

reset:
 ldi wl,low(ramend)         ;Stackpointer initialisieren
 out SPL,wl
 ldi wl,high(ramend)
 out SPH,wl
 clr null                   ;immer Null

 rcall lcd_init             ;Display initialisieren und löschen


locate 1,1
print 'B'
locate 4,2
print 'e'

wait: rjmp wait

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

An den anderen Dateien hab ich nix verändert.

Werde aber mal die Zeiten alle verdoppeln.

Angeschlossen ist das Display richtig. Hab es x-mal durchgemessen.
Kann es aber sein, dass bei etwas längeren Zuleitungen vom uP zum
Display Störungen das Display durcheinander bringen können?

Gruß und vielen Dank Bernd.

Autor: ...HanneS... (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest auch mal die Kommentare in den Includes lesen. Locate geht
nur von 0 bis 3.

Längere Leitungen können zu Problemen führen. Pollin schreibt in seinen
Pseudo-Datenblättern z.B., dass man einen Abblock-C an das LCD anbringen
soll, wenn die Strippen länger als einige wenige Zentimeter sind.

Läuft denn das Programm, so wie ich es gepostet hatte? - Denn hier lief
es stabil (extra getestet auf STK500 und auf externer Testplatine).
Die Weiterentwicklung läuft (in einem alten Spritzen-Etui als Gehäuse)
mit 4 Mignon-Akkus, einem Mini-Joystick zur Bedienung des Menüs, dem
Pollin-LCD 4x27 (WD-C2704M-1HNN), einer kleinen Platine mit Buchse für
den Folienleiter und einer kleinen Platine mit Mega8 und Quarz 8MHz.
Ist noch nicht fertig, läuft aber. Das LCD wird jetzt aus einem
AVR-Port (PD1) mit Strom versorgt und kann per Software ein- und
ausgeschaltet werden. Das bringt allerdings nicht das, was ich
erhoffte. Der AVR zieht ohne LCD knapp 6mA, mit LCD knapp 8mA, während
der Initialisierung etwa 14mA.

...

Autor: Bernd Kehr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So... jetzt hab ichs.

@Hannes: Das mit dem locate hab ich gerade bemerkt :-)

Hab das 5ms Delay auf 15ms verlängert. Jetzt geht es ohne Probleme.

Außerdem hab ich in:

"LCD_Impuls" noch eine kleine Schleife eingefügt. Dann geht es
zuverlässig!

Werd morgen nochmal bisschen spielen

Danke an Euch alle und speziell an Hannes!

Bernd.

Autor: Andi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Problem ist zwar gelöst aber im Anhang noch eine Busy-Funktion mit einer
Notausgangszeit von 1600µS.

MfG
Andi

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Andi...

Das müsste leider noch verändert werden, damit es in mein Konzept
eingebunden werden kann.

Denn mein Konzept geht davon aus, dass jede Steuerleitung auf einem
anderen Port liegen kann. Nur die 4 Datenleitungen müssen an ein
zusammenhängendes Nibble angeschlossen werden.

Dies ermöglicht einen flexiblen Anschluss an den AVR. Man kann sich
also erstmal alle benötigten Spezialfunktionspins des AVR reservieren,
dann ein Nibble für die LCD-Daten, dann die Steuerleitungen an die
AVR-Pins, die noch frei sind.

Habe ich alle LCD-Anschlüsse an einem Port, dann wird es (besonders
beim Mega8) schwierig, die Sonderfunktionen der internen Hardware bzw.
externen Quarz zu nutzen.

Ich werde daher den "Notausstieg" meiner Busy-Wait-Routine drastisch
vergrößern, die rund 100µs sind wirklich zu kurz.

Andi, es geht mir nicht darum, dir zu widersprechen (auch wenn es
manchmal so aussehen sollte).
Aber du siehst die Dinge aus der Akademiker-Sicht, ich aus der Sicht
des Hobby-Bastlers (ohne Abitur, aber mit langjährig antrainiertem Sinn
für technische Zusammenhänge).
Übrigens haben mir deine Beiträge auch schon oft weiter geholfen. Wenn
du dir LCD-Print mal genauer ansiehst, erkennst du sicherlich, dass ich
vorher deine Routinen (und die von Peter) analysiert habe und einige
Algorithmen übernommen habe (nachdem ich sie verstanden habe!). Ich
beziehe mich jetzt auf das hier:
http://www.mikrocontroller.net/forum/read-4-127504...
Mein Dank wird dir also ewig nachschleichen... ;-)

Beste Grüße...
...HanneS...

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ichs mir doch gedacht, Deine Routinen zur Ausgabe von Zahlenwerten
kamen mir doch irgend wie bekannt vor ;-)
Schon schön wie der Download-Zähler für die PrintBCD-Routinen hoch geht
aber leider schreibt niemand Kommentare rein mit Verbesserungen,
Anregungen, gut oder schlecht.

Ich aber auch nix Akademiker, pures Hobby und Bastelei.
Habe hier nur meine alte Busy-Funktion zur Verfügung gestellt welche ja
auch nur Bit-Weise EN, RS und RW ändert.
Kann man sich ja leicht am eigenen System anpassen.
Evtl. auch den Wert für "out lcd_ddr,r24" noch ändern.
Ist halt nur wichtig, das DB4 - DB7 auf Input gesetzt wird.
Allerdings fällt mir gerade auf, das ich vergessen habe die Pullups für
DB4 bis DB7 aus- oder einzuschalten (testet man durch probieren).
Na ja, egal.

Seit ich die Zeichenausgabe in eine ISR gepackt habe benutze ich Busy
nicht mehr da für je 1 Zeichen/Steuercode aus der ISR nur 45 Takte alle
100µS vergehen und in der "Austastlücke" gerade mal 20.
Das Main-Programm läuft auch wesentlich "flüssiger" ab und muß keine
2000µS für die LCD-Ausgabe verschwenden.

Ein entsprechendes "Printing-System" zur Ausgabe von Zeichenketten
und entsprechende Steuercodes unter Zeichencode 32 welches aus einem
"Flash-String" gelesen wird habe ich bereits in Reserve.

MfG
Andi

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Andi...

Tja, ich schau mir zwar gern mal fremden Code an, eigne mir dabei auch
Algorithmen an, sofern ich sie verstehe, verwende diese fremde Codes
aber nicht unverstanden. Ich nutze die einschlägigen Quellen nicht als
"Baukasten", aus dem ich meine Programme zusammensetze, sondern
schreibe meinen Code selbst. Selbst wenn ich einen kompletten
Algorithmus übernehme (z.B. Peters Tasten-Entprellung) ist dieser nicht
maschinell kopiert, sondern (an das eigene Konzept angepasst) neu
geschrieben (erkennbar an den Kommentaren).
Ich habe da lieber ein etwas schlechteres Programm, das ich aber
verstehe und jede Zeile nachvollziehen kann, als ein sehr gutes
Programm mit zusammengesuchten Modulen, die ich nicht hundertprozentig
nachvollziehen kann.
Dies ist vielleicht auch der Grund, weshalb ich den Einstieg in C weit
vor mir herschiebe.
Und mit (Eigenbau-) Modulen wie LCD_Print und den "Treibern" für
verschiedene LCDs wird ASM ja auch immer interessanter.

Beste Grüße...
...HanneS...

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist schon gut, brauchst Dich nicht rechtfertigen.
Habe in Deinem Code meine Zahlen-ASCII-Wandler-Routinen in veränderter
Weise erkannt und ist in Ordnung.
Find ich gut, das jemand aus anderen Codes das übernimmt was er
versteht und/oder benötigt.

MfG
Andi

Autor: DerDings Der (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin grad dabei meine LCD-routine so umzuschreiben, dass die Daten
und Steuerleitungen an verschiedenen Ports hängen können, seid 2 tagen
probiere ich alles mögliche aus, habe dabei aber immer das selbe
Problem.

wenn ich in der Subroutine die für das senden eines Commandos zuständig
ist versuche die Datenleitungen die quasi nicht verwendet werden zu
erhalten und nicht mit nullen zu überschreiben(einlesen und in das
entsprechende Register zu intrahieren), funktioniert gar nichts mehr.
bei der routine für die daten funktioniert es auf die selbe weise
allerdings einwandfrei. Eigentlich sollten Daten und CommandoBytes aber
bis auf das gesetzte RS-Rit beim Senden von Daten auf die selbe weise
gesendet werden.
Das LCD ist momentan noch an einem einzigen port angeschlossen, das
sollte doch aber trotzdem funktionieren?

die beiden routienen heissen lcd_data und lcd_command, wobei die beiden
auskommentierten zeilen in lcd_command die Probleme machen.

vieleich weiss ja jeman wo der Hund begraben liegt.
Vielen Dank schonmal
mfg
DerDings Der

Autor: DerDings Der (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
sorry, da bin ich wohl falsch abgebogen, hier ist die richtige datei,
die andere bitte nicht beachten

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(1) Data/Command Abfolge falsch:

E rauf
4-Bit Daten anlegen
1usec warten
E runter

1usec warten

E rauf
4-Bit Daten anlegen (die anderen)
1usec warten
E runter

1usec warten

und jetzt erst auf Busy testen.

(2) Timing von E in wbf beachten, sieht mir zu schnell aus.

Mehr habe ich mir nicht angesehen.

Autor: DerDings Der (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist es nicht besser wenn die Daten zuers stabil anliegen, und dann der
Enable Pin gepunsed wird? sollte doch aber zumindest keinen unterschied
machen, ich werds aber mal ausprobieren.
was mir aber grad auffällt, im datenblatt stehts tatsächlich so drin,
vermutlich werden die Daten erst mit fallender Flanke übernommen.

was das prüfen des busy-flags angeht habe ich mir gedacht, dass ich
wenn ich unmittelbar bevor einer operation (wenn seit der letzten schon
jede menge zeit vergengen ist) das busy-flag prüfe, die wartezeit
minimieren kann. wobei hierzu das datenblatt keine eindeutige aussage
macht.

mfg DerDings Der

Autor: Simon Küppers (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ers daten, dann E !

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo...

Du liest den Port ein, maskierst das benötigte Nibble, ORst deine Daten
rein und ... Neee, gibst nicht etwa die Daten wieder an den Port aus,
sondern rufst erstmal lcd_wbf auf und lässt dir von lcd_wbf den Port
(unterm Hintern) ändern... Das sein nix gut... 8-((

 in iotmp, LCD_D_PORT
 andi iotmp, 0b11110000
 ;or iobuf, iotmp
-----
 rcall lcd_wbf      ;wait until LCD in ready
-----
 out LCD_D_PORT, iobuf    ;output

Abhilfe:

Du rufst lcd_wbf gleich am Anfang der Routine auf, noch ehe du den Port
einliest.

Den Rest habe ich mir nicht näher angesehen, auch nicht lcd_wbf.

Übrigens: Einen echten Vorteil hast du erst, wenn du jede
LCD-Steuerleitung an einen anderen Port anschließen kannst und auch bei
den Datenleitungen das Nibble wählen kannst (oberes oder unteres). Auf
diese Art gelingt es dir, die Spezialfunktionspins des AVRs (Mega8)
frei zu bekommen.

...

Autor: DerDings Der (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo, und danke für die antworten,

das problem lag darin, dass lcd_wbf die RW-leiung lich wieder
zurückgesetzt hat. jetzt funktioniert es soweit.
vielen Dankt auf jeden fall, denn ohne die tipps währe ich
wahrscheinlich nicht drauf gekommen
mfg
DerDings Der

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich wollte wissen, ob mir jemand leicht verständlich erklären kann, wie
ich das Pollin-LCD ansteuern muss, damit es klappt.
Ich verstehe nämlich Assembler überhaupt nicht. Außerdem wird ein
Anfangs richtiger Code wieder berichtigt, weil er doch falsch war, usw.

Weil ich hoffe, dass die Lösung hier die richtige ist, bitte ich um
eine Anleitung, wie ich alles machen muss.

Ich "programmiere" (wenn man es programmieren nennen darf) mit
Bascom-AVR und will über einen At90S2313 einen Text auf dem Pollin
WINTEK WD-C2704M ausgeben.

Hab schon so viel ausprobiert. Oft mit geringem Erfolg. Zeigt eben
einfach Zeichen an, die da nicht hingehören.

Ich hoffe, mir kann jemand helfen.

Danke!

Simon

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich wollte wissen, ob mir jemand leicht verständlich erklären kann,
wie
ich das Pollin-LCD ansteuern muss, damit es klappt.
Ich verstehe nämlich Assembler überhaupt nicht. Außerdem wird ein
Anfangs richtiger Code wieder berichtigt, weil er doch falsch war,
usw.

Weil ich hoffe, dass die Lösung hier die richtige ist, bitte ich um
eine Anleitung, wie ich alles machen muss.

Ich "programmiere" (wenn man es programmieren nennen darf) mit
Bascom-AVR und will über einen At90S2313 einen Text auf dem Pollin
WINTEK WD-C2704M ausgeben.

Hab schon so viel ausprobiert. Oft mit geringem Erfolg. Zeigt eben
einfach Zeichen an, die da nicht hingehören.

Ich hoffe, mir kann jemand helfen.

Danke!

Simon

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit BASCOM kann ich das auch nicht.

Wie spricht man unter BASCOM denn ein 4x40-LCD an? Das hat doch auch 2
Controller. Damit müsste das 4x27-LCD doch auch laufen.

"Außerdem wird ein
Anfangs richtiger Code wieder berichtigt, weil er doch falsch war,
usw."

Nunja, bei mir läuft der (von mir gepostete) Code stabil, was nicht
heißt, dass man ihn nicht verbessern könnte. Der Zähler in der Routine
zum Warten auf das Busy-Flag könnte etwas höher gesetzt werden oder
auch ganz entfernt werden.
Man kann auch das Prüfen des Busy-Flags durch eine Warteschleife
ersetzen und die Rechenleistung vertrödeln. Aber dazu sollte man sich
schon auf Assemblerebene "herablassen".

Da BASCOM ziemlich alles tut, den User zu "verdummen", wird man damit
nur schwer Hardware ansprechen können, für die BASCOM keine fertigen
Bibliotheken mitbringt. Das ist die Kehrseite des "schnellen Erfolgs"
mit diesem "AVR-Baukasten". Man sollte also darauf achten, dass man
sich nur BASCOM-kompatible Hardware anschafft.

...

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist ja komisch, dass meine Antwort nicht hier erscheint, sondern hier:

http://www.mikrocontroller.net/forum-extern/read-1...

...

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähm...Hannes...
Keine Ahnung, was inzwischen alles war, aber Deine Antwort erscheint
doch hier und Du hast mit Deinem Link einen "rekursiven" Link erzeugt
der das hier 2 Posts weiter oben anzeigt.
Wenn das mal das Forum verkraftet, hoffentlich ist genügend Stack
vorhanden ;-)

MfG
Andi

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach Andi...

Dann schau dir den Link mal genauer an, das eine ist Forum, das andere
forum-extern. Es waren vermutlich Wartungsarbeiten.

Gruß (und viel Spaß bei der Party mit den bunten Eiern)...
...HanneS...

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ouh :o
Jetzt bin ich aber baff!
Habe mich immer gewundert, warum beim Klick in einer Benachrichtigung
das Format so komisch ist aber nie auf die Adresse gekuckt.
Sorry Hannes!

MfG
Andi

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, FROHE OSTERN!

MfG
Andi

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vier Augen sehen eben mehr als zwei. Eigentlich schade, dass wir keine
Nachbarn sind.

...

Autor: Andreas Bachschneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hannes,

Du hast geschrieben, dass Du Dein Pollin-LCD 4x27 (WD-C2704M-1HNN) über
eine Buchse angeschlossen hast. Ich habe ebenfalls das Display und bin
verzweifelt auf der Suche nach einer passenden Buchse zum Anschluß des
Folienleiters der vom Display kommt (saubere Lösung). Die Fa. Pollin
konnte mir nicht weiterhelfen. Wenn ich es richtig lese, hast Du Dein
Display über genau eine solche Folienleiter-Buchse angeschlossen.
Könntest Du mir vielleicht sagen um welche Buchse es sich handelt, und
wo ich sie bekomme? Danke

Viele Grüße
Andreas Bachschneider

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andreas...

Der verwendete Steckverbinder hat einige Pins mehr als benötigt, man
muss den Folienleiter also vorsichtig und einseitig "auf Anschlag"
einführen.
Dass Pollin dir nicht helfen konnte hat vermutlich mit deren
Kenntnisstand zu tun. ;-)
Denn der verwendete Steckverbinder stammt von Pollin, und zwar aus dem
Sortiment Computersteckverbinder.

Viel Erfolg...
...HanneS...

Autor: Alexander Muthmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also nachdem ich im anderen Threat den link hierdrauf bekommen hab und
mein erstes Problem auch schon gelöst ist, nun noch was anderes:

Ich bekomm das "print16" Macro nicht zum laufen ^^

ich weise am Anfang vom Programm temh und teml 2 Werte zu (also einmal
das Low und einmal das High von ner Konstanten, zum Testen)
               .equ temperaturtest = 766
               (...)
               ldi temh, HIGH(temperaturtest)
       ldi teml, LOW(temperaturtest)


ausgabe sollte sein: 76,6

wenn ich jetzt aufrufe:
print16 temh, teml , 0, 1  => 766
print16 temh, teml , 1, 1  => 766
print16 temh, teml , 2, 1  => 766
print16 temh, teml , 3, 1  => 0766
print16 temh, teml , 4, 1  => 0766
print16 temh, teml , 5, 1  => ,766
print16 temh, teml , 6, 1  => 766

welches ist der richtige aufruf für 76,6??? keiner der von mir
probierten ist es, und das Argument @3 interessiert das programm
anscheinend auch nicht wirklcih.

Ich habe von der  LCD_4x27.inc und LCDprint.inc alles übernommen was
gebraucht wird, und sonst nichts geändert...

Wär nett wen mir da jemand weiterhelfen kann.

Autor: Alexander Muthmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So habs jetz mal mit ner 8 bit zahl probiert (197):

print16 temh, teml , 0, 1  => 1,97
print16 temh, teml , 1, 1  => 1,97
print16 temh, teml , 2, 1  => 1,97
print16 temh, teml , 3, 1  => 01,97
print16 temh, teml , 4, 1  => 01,97
print16 temh, teml , 5, 1  => 1,97
print16 temh, teml , 6, 1  => 1,97

sprich immer bei 3 und 4 is was anders^^ das hat doch bestimmt was zu
bedeuten, oder? :)

Autor: Alexander Muthmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
noch einwas:

wenn ich 199, 200 und 201 als daten nehm kommt folgendes:

1,99
20
201

sprich nicht der übergang 8 => 16 bit is wichtig sondern wohl 199 =>
200 ^^

wünsch euch nen schönen abend und danke!

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also deine Probleme sind mir noch nicht aufgefallen. Ich behaupte aber
auch nicht, dass mein Code 100% ok ist.

Zum Aufruf:

;  print16 H-reg,L-Reg,Komma,[using]+[sig]+[fnul]
                    ;Gibt 16-Bit-Zahl als Ziffern aus
                    ;H-Reg,L-Reg enthält die Zahl
                    ;Komma ist die Anzahl der Nachkommastellen
                    ;using erzwingt formatierte Ausgabe (Print Using)
                    ;sig erzwingt Vorzeichen
                    ;fnul erzwingt Führungsnullen

Wobei die Konstanten 'using', 'sig' und 'fnul' die Einzelbits 5,
6 und 7 benennen:

.equ using=0b00100000   ;Flag für formatierte Ausgabe (Print Using)
.equ sig = 0b01000000   ;Flag für Vorzeichen-Zahl (signed Integer)
.equ fnul= 0b10000000   ;Flag für Führungsnullen

Im aufrufenden Macro werden dann Kommastellen und die Flags für die
Formatierung zu einer Variablen zusammengefasst:

 ldi wh,(@3 & $e0)|16|(6-(@2 & 15))   ;Mode-Flags und Komma-Position

Dein Aufruf:

print16 temh, teml , 0, 1  => 1,97
print16 temh, teml , 1, 1  => 1,97
print16 temh, teml , 2, 1  => 1,97
print16 temh, teml , 3, 1  => 01,97
print16 temh, teml , 4, 1  => 01,97
print16 temh, teml , 5, 1  => 1,97
print16 temh, teml , 6, 1  => 1,97

nimmt aber als Formatieranweisung nicht die vereinbarten Konstanten
oder deren Bits (5, 6 und 7) sondern die Zahl 1 (die dazu unzulässig
ist). Da könnte sich etwas verheddern... :D

Ich habe im Moment keine aufgebaute Hardware griffbereit, kann es also
im Moment nicht testen. Werde es aber bei Gelegenheit tun.

Ich muss die Routinen sowiso überarbeiten, denn ich beginne ein Projekt
mit Mega32 und LCD 4x20. Da muss also der 4x20-Treiber geschrieben
werden (mit Locate, Umleitung auf UART und Interruptausgabe über
Ringbuffer). Ein Equivalent für das 8x24-LCD mit Controller M50530 ist
hier schon beschrieben:
http://www.hanneslux.de/avr/stopuhr/index.html

Und bei der Gelegenheit werden auch die Printroutinen etwas umgestellt,
so dass mehr mit SRAM gemacht wird. Ich will dabei die Macros etwas
schlanker gestalten.

Voraussichtlich bekommt die LCD-Ausgabe auch Exklusiv-Register, das
spart dann jede Menge Push & Pop in den Macros.

...

Autor: Alexander Muthmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok also das mit dem Using usw hab cih jetz verstanden, sprich wenn ich
nen vorzeichen haben will mach ich:
print16 temh, teml , 6, sig


aber wie bekomm ich jetzt bei einer 3 stelligen zahl nach den ersten
beiden stellen das komma? das hab ich noch nicht so ganz geraft, hab
ich da auch was übersehen?

Autor: Hannes Lux (hannes)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> aber wie bekomm ich jetzt bei einer 3 stelligen zahl nach den ersten
> beiden stellen das komma?

Falsche Betrachtungsweise...

Du kannst im Vorfeld nicht wissen, wieviele Stellen die Zahl haben
wird. Daher kann man die Komma-Ausgabeposition auch nicht von vorn
zählen. Die Routinen sind Ganzzahl-Routinen. Daran ändert sich auch
nix, wenn sie eine Möglichkeit bieten, in die Ziffernfolge die
zusätzliche Ausgabe eines Kommas einzubinden. Sinn der Aktion ist es,
dass man, wenn man z.B. einen Wert zweistellig haben will, einfach mit
dem Hundertfachen des Wertes rechnet (die Rechenroutine so auslegt,
dass das Hundertfache des gewünschten Ergebnisses herauskommt) und dann
vor den letzten zwei Stellen das Komma ausgeben lässt. Und damit das
Ganze flexibel ist, kann man angeben, wo das Komma ausgegeben werden
soll, also wieviele Stellen hinter dem Komma stehen sollen.

Folgender Programmcode, noch in der Reset-Routine eines Programms, gibt
das aus, was im Anhang zu sehen ist:
;Debug --------------------------------

 ldi r16,low(12345)
 ldi r17,high(12345)

 locate 0,0
 print16 r17,r16,0,0

 locate 1,0
 print16 r17,r16,1,0

 locate 2,0
 print16 r17,r16,2,0

 locate 3,0
 print16 r17,r16,3,0

stop:
 rjmp stop

Da hättest du aber auch selbst drauf kommen können. Eine Analyse des
Codes hätte dir das sicher gezeigt, denn die Kommentare stehen da nicht
zum Spaß drin. Und eigentlich sollte man nur Code verwenden, den man
auch versteht, anderenfalls kann es böse Überraschungen geben. Man muss
ja nicht alles selbst schreiben, aber zumindest verstehen...

...

Autor: Hannes Lux (hannes)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und hier nochmal das Ergebnis bei einer dreistelligen Zahl...

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.