mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem beim ansteuern eines I²C LCDs


Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Der Titel hört sich komplex an, ist aber eigentlich ein relativ
"einfaches"
Problem:

Das LCD (2x20 Zeichen) wird über 2 PCF8574 gesteuert.
Das funktioniert auch ganz gut. Ich habe gestern Abend eine Funktion
geschrieben, die aus einem String n Zeichen ins LCD drucken soll.

Wenn ich das ganze LCD vollschreiben will, dan schreibe ich meinen Text
in "Lcdtext" und sage "printlcd(<anzahl zeichen>)"
So.
Die schleife soll dann n mal durchlaufen und die Zeichen per I²C in das

LCD schreiben. Das funktioniert; aber nur bis zum ende der Ersten
Zeile.

Der Quelltext:


'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++++++

'| MEECH HAUPRPROGRAMM |
'| Copyright: Tobias Schlegel |
'| Version 0.4 |
'| |
'| www.drschlegel.de/tobias |
'| Compiled for ATMEGA16, 16Mhz (ext.)Crystal |
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++++++


'===CONFIGURATIONS===
$regfile = "m16def.dat"
$baud = 9600
$crystal = 16000000
$lib "i2c.lib"

Config Scl = Portc.0 'I²C SDA
Config Sda = Portc.1 'I²C SCL


'===FUNKTIONEN===

Declare Function Lcdprint(byval Nchars As Byte) As Byte


'===VARIABLEN===

Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim E As Byte

Dim Lcdtext As String * 40

Const Lcddataaddr = &H40
Const Lcdcntrladdr = &H42

Const Default_i2c_delay_time = 3


'===PROGRAMMBEGINN===


Begin:
I2cinit

I2csend Lcddataaddr , 0
Waitms 10
I2csend Lcdcntrladdr , 0

Sound Beep , 250 , 1000 'Ein bisschen gepiepse zum Anfang...
Sound Beep , 250 , 900
Sound Beep , 250 , 800
Sound Beep , 500 , 500



A = Sirene(3) 'Ich komme...

'Waitms 500 'Watren


'====Eigentlicher PROGRAMMSTART====


Source: 'TESTPROGRAMM




I2csend Lcddataaddr , 56 'Mit 2 Zeilen initialisieren...
Waitms 10

I2csend Lcdcntrladdr , 1
Waitms 10
I2csend Lcdcntrladdr , 0
Waitms 10


I2csend Lcddataaddr , 12 'Einschalten
Waitms 10

I2csend Lcdcntrladdr , 1
Waitms 10
I2csend Lcdcntrladdr , 0
Waitms 10


I2csend Lcddataaddr , 2 'Cursor HOME
Waitms 10

I2csend Lcdcntrladdr , 1
Waitms 10
I2csend Lcdcntrladdr , 0
Waitms 10



Lcdtext = "1babababaf2babababaf3ababababf4babababFX"
A = Lcdprint(40)




End 'ENDE!!

'&====FUNKTIONEN UND SUBROUTINEN====&


Function Lcdprint(nchars As Byte) As Byte
Dim Sign As String * 1
Dim Prnt As Byte
Dim Schlvar3 As Byte



For Schlvar3 = 1 To Nchars

Sign = Mid(lcdtext , Schlvar3 , 1)
Prnt = Asc(sign)


I2csend Lcddataaddr , Prnt
Waitms Default_i2c_delay_time


I2csend Lcdcntrladdr , 4
Waitms Default_i2c_delay_time

I2csend Lcdcntrladdr , 5
Waitms Default_i2c_delay_time

I2csend Lcdcntrladdr , 4
Waitms Default_i2c_delay_time

Next


End Function




Im LCD steht:

1babababaf2babababaf

und in der unteren Linie nix.

Das alles funktioniert richtig, wenn man die ersten 20 Zeichen alleine
Schickt,
und die anderen 20 auch alleine.
Dann steht alles richtig.

Da ist irgendein kleines Problem.
Seit gestern Abend tüftel' ich jetzt schon...

Viele liebe Grüße, und Danke schon jetzt!
Tobi

Autor: Wolle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal ins Datenblatt der LCD-Anzeige und richte dort dein Augenmerk
auf die Adressen der ersten und zweiten Zeile.

Du schreibst alle 40 Zeichen in die erste Zeile. Die sind auch da, bloß
sind nur die ersten 20 "sichtbar", weil du die Anzeige/den Cursor
nicht "shiftest" !!

Autor: Lodar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was für ein LCD hast du denn? es könnte sein, das Du nach 20
Zeichen eine extra Spalten- und Zeichenadresse senden solltest
(so was wie GoToXY). Bei einigen LCD's gibt's leider keine interne
Autoincrementfünktion bei dem "Spaltenwechsel"
Also angenommen 1.Zeile-1.Spalte hat Adresse 00h und 1.Zeile 20. Spalte
hat die Adresse (20-1 to hex) = 13h. Dann hat die 1. Spalte in der 2.
Zeile nicht die Adresse 14h sondern in deinem Fall wahrscheinlich 20h.
also die 12 Zeichen zwischen 14h und 1Fh ( gehen verloren... ) :-(

Ich rate Dir mal Datenblatt deines LCD-Controllers nachzuguken...

mfg Lodar

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Das hab' ich mir auch schon gedacht.
Aber wen ich mit einer entloßschleife z.B."a"
sende, wird automatisch in die zweite Zeile gewechselt.

Datenblatt des LCDs:

http://www.reichelt.de/inhalt.html?SID=12QVGPENS4A...


Vielen Dank soweit!!
Tobi

Autor: Wolle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist auch logisch, weil bei der Endlosschleife auch die Adressen
weitergezählt werden und so auch irgendwann die 40h (Beginn 2,Zeile)und
höher erreicht wird !!

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI!

Das klingt logisch!

Es funktioniert! Ich habe das Steuerzeichen dec. 192 gesendet und
daraufhin funktioniert es.

Danke für eure Hilfe!!

Viele liebe Grüße,
Tobi

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.