Initialisierung alphanumerisches LCD (HD44780)

Display Clear Pause dahinter verlängern

Hallo @ Y....,
das ist klasse, das Display hält den DDRAM- Inhalt auch nach Power off.
Das ist auch beabsichtigt so, damit Stromausfälle nicht zum Chaos bei den Getränkeautomaten führen....-))

OK.
Es zeigt, daß die Zeit hinter dem Display Clear nicht lang genug ist, um das DDRAM auch zu löschen.

Da müßte jetzt nochmal im Code angesetzt werden.

Wie hoch ist die CPU-Frequenz des ATMega... und hast Du auch mal den Taktoszillator mal darauf getestet, obv der auch auf Sollfrequenz rennt?


Gruß
Oskar01
 
Ich habe leider kein Oszi und auch keinen Logik-Analizer. Aber ich experimentiere einmal mit den Löschzeiten. Ich arbeite mit einer Taktfrequenz von 1 MHz um die Schleifen nicht so gross zu programmieren und weil der Debugmodus vom AVR Studio nur 1 MHz macht.
 
Also er zeigt mir den Müll an wenn ich den Code in den MC schreibe. Nach einem Neustart, Display und MC werden von der Spannungsversorgung getrennt, zeigt das Display nichts mehr an. Ich schalte die Spannungsversorgung von Display und MC gleichzeitig ein.
 
So, mit dem Code bleibt das Display immer leer.

Code:
;Initialisierungstest fuer LCD-Anzeige
;mit KS0066U-kompatiblem Controllerchip
;8-Bit-Mode; 4-Zeilen
;Daten-/Steuerbits auf PORTA, Bit D0 bis D7
;Enableimpuls erster Controller auf PORTC, Bit D0 
;RS-Impuls auf  PORTC, Bit D1
;Enableimpuls zweiter Controller auf PORTC, Bit D2
;R/WQuer auf Masse fest verdrahtet;
;Routine wird einmal durchlaufen und
;sistiert dann beim Label "Schleife" 
;mit Ausgabe TEXT*TEXT*TEXT* etc... 
;CPU Takt 1 MHz
;Verzögerung1 = 510µs
;Verzögerung2 = 5ms
;Verzögerung3 = 1,1s

.nolist
.include "m128def.inc"
.list

.def zeit 	= r16
.def zeit1 	= r17
.def zeit2 	= r18
.def temp 	= r19
.def temp1 	= r20

.equ daten 	= porta
.equ impuls = portc



;Stack Initialisierung:

	ldi		temp, low(ramend)
	out		SPL,  temp
	ldi		temp, high(ramend)
	out		SPH,  temp

;Initialisierung
;Datenrichtungsregister auf 8-Bit-Breite
;setzen und interne Pull-up-Widerstaende aktivieren:

	ldi		temp, 	0xFF
	out		ddra,	temp
	ldi		temp,	0xFF
	out		ddrc,	temp
	rjmp	Start

Start:

	rcall	Einschaltverzoegerung
	rjmp	Hauptprogramm

Einschaltverzoegerung:

	rcall	Verzoegerung2
	rcall	Verzoegerung2
	rcall	Verzoegerung2
	rcall   LCD_Initialisierung

Hauptprogramm:

	rcall	Text_Ausgabe

LCD_Initialisierung:

	;LCD Reset, Acht-Bit-Modus initialisieren:

	ldi		temp,	$30
	out		daten,	temp
	sbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 0
	rcall	Verzoegerung2
	ldi		temp,	$30
	out		daten,	temp
	sbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 0
	rcall	Verzoegerung1
	ldi		temp,	$30
	out		daten,	temp
	sbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 0
	rcall	Verzoegerung1	;Aller guten Dinge sind drei

	;Zeilenzahl vier, Display einschalten:

	ldi		temp,	$38	;Extension D/L, N "und" F 
	out		daten,	temp
	sbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 0
		
	;Anzeige ON/OFF Control definieren:

	ldi		temp,	$08	;Display off, 4-zeilig ein
	out		daten, temp		;"und" Hex01 => 4 Zeilen
	sbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 0

	;Display clear, cursor home:
	
	ldi		temp,	$01	;es werden "space", Hex 20
	out		daten,  temp		;in alle Display-RAM-Stellen
	sbi		impuls, 0		;geschrieben, dauert laenger
	rcall	Verzoegerung1
	cbi		impuls, 0
	rcall	Verzoegerung2
	rcall	Verzoegerung2
	rcall	Verzoegerung2
		
	;Entry Mode Set:
	
	ldi		temp,	$04	;Cursor increment, no shift
	out		daten,  temp
	sbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 0
	ret	

	;Anzeige ON/OFF Control definieren:

