Bascom Locate-Problem LCD 4x40

DEAF BOY

Neues Mitglied
18. Juni 2011
19
0
1
43
Sprachen


Hallo,

ich versuche, 8 LDR anzusteuern, was auch klappt. Nur LCD hat Locate-Problem, weil auf falscher Stelle angezeigt wird. Ab Locate 2,11 kommt durcheinander.
Code:
$lib "lcd_i2c.lib"
$regfile = "m32def.dat"
$crystal = 16000000

Const Pcf8574_lcd = &H40
Config Scl = Portc.0
Config Sda = Portc.1
Dim _lcd_e As Byte
_lcd_e = 128

Dim Ldr1 As Integer
Dim Ldr2 As Integer
Dim Ldr3 As Integer
Dim Ldr4 As Integer
Dim Ldr5 As Integer
Dim Ldr6 As Integer
Dim Ldr7 As Integer
Dim Ldr8 As Integer

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Wait 2
Locate 1 , 1
Lcd "LDR1 LDR2 LDR3 LDR4 LDR5 LDR6 LDR7 LDR8"

Do
Locate 2 , 1 : Lcd Ldr1 ; " " : Ldr1 = Getadc(0)
Locate 2 , 6 : Lcd Ldr2 ; " " : Ldr2 = Getadc(1)
Locate 2 , 11 : Lcd Ldr3 ; " " : Ldr3 = Getadc(2)
Locate 2 , 16 : Lcd Ldr4 ; " " : Ldr4 = Getadc(3)
Locate 2 , 21 : Lcd Ldr5 ; " " : Ldr5 = Getadc(4)
Locate 2 , 26 : Lcd Ldr6 ; " " : Ldr6 = Getadc(5)
Locate 2 , 31 : Lcd Ldr7 ; " " : Ldr7 = Getadc(6)
Locate 2 , 36 : Lcd Ldr8 ; " " : Ldr8 = Getadc(7)
Waitms 250
Loop

Ergebnis
Code:
LDR1 LDR2 LDR3 LDR4 LDR5 LDR6 LDR7 LDR8
690  708 629 599    656 687 586    644
Mein Ziel
Code:
LDR1 LDR2 LDR3 LDR4 LDR5 LDR6 LDR7 LDR8
690  708  629  599  656  687  586  644
 
Hi,

ich mach das Bild mal direkt hier ins Forum damit der Zusammenhang bleibt ...
foto-2dawd_.jpg
Es ist immer schade wenn jemand was sucht und dann nur noch einen zerhackten Thread findet in dem die Bilder die man für die Lösung bräuchte fehlen (geht mir leider zu oft so).

Also mal vorweg ... an den Locate-Anweisungen sehe ich so erstmal keine Fehler.

Eventuell hat Bascom Probleme mit den 3 Befehlen in einer Zeile. Schreibs doch mal anders ...
Code:
Do
Locate 2 , 1
Lcd Ldr1 ; " "
Ldr1 = Getadc(0)
Locate 2 , 6
Lcd Ldr2 ; " "
Ldr2 = Getadc(1)
...
..
.
Welche Bascom-Version verwendest du denn ?

Aber so wie es aussieht kommst du mit zeitlichen Spielereien (Optimierung der Befehlsabfolge) auch schon ganz gut klar ;) (Nach der Anzeige sofort die neue Wandlung starten und dann nur einmal 250ms warten)

Gruß
Dino
 
