PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeilenumbruch Display LCD



TobiasBlome
02.10.2009, 16:48
Hallo,
wie programmiert ihr einen Zeilenumbruch?

LCD: 4*20 Zeichen

Der Text wird über die serielle Schnittstelle -> UDR empfangen und in einem String*20 geschrieben.

Nun war die Überlegung den String*80 zu machen und mit MID aufzuteilen. Leider habe ich hier nur einen ATtiny2313 zur Verfügung und der schafft nur String*60 maximal.

Was mir aufgefallen ist: Wenn ich mehr als 20 Zeichen sende, erscheinen die aber (etwas abgehackt) trotzdem auf dem LCD? wieso? wird der String nicht erst wieder leer gemacht und dann mit LCD auf dem Display überschrieben?

Tobias

mein Code bisher...


'-------------------------------------------------------------------------------
'Konfiguration µC:

$regfile = "ATtiny2313.dat" 'ATtiny2313-Deklarationen

$hwstack = 32
$swstack = 8
$framesize = 24


'$crystal = 14745600 'Quarz: 14,7456 MHz
$crystal = 8000000
$baud = 9600 'Baudrate definieren
'-------------------------------------------------------------------------------
'Ein / Ausgänge definieren:
Ddrd = &B1111111 'Pin PD5-0 als Eingang / 6 als Ausgang (LCD) konfigurieren
Ddrb = &B11111111

'PullUps setzen:
Portd = &B0111100 '1 = PullUp AKTIV
Portb = &B00100000 '1 = PullUp AKTIV

'-------------------------------------------------------------------------------
'LCD konfiguration
Config Lcd = 20 * 4 'LCD größe
Config Lcdpin = Pin , Rs = Portb.4 , E = Portb.3 , Db4 = Portb.2 , Db5 = Portb.1 , Db6 = Portb.0 , Db7 = Portd.6
Cursor Off Noblink

'-------------------------------------------------------------------------------
'Alias
Taster1 Alias Pind.2
Taster2 Alias Pind.3
Taster3 Alias Pind.4
Taster4 Alias Pind.5
Taster5 Alias Pinb.5


'-------------------------------------------------------------------------------
'Variablen
Dim Parameter As String * 20 'max 60
Dim E_byte As Byte , E_flag As Byte


'-------------------------------------------------------------------------------
Cls
Locate 1 , 1
Lcd "RS232 - LCD"

'-------------------------------------------------------------------------------
'Für RS232:
On Urxc Onrxd 'Interrupt-Routine setzen
Enable Urxc 'Interrupt URXC einschalten
Enable Interrupts 'Interrupts global zulassen


'-------------------------------------------------------------------------------

Do 'Hauptschleife



'Tasterabfrage:
If Taster1 = 0 Then
Print "Taster1"
Cls
Lcd "Taster1"
End If



'RS232 - Empfang umwandeln
If E_flag = 1 Then 'Empfangsstring komplett
' Substring = Mid(String , A , B)
Print Parameter
Cls
Lcd Parameter

Parameter = "" 'Parameter löschen
E_flag = 0 'Empfang neu setzen

End If


Loop



'-------------------------------------------------------------------------------
Onrxd:

E_byte = Udr


If E_byte = 13 Then '13 = CR (Enter)
E_flag = 1
Else
Parameter = Parameter + Chr(e_byte)
End If

Return

TobiasBlome
02.10.2009, 16:58
Wenn ich mehr als 20 Zeichen sende, dann erscheinen die ersten 20 in der 1. Zeile, das 21. Zeichen in der 3.Zeile dann kommt zwei mal "CR" also Zeichen 13. Das 22. Zeichen von meinen gesendeten fehlt und dann gehts mit dem 23.Zeichen weiter:

12345678901234567890

1""3456 u.s.w.

TobiasBlome
02.10.2009, 17:59
Also die 4 Zeilen habe ich nun mit MID aufgeteilt. Habe beim probieren gemerkt das man direkt auf das LCD schreiben kann :-)



'RS232 - Empfang umwandeln
If E_flag = 1 Then 'Empfangsstring komplett
Print Parameter
Cls
Locate 1 , 1
Lcd Mid(Text , 1 , 20)
Locate 2 , 1
Lcd Mid(text , 21 , 20)
Locate 3 , 1
Lcd Mid(text , 41 , 20)
Locate 4 , 1
Lcd Mid(text , 61 , 20)

Text = "" 'Parameter löschen
E_flag = 0 'Empfang neu setzen

End If

Loop


'-------------------------------------------------------------------------------
Onrxd:

E_byte = Udr

If E_byte = 13 Then '13 = CR (Enter)
E_flag = 1
Else
Text = Text + Chr(e_byte)
End If