;	ldi		temp,	0b00111000	;4-zeilig wieder aus
;	out		daten,  temp		;Acht-Bit-Modus ein	
;	sbi		impuls, 0
;	rcall	Verzoegerung1
;	cbi		impuls, 0
;	rcall	Verzoegerung2
;	nop

	;Cursor move, display shift:
	
;	ldi		temp,	0b00010000	;Cursor increment, no shift
;	out		daten,  temp		;Diese Aktion wird jedesmal ohne
;	sbi		impuls, 0		;Schreib-Lese-Funktion
;	rcall	Verzoegerung1		;ausgeführt
;	cbi		impuls, 0		;dient zur "Suchfunktion"
;	rcall	Verzoegerung2	;und, um den Inhalt zu "lesen"
	
	;Display on, cursor on:
	
;	ldi		temp,	0b00001111	;Cursor on/increment, no blink
;	out		daten,  temp
;	sbi		impuls, 0
;	rcall	Verzoegerung1
;	cbi		impuls, 0
;	rcall	Verzoegerung2

	;Display clear, cursor home:

;	ldi		temp,	0b00000001	;es werden "space", Hex 20
;	out		daten,  temp		;in alle Display-RAM-Stellen
;	sbi		impuls, 0		;geschrieben, dauert laenger
;	rcall	Verzoegerung1
;	cbi		impuls, 0
;	rcall	Verzoegerung2
;	rcall	Verzoegerung2

Text_Ausgabe:

	rcall 	Verzoegerung2
	nop	
	sbi 	impuls, 1
	rcall	Verzoegerung1
	sbi		impuls, 0
	ldi		temp1,  $54		;T
	out		daten,  temp1
;	rcall	Verzoegerung2
	nop
	nop
	cbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 1
	sbi		impuls, 1
	sbi		impuls, 0
	ldi		temp1,  $65		;e
	out		daten,  temp1
;	rcall	Verzoegerung2
	nop
	nop
	cbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 1
	sbi 	impuls, 1
	sbi 	impuls, 0
	ldi		temp1,  $78		;x
	out		daten,  temp1
;	rcall	Verzoegerung2
	nop
	nop
	cbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 1
	sbi		impuls, 1
	sbi		impuls, 0
	ldi		temp1,  $74		;t
	out		daten,  temp1
;	rcall	Verzoegerung2
	nop
	nop
	cbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 1
	sbi		impuls, 1
	sbi		impuls, 0
	ldi		temp1,  $2A		;*
	out		daten,  temp1
;	rcall	Verzoegerung2
	nop
	nop
	cbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 1
	nop
	nop
	rcall 	Text_Ausgabe
;	rcall 	Ende

Verzoegerung1:

	ldi	zeit,	0xFF

Verzoegerungs_Schleife:

	dec	zeit 
	cpi	zeit, 	1
	brlt	Verzoegerungs_Schleife
	ret

Verzoegerung2: 

	ldi zeit,	0xDF
	ldi zeit1,	0x89

Verzoegerungs_Schleife2: 
	
	dec	zeit 
	cpi	zeit, 	1
	brlt	Verzoegerungs_Schleife2
	ldi zeit,	0xFF
	dec	zeit1
	cpi	zeit1,	1
	brlt	Verzoegerungs_Schleife2
	ret

