PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Warum sehe ich auf dem LCD nichts?



rolfw20
04.04.2006, 00:48
Hallo Leute,
ich habe ein kleines Programm geschrieben das auch im Simulator ohne fehler läuft. Dieses habe ich nun zum Mega16 geschickt, die Kontroll LED blinkt auch aber auf dem LCD kann ich nichts sehen.
Kann mir jemand sagen was ich falsch mache?

Da ich auch nicht weiß wie man das Textfenster für die Programme macht, hänge ich es einfach mal an.

$regfile = "m16def.dat" 'Die Anweisung bestimmt Controllertyp, hier AVR Mega 16
$crystal = 1000000 'Die Frequenz des internen Oszilators
Config Lcd = 16 * 1 'Display
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4
Dim A As Word
Dim B As Single
Config Portb.0 = Output
Config Portc = Input
Portc.0 = 1 'Internen Pullup einschalten c0 zum einlesen ADCwert unten
Portc.1 = 1 'Internen Pullup einschalten c1 zum einlesen ADCwert oben
Portc.2 = 1 'Internen Pullup einschalten c2 zum einlesen der Aktuellen ADCwertes und Berechnung des Phwertes
Portc.3 = 1 'Internen Pullup einschalten
Config Adc = Single , Prescaler = Auto , Reference = Off 'Init ADC
Dim Unten As Word 'benutzte Variablen
Dim Oben As Word
Dim Phwert As Single
Dim Phunten As Single
Dim Phoben As Single
Dim Messwert As Word
Dim Hilf1 As Single
Dim Hilf2 As Single
Dim Hilf3 As Single
Dim Hilf4 As Single
Dim Hilf5 As Single
Start Adc
Dim Taste As Byte , Sperre As Byte 'Sperre wird immer aud 1 gesetzt wenn ein oder mehrere Tasten gedrückt sind
'wenn keine Taste gedrückt ist wird die Sperre wieder auf 0 gesetzt
Phunten = 4.3 'einfache Festlegung des unteren Cal.punktes zum Test
Phoben = 9.6 'einfache Festlegung des oberen Cal.punktes zum Test
Do
Taste = Portc
If Taste = 14 And Sperre = 0 Then 'nur wenn taste 1 gedrückt und die Sperre auf 0 ist wird der ADCwert gespeichert
Unten = Getadc(0)
Locate 1 , 1
Lcd "U=" ; Unten
Sperre = 1 'Sperre einschalten (1)
Else
End If
If Taste = 13 And Sperre = 0 Then 'nur wenn taste 2 gedrückt und die Sperre auf 0 ist wird der ADCwert gespeichert
Oben = Getadc(0)
Locate 1 , 1
Lcd "o=" ; Oben
Sperre = 1 'Sperre einschalten (1)
Else
End If
If Taste = 11 Then 'nur wenn taste 4 gedrücktist wird der ADCwert gespeichert
Messwert = Getadc(0) 'und der Phwert wird berechnet
Hilf1 = Phoben - Phunten 'Berechnung in einzelschritten
Hilf2 = Oben - Unten 'da die gesammte Formel Fehler verursachte
Hilf3 = Hilf1 / Hilf2
Hilf1 = Messwert * Hilf3
Hilf2 = Hilf1 + Phunten
Hilf4 = Unten * Hilf3
Phwert = Hilf2 - Hilf4
'Phwert = Messwert *(phoben - Phunten ) /(oben - Unten ) + Phunten - Unten *(phoben - Phunten ) /(oben - Unten )
'Phwert = Messwert * Hilf1 / Hilf2 + Phunten - Unten * Hilf1 / Hilf2
'phwert = Messwert * Hilf3 + Phunten - Unten * Hilf3
'Phwert = Hilf4 + Phunten - Unten * Hilf3
'Phwert = Hilf5 - Hilf6
Locate 1 , 1
Lcd "M" ; Messwert ; "P" ; Phwert
Else
End If
If Taste = 15 Then 'wenn keine Taste gedrückt ist wird die Sperre wieder aufgehoben (0)
Sperre = 0
Else
End If
Toggle Portb.0 'test ob prozessor noch läuft
Waitms 50 'damit man auch ein blinken sieht
Loop
End

Für Eure Hilfe bin ich echt dankbar.
Gruß
Rolf

Bernhard.Erfurt
04.04.2006, 02:10
Kleiner Tipp:

Wird das LCD auch richtig initialisiert? 4 oder 8 Bit - Modus ?

Bernhard

Bernhard.Erfurt
04.04.2006, 02:10
Kontrastspannung eingestellt?

rolfw20
04.04.2006, 09:19
zur Initialisierung sollte es doch reichen wenn ich folgendes schreibe:

Config Lcd = 16 * 1 'Display
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4

Der Kontrast ist auch richtig eingestellt.
Manschmal nach einem Poweron bekomme ich alles "p" in der Anzeige.
Bei anderen kleinen Programmen konnte ich das Display so benutzen, wobei nur 8 Zeichen angezeigt wurden. Ich dachte das Diaplay sei defekt aber nun habe ich manschmal 16 "p"´s auf dem Display.
Ich glaube das ich einen grundsätzlichen Fehler mache.

Rolf

mx3
04.04.2006, 10:31
Hi!

schon mal Config mit zusätzlichen"a" probiert?

Config Lcd = 16 * 1a 'Display

Hat schon mal bei einigen Ihr im Forum geholfen.
Alles richtig verdrahtet?


mfg,MX3

rolfw20
04.04.2006, 19:49
Config Lcd = 16 * 1a

bringt leider auch keine Änderung :(

Bernhard.Erfurt
04.04.2006, 20:58
Wenn Du zuerst das Display mit Spannung versorgst und dann den µC
erst startest, wie sieht dann die Anzeige aus ?

Anfangs müsste in der oberen Zeile nur Karos zu sehen sein?

rolfw20
04.04.2006, 22:27
ich weis nicht genau warum, aber nachdem ich nun die einzelnen Portbits mit If Pinc.0 = 0 auslese, sehe ich auch eine Anzeige im LCD.
Was jedoch seltsam ist, manschmal habe ich alle 16 Zeichen und manschmal nur 8

Gruß
Rolf

Bernhard.Erfurt
04.04.2006, 22:49
>Was jedoch seltsam ist, manschmal habe ich alle 16 Zeichen und >manschmal nur 8

Fehler beim initialisieren des LCD, 2 Zeilken - Modus muss erst aktiviert werden.

Vielleicht stimmt eine Wartezeit nicht exakt, denn manche Initalisierungs-Befehle verlangen längere Wartezeiten, bis der nächste Befehl folgen darf ;)

rolfw20
04.04.2006, 23:03
??? das Display hat doch nur eine Zeile ???
Mein Program läuft nun aber bei manschen Ausgaben sehe ich nur 8 Zeichen und bei anderen 16 (im gleichen Programm, kein neustart zwichendurch)
Welche Wartezeit muss ich wo einhalten?

Trotzdem DANKE, ich werde es auch noch lernen :-)

Gruß
Rolf

Vitis
04.04.2006, 23:21
hört sich für mich nach timingproblem an.
stimmt auch deine taktfrequenz sicher?

$crystal = 1000000 1MHz?
oder eventuell doch 2 oder 4 oder 8 MHz?

Bei der initialisierungscheint was nicht recht zu stimmen ...
eine mögliche abhilfe währe "zu Fuß" zu initialisieren.

Schick mal nen Link zum Datenblatt von dem Dings

Gento
04.04.2006, 23:42
Am LCD solte der Pin RW richtigen Pegel haben (mir fällt gerade nicht ein welcher) , aber der bereitete mir auch einigen Ärger.

ansonsten :

waitms 100
initlcd

und dann klappt die Ausgabe.

Gento

chr-mt
04.04.2006, 23:56
??? das Display hat doch nur eine Zeile ???
Ja, aber manche 16*1 LCDs sind so aufgebaut, daß die ersten 8 zeichen als Zeile 1 und die zweiten 8 Zeichen als Zeile 2 behandelt werden.
Deshalb auch das "16*1" mit dem Zusatz "a" beim Bascom LCD init.
Das ist für die "zweizeiligen Einzeiler" ;)
Beim Einschalten ohne Ansteuerung sollte auf dem "a" Display auch nur eine Hälfte schwarz sein.
Beim "normalen" 16*1 ist dann alles schwarz.

Gruß
Christopher

rolfw20
05.04.2006, 19:46
Hi Leute,
Timingproblem ---- ich benutze den internen Quarz sollte 1000000 sein.
Pegel an RW -------- liegt fest an GND