Version 2.0.7.1
Code:
Do
Locate 2 , 1
Lcd Ldr1 ; " "
Ldr1 = Getadc(0)
Locate 2 , 6
Lcd Ldr2 ; " "
Ldr2 = Getadc(1)
...
..
.
Das hat auch nicht gebracht :(
Hast du schonmal versucht dein Programm auf folgendes zu verkürzen ...
Code:
$lib "lcd_i2c.lib"
$regfile = "m32def.dat"
$crystal = 16000000

Locate 1 , 1
Lcd "LDR1 LDR2 LDR3 LDR4 LDR5 LDR6 LDR7 LDR8"

Do
Locate 2 , 1 : Lcd "123 "
Locate 2 , 6 : Lcd "234 "
Locate 2 , 11 : Lcd "345 "
Locate 2 , 16 : Lcd "456 "
Locate 2 , 21 : Lcd "567 "
Locate 2 , 26 : Lcd "678 "
Locate 2 , 31 : Lcd "789 "
Locate 2 , 36 : Lcd "890 "
Waitms 250
Loop
Wenn das nicht sauber dargestellt wird, dann könnte es auch an einem Problem innerhalb von Bascom liegen.
Oder setz mal die Variablen Ldr1...8 auf feste 3stellige Werte und sieh dir an was dann passiert. Mal ein wenig mit den Befehlen spielen. Eventuell kristallisiert sich dann ja was raus ...

Vom logischen Gesichtspunkt her sehe ich erstmal keinen Fehler in deinem Quellcode.

Gruß
Dino
 
Gleiche Ergebnis.

Ich habe mal umgeändert, LDR1, LDR2 ... weggemacht.
Code:
locate 1 , 1 : Lcd "123 "
locate 1 , 6 : Lcd "234 "
locate 1 , 11 : Lcd "345 "
locate 1 , 16 : Lcd "456 "
locate 1 , 21 : Lcd "567 "
locate 1 , 26 : Lcd "678 "
locate 1 , 31 : Lcd "789 "
locate 1 , 36 : Lcd "890 "

So sieht aus:
locate_fehler3klp.jpg



Scheint BASCOM-Probleme
 

Anhänge

  • locate_fehler3klp.jpg
    locate_fehler3klp.jpg
    17,9 KB · Aufrufe: 1
Scheint BASCOM-Probleme
Ähhh ... nicht unbedingt ... sieht nach einem Muster aus.
Als ob das Display irgendwie in verschiedene Zonen aufgeteilt ist.
Das könnte an der Größe liegen. Eventuell ist der Ausgabespeicher
des Controllers etwas komisch auf das LCD verteilt.

Probier mal in einer Schleife mit 100ms Verzögerung einfach Zeichen an das Display zu senden. Also mit ...
Code:
LCD "-";
zB immer Minuszeichen. Wichtig ist das Semikolon am Ende. Sieh dir an in welchem Muster das Display vollgeschrieben wird. Es kann sein das manche Speicherbereiche des ZeichenRAMs nicht angezeigt werden. Das merkst du anhand von Pausen in denen scheinbar nichts mehr passiert. Irgendwann gehts dann aber weiter.

Als zweiter könntest du immer einstellige Zeichen ausgeben um Änderungen hervorzurufen (zB die Ziffern von 0..9 oder a..z) Dann kann man eventuelle blinde Bereiche (RAM-Zellen die nicht dargestellt werden) erkennen und auszählen. Also wie vorher die Minuszeichen nur mit wechselndem Zeichen.

Das ist jetzt sozusagen die "Forschungs-Phase" ;)

Schau mal hier ... Re: Display Menü LCD 4x20
Das ist zwar über nen M50530 LCD-Controller aber dort ist so ein Muster erkennbar. Die Speicheradressen des Zeichen-RAMs sind auf bestimmte Weise auf die Teile der LCD-Anzeige verteilt. Wenn das nicht paßt, dann passen deine Locate-Anweisungen auch nicht.

Gruß
Dino
 
Scheint BASCOM-Probleme


Hallo zusammen!

Warum seid ihr denn der Meinung, dass es ein BASCOM Problem sein soll? :hmmmm:
Ich habe mich gleich gefragt, wie sich wohl ein 4x40 Zeichen Display am I2C-Bus mit der Ansteuerungs-LIB verhält.

An deiner Stelle würde ich erst einmal ein paar Versuche machen....
Was passiert denn, wenn du das Display zeilenweise füllst?

Also zum Beispiel:
(40 Zeichen in Zeile 1)
Code:
Locate 1 , 1
Lcd "1234567890123456789012345678901234567890"

...oder auch:
(40 Zeichen in Zeile 3)
Code:
Locate 3 , 1
Lcd "1234567890123456789012345678901234567890"

....oder auch sehr wichtig:
(80 Zeichen in Zeile 1 !)
Code:
Locate 1 , 1
Lcd "12345678901234567890123456789012345678901234567890123456789012345678901234567890"

Damit kannst du schon mal ein wenig sehen, wie deine Zeichenangaben vom Display verarbeitet werden.

Wie aber schon erwähnt....
Ich weiß nicht, ob das problemlose Ansteuern eines 4x40-Zeichen-Displays über die Kent-Andersson-LIB überhaupt möglich ist.


Grundsätzlich würde ich aber erst mal die Ursache zum Ansteuern beim Display suchen!

Grüße,
Cassio


EDIT: Schau dir vielleicht auch bitte mal DIESEN BEITRAG dazu an!
Dort habe ich ähnliche Versuche mit einem 16x4 LCD am I2C-Bus gemacht!
Im Code gibt es z.B. diese Eigenschaft:
Code:
Locate 1 , 1
Lcd "Dies ist Zeile 1Dies ist Zeile 3"

Locate 2 , 1
Lcd "Dies ist Zeile 2Dies ist Zeile 4"
Da kannst du auch sehr schön die "Datenverarbeitung" des Dispalys sehen. :wink:
 
Danke für die Antwort. Ok, ich werde Beitrag schauen.

Code:
'LCD_testen.bas

$lib "lcd_i2c.lib"
$regfile = "m32def.dat"
$crystal = 16000000

Const Pcf8574_lcd = &H40
Config Scl = Portc.0
Config Sda = Portc.1
Dim _lcd_e As Byte
_lcd_e = 128