Verzoegerung3:

	ldi zeit,	0xFF
	ldi zeit1,	0xE0
	ldi zeit2,	0x90
	rjmp 	Verzoegerungs_Schleife3

Verzoegerungs_Schleife3:

	dec	zeit 
	cpi	zeit, 	1
	brlt	Verzoegerungs_Schleife3
	ldi zeit,	0xFF
	dec	zeit1
	cpi	zeit1,	1
	brlt	Verzoegerungs_Schleife3
	ldi zeit1,	0xFF
	dec	zeit2
 
Hallo @ Y,
im abgeänderten Code wird zumindest ein rcall nicht mit ret abgeschlossen, hier hängt sich das Programm dann auf =>Stack-Overflow.
Nimm rjmp Textausgabe anstatt rcall textausgabe.

Die Sache kommt dann richtig in Schwung, gelle?
Oder nochmal Kommando zurück bis zu dem Punkte, wo das Display noch was anzeigte.

Gruß von Oskar01
 
Also beim schreiben bringt er mir wieder den Müll aber sonst absolut nichts und ich weiß leider nimmer mehr wie der Code war als er mir ( * *) angezeigt hatte.

Ich dachte mir das ich bevor ich die Daten übertrage, für die Schrift, erst einmal alle Ports auf null setze und nach dem Enableimpuls noch eine Pause einfüge. Hat aber auch nichts gebracht.

Also es zeigt noch immer nichts an, ausser ich schreibe den Code in den MC, dann verschiebt er einen 5 stelligen Text um eine Position nach rechts. Aber nach dem ich die Stromversorgung von beiden wieder getrennt und geschlossen habe zeigt es wieder nichts an. Wenn ich dann aber den Code wieder in den MC schreibe kommt wieder der selbe Text und eine Stelle nach rechts verschoben.

Hier mal wieder den Code, ich weiß nimmer warum es das nicht so macht wie ich das gern hätte.

Code:
;Initialisierungstest fuer LCD-Anzeige
;mit KS0066U-kompatiblem Controllerchip
;8-Bit-Mode; 4-Zeilen
;Daten-/Steuerbits auf PORTA, Bit D0 bis D7
;Enableimpuls erster Controller auf PORTC, Bit D0 
;RS-Impuls auf  PORTC, Bit D1
;Enableimpuls zweiter Controller auf PORTC, Bit D2
;R/WQuer auf Masse fest verdrahtet;
;Routine wird einmal durchlaufen und
;sistiert dann beim Label "Schleife" 
;mit Ausgabe TEXT*TEXT*TEXT* etc... 
;CPU Takt 1 MHz
;Verzögerung1 = 510µs
;Verzögerung2 = 5ms
;Verzögerung3 = 1,1s

.nolist
.include "m128def.inc"
.list

.def zeit 	= r16
.def zeit1 	= r17
.def zeit2 	= r18
.def temp 	= r19
.def temp1 	= r20

.equ daten 	= porta
.equ impuls = portc



;Stack Initialisierung:

	ldi		temp, low(ramend)
	out		SPL,  temp
	ldi		temp, high(ramend)
	out		SPH,  temp

;Initialisierung
;Datenrichtungsregister auf 8-Bit-Breite
;setzen und interne Pull-up-Widerstaende aktivieren:

	ldi		temp, 	0xFF
	out		ddra,	temp
	ldi		temp,	0xFF
	out		ddrc,	temp
	rjmp	Start

Start:

	rcall	Einschaltverzoegerung
	rjmp	Hauptprogramm

Einschaltverzoegerung:

	rcall	Verzoegerung2
	rcall	Verzoegerung2
	rcall	Verzoegerung2
	rcall   LCD_Initialisierung

Hauptprogramm:

	rcall	Text_Ausgabe