Return


Leider funktioniert das nur in den 1ten 3 Zeilen und in der zweitenzeile ist immer noch dieser Fehler das ein Zeichen fehlt also 12"4567

TKRoth
02.10.2009, 22:33
Wenn Du Texte an das LCD schickst werden diese in das so genannt DDRAM geschrieben. Dieses hat in der Regel eine Größe von 80 Bytes.

Die einzelnen Zeilen des Displays zeigen nur einen Ausschnitt dieses Speichers. Schreibst du nun Texte in den Speicher werden die ersten 20 Zeichen in der 1. Zeile gezeigt, die nächsten 20 in der 3. Zeile dann 20 Zeichen in der 2. Zeile und die letzten 20 Zeichen erscheinen in der letzten Zeile

Steuerzeichen wie 'Return' oder 'Zeilenvorschub' kennt das LCD nicht.

Bei den Zeilen 3 und 4, bei 4 zeiligen Displays gibt es hin und wieder Unterschiede. Da müsstest du einmal ins Datenblatt schauen.

Evtl. musst du bei der Initialisierung auch einen anderen Chipsatz angeben. Wird nichts angegeben, nimmt Bascom an das du mit einem HD44780 oder kompatible arbeitest.

Gento
02.10.2009, 23:32
Wie in vielen anderen Foren auch, führst du Schnellschussselbstgespräche.@Hr Blome

Grab Dich vorm Texten besser für 10 Minuten im Keller ein um nachzudenken.

Laserist Gento

TobiasBlome
03.10.2009, 08:49
@Geno: ok

Tobi

TobiasBlome
06.10.2009, 18:04
tja anscheinend gibt es keine andere Möglichkeit.
Die Variable hat 60 Zeichen - mehr Speicher hat der µC nicht - das reicht also nur für 3 statt 4 Zeilen(also 3x20Zeichen). Also werde ich wohl einen größeren µC nehmen.

Tobias



If E_flag = 1 Then 'Empfangsstring komplett

Cls
Locate 1 , 1
Lcd Mid(text , 1 , 20)
Locate 2 , 1
Lcd Mid(text , 21 , 20)
Locate 3 , 1
Lcd Mid(text , 41 , 20)
Locate 4 , 1
Lcd Mid(text , 61 , 20)
Text = "" 'Parameter löschen
E_flag = 0 'Empfang neu setzen

End If

Jaecko
07.10.2009, 13:13
Wieso den ganzen Text speichern?
Es reicht doch, in 2 Variablen abzulegen, in welcher Zeile und Spalte der Cursor des LCD gerade ist.
Dann jedes Zeichen einzeln zum Display schieben und dabei die Spaltenvariable um eins erhöhen; erreicht man das Zeilenende (Spalte = 20), dann ab in die nächste Zeile (Spalte = 1, Zeile = Zeile + 1).

Jaecko
07.10.2009, 13:14
ominöser Doppelpost... entfernt...

TobiasBlome
07.10.2009, 17:16
Danke Jaecko!!!
auf die Idee bin ich noch nicht gekommen - super!!! Werde ich am Wochenende testen

Danke,
Tobias

TobiasBlome
08.10.2009, 22:21
Hallo Jaecko,
der Anfang funktioniert. Nach dem 4ten Zeichen werden Zeichen zwischendurch ausgelassen. Kann das daran liegen das ich alles in die ISR geschrieben habe? Aber da muss das doch sicherlich rein, damit der µC auch jedes Zeichen mitbekommt oder?

Tobias



do
'leer
loop

Onrxd:

E_byte = Udr

Locate Zeile , Spalte
Lcd Chr(e_byte)

Incr Spalte 'SpaltenVorschub

If Spalte > 20 Then 'ZeilenVorschub
Incr Zeile
End If


If E_byte = 13 Then '13 = CR (Enter)
Spalte = 1
Zeile = 1
End If


Return

Jaecko
08.10.2009, 23:31
In ner ISR (Display-)Ausgaben machen ist tödlich, da die Zeichen durchaus mal schneller ankommen, als sie aufs Display geschoben werden können. Und wenn die ISR nochmal ausgelöst wird, während sie schon läuft, dann ist Achterbahn.

Bascom ist bei mir schon ne Zeit lang her, aber soweit ich weiss, kann man ja für den UART nen Puffer anlegen (Config Serialin oder so). Da brauchts dann auch keine direkte ISR dazu.

Einfach in der Main-Schleife schauen, ob ein Zeichen im Puffer liegt, wenn ja, Zeichen holen (Inkey()), dann die einfache Prozedur, die sonst in der ISR gemacht wird.