Wait 1
Cls
Locate 3 , 1
Lcd "1234567890123456789012345678901234567890"
End

Locate 1 , 1
Lcd "1234567890123456789012345678901234567890"

locate_1_1xxhq.jpg


Locate 3 , 1
Lcd "1234567890123456789012345678901234567890"

locate_3_1wah9.jpg


Locate 1 , 1
Lcd "12345678901234567890123456789012345678901234567890123456789012345678901234567890"

locate_1_1_80rbuz.jpg
 
Ach, ich gebe auf.

Ich verwende jetzt
Code:
_lcd_e = 128
Ldr1 = Getadc(0) : Locate 1 , 1 : Lcd "LDR1: "
Ldr2 = Getadc(1) : Locate 2 , 1 : Lcd "LDR2: "
Ldr5 = Getadc(4) : Locate 1 , 18 : Lcd "LDR5: "
Ldr6 = Getadc(5) : Locate 2 , 18 : Lcd "LDR6: "

_lcd_e = 64
Ldr3 = Getadc(2) : Locate 1 , 1 : Lcd "LDR3: "
Ldr4 = Getadc(3) : Locate 2 , 1 : Lcd "LDR4: "
Ldr7 = Getadc(6) : Locate 1 , 18 : Lcd "LDR7: "
Ldr8 = Getadc(7) : Locate 2 , 18 : Lcd "LDR8: "
 
Ach, ich gebe auf.


Hallo!

Warum möchtest du denn jetzt aufgeben, wo du dem Ziel doch schon recht nah bist? :hmmmm:

Ich würde mit den Tests ruhig noch ein wenig weiter spielen!
Das oben gezeigte Ergebnis sieht doch schon ganz gut aus.

Wichtig ist doch nur erst mal heraus zu finden an welcher Position tatsächlich ein Zeichen erfolgt, wenn du eine Positionsangabe machst.
Das diese "verschoben" wirken liegt an der Aufteilung der Controller am Display.
Du musst jetzt also nur heraus finden, wann bestimmte Zeichenpositionen erreicht werden.... und wann sie "scheinbar durchgeschoben" werden.

Leider hast du keinen Anschlussplan eingestellt und ich kann jetzt nicht sehen, ob dein Display zwei E-Leitungen besitzt.... also E und E2.
Wenn du nur eine E-Leitung hast, dann benötigst du die Angabe:
_lcd_e = 64
überhaupt nicht!

Also ich würde einfach weiter probieren:
Code:
Locate 1 , 1
Lcd = "1"

Locate 1 , 16
Lcd = "2"

Locate 1 , 20
Lcd = "3"

Locate 1 , 21
Lcd = "4"

Locate 1 , 32
Lcd = "5"

Locate 1 , 40
Lcd = "6"


Danach ein neues Programm, nur eben mit Zeile 2:
Code:
Locate 2 , 1
Lcd = "1"

Locate 2 , 16
Lcd = "2"

Locate 2 , 20
Lcd = "3"

Locate 2 , 21
Lcd = "4"

Locate 2 , 32
Lcd = "5"

Locate 2 , 40
Lcd = "6"

Dies wiederholst du dann mit Zeile 3 sowie 4 und schaust dir die Ausgaben an.

Danach solltest du doch schon wissen, wann welche Zeile und welches Zeichen angesprochen werden kann.
Falls nicht.... probierst du einfach weiter! :wink:

Nur nicht aufgeben! Wird schon klappen!

Cassio
 
Hallo !

Wie ich in DIESEM Beitrag schon gesehen habe, klappt es ja nun mit der Ansteuerung.

Du musst bei zwei E-Leitungen also immer Zeile 1 und 2 verwenden......
und nur jeweils den richtigen "Abschnitt" mit "_lcd_e" (128 oder 64) auswählen (ggf. für die Zeilen 3 & 4).


Na also, nun klappt es dann doch! :wink:

Grüße,
Cassio
 
Hi Deaf Boy,

Code:
_lcd_e = 128
Locate 1 , 1 : Lcd "Zeile 1                 04. Oktober 2011"
Locate 2 , 1 : Lcd "Zeile 2 geschrieben von DEAF BOY mit"

_lcd_e = 64
Deflcdchar 0 , 32 , 32 , 10 , 10 , 32 , 17 , 14 , 32
Locate 1 , 1 : Lcd "Zeile 3 BASCOM-AVR Version 2.0.7.1"
Locate 2 , 1 : Lcd "Zeile 4 http://www.avr-praxis.de " : Lcd Chr(0)
was lange währt wird endlich gut ;)

Mit nem Schaltplan im ersten Beitrag wäre das recht schnell aufgefallen ... aber was solls. Gelöst ist gelöst :cool:

Gruß
Dino
 

Ü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)