LCD_Initialisierung:

	;LCD Reset, Acht-Bit-Modus initialisieren:

	ldi		temp,	0b00110000
	out		daten,	temp
	sbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 0
	rcall	Verzoegerung2
	ldi		temp,	0b00110000
	out		daten,	temp
	sbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 0
	rcall	Verzoegerung1
	ldi		temp,	0b00110000
	out		daten,	temp
	sbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 0
	rcall	Verzoegerung1		;Aller guten Dinge sind drei

	;Zeilenzahl vier, Display einschalten:

	ldi		temp,	0b00111000	;Extension D/L, N "und" F 
	out		daten,	temp
	sbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 0
		
	;Anzeige ON/OFF Control definieren:

	ldi		temp,	0b00001000	;Display off, 4-zeilig ein
	out		daten, temp			;"und" Hex01 => 4 Zeilen
	sbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 0

	;Display clear, cursor home:
	
	ldi		temp,	0b00000001	;es werden "space", Hex 20
	out		daten,  temp		;in alle Display-RAM-Stellen
	sbi		impuls, 0			;geschrieben, dauert laenger
	rcall	Verzoegerung1
	cbi		impuls, 0
	rcall	Verzoegerung2
;	rcall	Verzoegerung2
;	rcall	Verzoegerung2
		
	;Entry Mode Set:
	
	ldi		temp,	0b00000110	;Cursor increment, no shift
	out		daten,  temp
	sbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 0
	ret	

	;Anzeige ON/OFF Control definieren:

;	ldi		temp,	0b00001111	;4-zeilig wieder aus
;	out		daten,  temp		;Acht-Bit-Modus ein	
;	sbi		impuls, 0
;	rcall	Verzoegerung1
;	cbi		impuls, 0
;	rcall	Verzoegerung2
;	nop

	;Cursor move, display shift:
	
;	ldi		temp,	0b00010000	;Cursor increment, no shift
;	out		daten,  temp		;Diese Aktion wird jedesmal ohne
;	sbi		impuls, 0			;Schreib-Lese-Funktion
;	rcall	Verzoegerung1		;ausgeführt
;	cbi		impuls, 0			;dient zur "Suchfunktion"
;	rcall	Verzoegerung2		;und, um den Inhalt zu "lesen"

	;Display on, cursor on:
	
;	ldi		temp,	0b00001111	;Cursor on/increment, no blink
;	out		daten,  temp
;	sbi		impuls, 0
;	rcall	Verzoegerung1
;	cbi		impuls, 0
;	rcall	Verzoegerung2

	;Display clear, cursor home:

;	ldi		temp,	0b00000001	;es werden "space", Hex 20
;	out		daten,  temp		;in alle Display-RAM-Stellen
;	sbi		impuls, 0			;geschrieben, dauert laenger
;	rcall	Verzoegerung1
;	cbi		impuls, 0
;	rcall	Verzoegerung2
;	rcall	Verzoegerung2

Text_Ausgabe:

	nop
	ldi		temp,	0b00000000
	out		daten,	temp
	nop	
	sbi 	impuls, 1
	sbi		impuls, 0
	ldi		temp1,  0b01010100	;T
	out		daten,  temp1
	rcall	Verzoegerung2
	nop
	nop
	cbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 1
	sbi		impuls, 1
	sbi		impuls, 0
	ldi		temp1,  0b01100101	;e
	out		daten,  temp1
	rcall	Verzoegerung2
	nop
	nop
	cbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 1
	sbi 	impuls, 1
	sbi 	impuls, 0
	ldi		temp1,  0b01111000	;x
	out		daten,  temp1
	rcall	Verzoegerung2
	nop
	nop
	cbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 1
	sbi		impuls, 1
	sbi		impuls, 0
	ldi		temp1,  0b01110100	;t
	out		daten,  temp1
	rcall	Verzoegerung2
	nop
	nop
	cbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 1
	sbi		impuls, 1
	sbi		impuls, 0
	ldi		temp1,  0b00101010	;*
	out		daten,  temp1
	rcall	Verzoegerung2
	nop
	nop
	cbi		impuls, 0
	rcall	Verzoegerung1
	cbi		impuls, 1
	nop
	nop
	rjmp 	Text_Ausgabe
;	rjmp 	Ende

Verzoegerung1:

	ldi	zeit,	0xFF
	rjmp 	Verzoegerungs_Schleife