nun zum "zweizeiligen Einzeiler" --- scheint der Lösung schon sehr nahe zu kommen
O:) habe auch gelernt wie man einen Programmcode einsetzt ](*,)
Ich habe ein kleines Testprog. geschrieben, wobei ich es einmal mit 16*1a und einmal mit 16*1 getestet habe.

$regfile = "m16def.dat" 'Die Anweisung bestimmt Controllertyp, hier AVR Mega 16
$crystal = 1000000 'Die Frequenz des internen Oszilators
Config Lcd = 16 * 1 'Display
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4
Dim A As Single
Dim B As Single
A = 4.0
B = 12.1
Initlcd
Do
Cls
Locate 1 , 1
Lcd "test1 1234567890"
Wait 2
Cls
Locate 1 , 1
Lcd "test2 " ; A ; " " ; B
Wait 2
Cls
Locate 1 , 1
Lcd "test3"
Locate 2 , 1
Lcd A ; B
Wait 2
Loop
Die ausgaben waren schon recht merkwürdig
Bei 16*1a
test1_12
test2_4.0_12.100
test3___00003790

bei 16*1
test1_12
test2_4.
test3___4.012.10

was merkwürdig ist , ist das test1 nirgendswo als "test1_1234567890" ausgegeben wurde.
NaJa was soll´s, werden das Ding schon irgendwie schaukeln.
=D> vielen dank für die tollen Tips, wäre sonst bestimmt noch beim Ärgern, jetzt kann ich schon wieder O:)

Gruß
Rolf

rolfw20
05.04.2006, 21:52
Da isser wieder,
es läuft alles. Ich benutze nun 16*1a und habe meine Ausgaben als 2 * 8 Zeichen konfiguriert.
O:) \:D/ O:) \:D/ O:) \:D/ O:) \:D/ O:) \:D/ O:)

vielen vielen dank euch allen

Gruß
Rolf

T.J.
09.04.2006, 18:52
hi,

dann kannst du mir vielleicht helfen?

ich habe R/W auf GND, die Kontrastspannung lässt sich prima regeln. betriebsspannung stimmt auch alles.

Ich habe aber sehr wenig programmiererfahrung und habe dein programm von oben genommen. Aber da hab ich nur 8 ausgefüllte kästchen. Ich habe dieses LCD von Pollin für 2,95 mit dem HD44780
Es hat eigentlich 16*1, aber vllt. muss man auch 8*2 machen.

Kannst du bitte mal dein programm schicken, was nun läuft?

vielen Dank

rolfw20
09.04.2006, 19:09
Hi T.J.
das höhrt sich so an als wenn du das gleiche Display hast wie ich.
die esten 8 Zeichen werden mit
Locate 1,1
Lcd "text" (Zeichen 1-8 )
angesprochen
die 2.ten 8 Zeichen mit
Locate 2,1
Lcd "Text" (Zeichen 9-16)
dabei ist dann das erste Zeichen an der 9,ten Stelle.

Ich hoffe Du kannst was damit anfangen. O:)

Gruß
Rolf

T.J.
09.04.2006, 19:26
ok, aber ich habe vor allem wenn ich anschalte nur 8 kontrastkästchen :-k

ist das Programm von oben soweit richtig?

hier mal meine Variante:


$regfile = "m16def.dat"
$crystal = 1000000
Config Lcd = 16 * 1a 'Display
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Lcdbus = 4

Ddrd = &B11100000
Portd = &B00000000

Portd.5 = 1
Portd.6 = 0

Dim A As Single
Dim B As Single
A = 4.0
B = 12.1
Initlcd
Do

Toggle Portd.5
Toggle Portd.6

Cls
Locate 1 , 1
Lcd "test1 1234567890"
Wait 2
Cls
Locate 1 , 1
Lcd "test2 " ; A ; " " ; B
Wait 2
Cls
Locate 1 , 1
Lcd "test3"
Locate 2 , 1
Lcd A ; B
Wait 2
Loop

T.J.
09.04.2006, 21:41
sooo, es läuft nun.

da ich Port d genommen hatte musste JTAG deaktiviert werden.

danke für deine Hilfe \:D/

rolfw20
10.04.2006, 13:16
Hi T.J. O:)
sorry das ich gestern nicht mehr geantwortet habe, aber ich hatte leider keine Zeit.
Umsobesser finde ich es das Du selbst die Lösung gefunden hast.

Gruß
Rolf