Verzoegerungs_Schleife:

	dec	zeit 
	cpi	zeit, 	1
	brlt	Verzoegerungs_Schleife
	ret

Verzoegerung2: 

	ldi zeit,	0xDF
	ldi zeit1,	0x89
	rjmp 	Verzoegerungs_Schleife2

Verzoegerungs_Schleife2: 
	
	dec	zeit 
	cpi	zeit, 	1
	brlt	Verzoegerungs_Schleife2
	ldi zeit,	0xFF
	dec	zeit1
	cpi	zeit1,	1
	brlt	Verzoegerungs_Schleife2
	ret

Verzoegerung3:

	ldi zeit,	0xFF
	ldi zeit1,	0xE0
	ldi zeit2,	0x90
	rjmp 	Verzoegerungs_Schleife3

Verzoegerungs_Schleife3:
 
Der RS Impuls fehlt noch......etc...

Hallo @Y....,
im Anhang der korrigierte Code.
Die Return-Anweisungen fehlen teilweise.
Also, wird ein Unterprogramm per rcall aufgerufen, kommt der Stack in Aktion, der sichert die Rücksprungadresse, wozu er aber nie aufgefordert wird zurückzuspringen, er soll das Programm genau eine Zeile hinter dem zuletzt aufgerufenen rcall-Befehl fortsetzen.
Es können auch mehrere rcalls aus einem Unterprogramm aufgerufen werden, nur, immer (mit wenigen Ausnahmen) dann mit ret abschließen.
Das zum einen.

Das RS (Register Select) Bit muß bei Kommandomodus-( Steuerbit)-Setzen auf low, bei Daten- und Textdarstellung auf high.
Das kann durch
ldi temp, steuerport Steuerbit Pinout
out steuerport, temp

erfolgen

oder durch Direktsetzung von Bit mit
sbi
und wenns
low werden soll
cbi


Hoffe es klappt nun,


Gtuß von Oskar01
 

Anhänge

  • Initialisierung_LCD.txt
    4,4 KB · Aufrufe: 4
Hallo Oskar,

also es hat sich noch nichts geändert, leider. Aber kann es sein das ich den zweiten Controller auch erst einmal initialisieren muss damit das Display korrekt arbeitet?

Also ich habe jetzt eine Testplatine angeschlossen und festgestellt dr MC funktioniert so wie er sollte.

Ich versuche einmal mit der Busy-Flag-Abfrage zu schauen ob das Display vielleicht irgendwo hängen bleibt.
 
Nochmal Init-Sequenz prüfen....

Hallo @Y...,

hier noch
Kleines Video vom Test downloadbar unter

http://www.kbra01.de/AV1621_B.MPG


So siehts bei mir aus bei Anwendung folgenden Programms:

Obwohl die Initialisierung auch nicht ganz korrekt ist. Es fehlen einige
Befehlsfolgen.
Hier sieht man, was unbedingt sein muß, was nicht.
Das RS-Bit wird durch den Ladebefehl auf Null gesetzt, das heißt, gleich der ganze Port,
was natürlich auch das betreffende Steuerbit beinhaltet. Geht aber auch mit dem cbi-Befehl.

Auffällig ist nur, daß der Cursor vorläuft, dann erst der Text sichtbar wird.
(Das ist laut Kontaktaufnahme des Distributors wohl ein Fabrikationsfehler, das Display käme aus der Busy-Abfrage nicht raus, hieß es
zunächst, jeder Enable-Impuls würde ja den Cursor schieben, je nachdem wie intelligent die Busyabfrage im Programm realisiert sei. Als ich den Code mailte, sah man, daß ich garnicht mit der Busy-Abfrage arbeite. Hmm. )


Gruß von Oskar01

Code:
.nolist
.include "8515def.inc"
.list
.def Zeit = r16
.def temp = r17
.def temp1 = r18
.def enable = r19

;Initialisierungstest fuer LCD-Anzeige
;mit KS0066U-kompatiblem Controllerchip,
;8-Bit-Mode; 
;Daten-/Steuerbits auf PORTB, Bit D0 bis D7.
;Enableimpuls auf PORTD, Bit D0; 
;RS auf  PORTD, Bit D1;
;R/WQuer auf Masse fest verdrahtet;
;Routine wird einmal durchlaufen und
;sistiert dann beim Label "Schleife" 
;mit Ausgabe TEXT_TEXT_TEXT etc... 


;Stapelzeigerregister fuer Spruenge einrichten:

	ldi	temp, low(ramend)
	out	SPL, temp
	ldi	temp, high(ramend)
	out	SPH, temp

;Initialisierung; Datenrichtungsregister auf 8-Bit-Breite
;setzen und interne Pull-up-Widerstaende aktivieren:

	ldi	temp1, 0xFF
	out	DDRB, temp1
	ldi	enable, 0xFF
	out	DDRD, enable
	ldi	Zeit, 0xFE
	rcall	Verzoegerung

;Zeilenzahl zweizeilig, Display einschalten:

	ldi	temp1,	0b00111100
	out	PORTB, temp1
	sbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	nop 
	cbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung

;Anzeige ON/OFF Control definieren:

	ldi	temp1,	0x00
	out	PORTB, temp1
	ldi	temp1, 0xFE
	rcall	Verzoegerung
	ldi	temp1,	0b00001111
	out	PORTB, temp1
	sbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	nop
	cbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	
;aktuellen Anzeigeinhalt loeschen
	ldi	temp1, 0x00
	out	PORTB, temp1
	ldi	temp1, 0xFE
	rcall  Verzoegerung
	ldi	temp1, 0b00000001
	out	PORTB, temp1
	sbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	ldi	Zeit, 0xFE
	rcall	Verzoegerung 
	nop
	cbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung

;Entry Mode Set:
	
	ldi	temp1,0b00000110
	out	PORTB, temp1
	sbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	nop
	cbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung

Schleife: 		;Text-Ausgabe:

	sbi 	portd, 1
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	nop
	ldi	temp1, 'T'
	out	portB, temp1
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	nop
	sbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	nop
	cbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	cbi	PORTD, 1
	ldi	temp1, 'E'
	out	portB, temp1
	sbi	PORTD, 1
	sbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	nop
	cbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	cbi	PORTD, 1
	ldi	temp1, 'X'
	out	portB, temp1
	sbi	PORTD, 1
	sbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	nop
	cbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	cbi	PORTD, 1
	ldi	temp1, 'T'
	out	portB, temp1
	sbi	PORTD, 1
	sbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	nop
	cbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	cbi	PORTD, 1
	ldi	temp1, '_'
	out	portB, temp1
	sbi	PORTD, 1
	sbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	nop
	cbi	PORTD, 0
	ldi	Zeit, 0xFE
	rcall	Verzoegerung
	cbi	PORTD, 1
	rjmp 	Schleife


Verzoegerung:
Verzoegerungs_Schleife:

	dec	Zeit 
	cpi	Zeit, 1
	nop
	brlt	Verzoegerungs_Schleife
	ret
 
Hallo Oskar,

ja jetzt wird es so langsam auch etwas bei mir mir dem Code. Ich habe festgestellt das das Display enorm langsam ist, daher werde ich einmal die Busy-Flag-Abfrage mit einbauen.
 
Hallo @Y...,
die Busy-Flag-Abfrage erfolgt im einfachsten Falle durch
die andi-Anweisung in einer Schleife.
Wichtig:
Zuvor muß das Datenrichtungsregister gesichert und dann auf Eingang, also Hex 0x00 umgeschaltet werden, der R/WQuer-Pin dann softwaremäßig auf "High".

Hier gibt es ganz böse Uberraschugen, denn es wird berichtet, daß trotz korrekter Ansteuerung einige LCD-Exemplare das Busy-Flag bis zu 30 Mikrosekunden zu früh löschen, obwohl sie intern noch "beschäftigt" sind.

OK.
Wir kommen der Sache schon näher..


So long

Gruß von Oskar01
 
Ich bin schon wieder am testen von einem anderem Compiler das es ja nicht bei einfachen LCD-Steuerung bleiben soll und mir dann der Code zu unübersichtlich wird. Ich teste gerade E-Lab, ein Pascal Compiler.
 
Ich werde nimmer schlau aus dem Display, wenn ich es nach Datenblatt anschließe funktioniert es nicht, aber wenn ich die Datenleitungen vertausche dann zeigt er mir in der ersten und dritten Zeile einen * an.
 

Anhänge

  • 4Zeilen-LCD.asm
    5,2 KB · Aufrufe: 3
Code überarbeitet

Hallo @Y...,
hier nochmal der überarbeitete Code.
Es fehlten teilweise die Enableimpulse. Am besten als extra Unterprogramme mit rcall aufrufbar gestalten. Auch die Busyabfrage konnte so nicht funktionieren, da der Datenport von Ausgang auf Eingang umgeschaltet werden muß.
Wie das mit den Enablimpulsen läuft, ob nun jedesmal beide Controller immer gleichzeitig (quasi gleichzeitig) angesteuert werden müssen, kann ich noch nicht beurteilen. Zumindest müsste eine Zeilenkombination nun laufen.

Im Proggi ist noch eine Alternative für den Busy-Flag-Check drin - ausgeremt.
Gugsch emol....

schönes Wochenende noch.
Gruß von Oskar01
 
Hallo Oskar,

erst einmal vielen Dank für die Überarbeitung des Codes.
Ich habe Ihn nur kurz überflogen, da wir zur Zeit noch Besuch haben, und jede Menge Änderungen entdeckt.

Der Code (sbic $19,7 ; $19 ???) besagt er soll das DB7 von Port A prüfen ob es aktiv ist, wenn nein dann soll er den nächsten Befahl überspringen ansonsten soll er normal weiter machen mit dem nächsten Befehl.
 
Also es hat sich leider nichts geändert, nach einem 10 maligen Reset des MC schaut das Display wie im Anhang aus. Nach einem Neustart der Stromversorgung werden zufällig Sterne, Punkte oder T geschrieben.
 

Anhänge

  • IMAG0022.jpg
    IMAG0022.jpg
    62,2 KB · Aufrufe: 6
Hallo @Y...,
ok. im Code ist mir noch was aufgefallen, Du schaltetest das Display ja ab wieder. Das wurde noch geändert.
Also Reihenfolge: Function set, Display On/Off (off), Display Clear, jetzt bei folgendem String Display On/Off Control muß wieder das Bit gesetzt werden für "on", gleichzeitig Cursor und Blinkeinstellungen vorgenommen, dann Entry Mode Set.. und Sprung ins weitere Programm, also zurück mit ret zur Hauptschleife, von der aus die Textausgabe dann gestartet wird.
Die Extra-Shift-Einstellung ist entfallen, da sie für Änderungen im laufenden Programm für "Effekte" gedacht sind. Ohne Lese- und Schreibzugriff jederzeit bestimmte Kolumnen (Adressen) anwählen, sozusagen, den Inhalt des Display-Rams darstellen im Sinne einer Suchfunktion, dazu wird das gebraucht. Da ist der Support auch drauf reingefallen.

Zitat:

"...Da das Display die Zeichen (ich gehe davon aus, dass es die sind, die Sie reingeschrieben haben) richtig anzeigt und der Kontrast ebenfalls einstellbar ist, stimmt wahrscheinlich Ihre Initialisierungsroutine nicht ganz oder Sie takten beim 'busy flag check' durch (damit schiebt sich der Curser mit jedem 'Enable' um ein Stelle weiter.
Der Display Controller muß wissen wie der Cursor dargestellt werden soll (z.B. S/C|R/L=0|0 schiebt den Cursor um eine Stelle nach links; S/C|R/L=0|1 schiebt den Cursor um eine Stelle nach rechts)...."


"...vielen Dank für das Assemblat.
Da Sie ohne "Busy flag" arbeiten ist das Timing nicht kritisch, das Modul darf nur nicht zu schnell betrieben werden.
Dir Verzögerungsrechnungen schauen gut aus, ich habe aber nicht nachgerechnet ob das ausreicht - gehe aber davon aus.
Wenn Sie keine zeitkritische Anwendung haben, erhöhen Sie einfach die Zeiten. Z. B. verdoppeln, die können Sie ja später sukzessiv zurück nehmen...."


"...danke für the email. Bitte schicken Sie das Teil an CONRAD zum Umtausch, weil Sie es dort gekauft haben.
Ich hoffe, dass Sie mit dem neuen Modul keine Probleme haben werden...."



Soweit der dst-Distributor-Support.
Tip : Kannst Du auch mal den Support anmailen, vielleicht bringt es ja was.

Habe aber den Eindruck, daß immer noch "zu schnell" in die Texteingabe reingeschrieben wird.
Nimm doch noch mal große Verzögerungen mit rein.

Und noch was:

Beim Busy-Flag-Check-Programm-Abschnitt, der noch ausgeremt als Zusatz von mir als "Variante" reingesetzt wurde, ist noch ein kleiner aber fataler Fehler drin.
Es muß richtig lauten pina statt porta bzw daten, da sonst die in-Anweisung nicht funktioniert.
Habe das im File oben noch geändert.
Die Busy-Flag-Abfrage ist übrigens im Datenblatt schlichtweg falsch angegeben.
Das ist fatal. Denn die Begriffe READ und WRITE sind konsequent von der falschen Seite aus betrachtet worden, also aus der Sicht des Displays nicht aus der Sicht vom MC aus.
Sowas....hmmm. Unten noch das betreffende Datenblatt mit der durchaus mißverständlichen Ausführung "Read Busy Flag"

Schönen Sonntag noch.

Gruß von Oskar01
 
Hallo Oskar,

also ich habe den Code probiert und weder meine noch deine Busy-Flag-Abfrage funktionieren leider. Das Display hängt sich dabei immer auf und zeigt nichts an.
Mit den Verzögerungen zeigt er das im Anhang jetzt an.
 

Anhänge

  • IMAG0024-1.jpg
    IMAG0024-1.jpg
    25,6 KB · Aufrufe: 5
  • 4Zeilen-LCD-1.asm
    7,3 KB · Aufrufe: 2
Hallo @Y...,
ok, mit DSL bist Du schnell.....
ok. Schneller als ich schreiben kann....mein Analogmodem ist beim Net nicht so schnell.-)

Es ändert sich was. Das ist schon mal gut.
Bleibe dran. Hätte sich jetzt überhaupt nichts getan, könnten wir durch Codeänderungen nichts mehr bewirken. Also, der Code muß nochmal genauestens ausgetestet werden, denke ich mal. Eventuell mal einen Controller "im Regen stehen lassen", oder zunächst mal nur einen Enable-Impuls, d.h. zum Beispiel über Label Enable_1 einen der Doppelkontroller anzusprechen versuchen. Sieht nämlich so aus, als ob da was dupliziert wird in der Anzeige. Nur so ne spontane Idee von mir.

Laß mich nur nochmal die zitierten Dateianhänge und den korrigierten Code (mit der Busy-Flag-Check- Variante) hochladen.

So long,
Gruß von Oskar01
 

Anhänge

  • Busy1.PNG
    Busy1.PNG
    38,6 KB · Aufrufe: 6
Hallo Oskar,

ich habe leider auch kein normales DSL, bin zu weit in der Pampa :).
Also ich kann beide Controller separat ansprechen und wenn ich die Buchstaben T e t ändere, dann ändern sie sich auch in der Anzeige.
Aber irgendwie scheint da noch ein Timingproblem zu sein da er am Anfang, für das x und für den Stern zwar dasselbe Zeichen setzt aber nicht das was er sollte und durch Änderungen im Code ändert sich darann leider auch nichts.
also zumindest funktioniert jetzt schon einmal die Initialisierung der beiden Controller.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)