Forum: Mikrocontroller und Digitale Elektronik LCD kaputt? Text bleicht aus


von Nette M. (nette-mann)


Lesenswert?

ALso ich hab ein 2 x 24 Zeichen Display und spreche es mit BASCOM und 
einem Atmega 8 an. Es ist nun so, das ich Text drauf schreiben kann, 
aber die letzten ca 5 Buchstaben verblassen. Ich versuch mal Bild zu 
machen. Häng ich jetzt aber hinter TESTTEST z.B: nohmals TEST also 
TESTTESTTEST dran wird das was eben ausgeblichen war, voll angezeigt. 
Setze mich mal ans Foto ran. Hiererstmal der Text: (Auszug)

$regfile = "m8def.dat"
$crystal = 4000000
CConfig Lcdpin = Pin , Db4 = PortD.2 , Db5 = Portc.1 , Db6 = Portc.2 , 
Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Config Lcd = 24 * 2
Config Lcdbus = 4
Cursor = Off
Config Adc = Single , Prescaler = Auto

Dim Adc_vh As Byte
Dim W_vh As Word

Adc_vh = 0 ' pin a0

Start Adc
Main:
    Cls
    Locate 2 , 1
    W_vh = Getadc(adc_vh)
    Lcd "wert:" ; W_vh
    Locate 2 , 10
    Lcd "TESTTEST"
  End If

Goto Main

von Nette M. (nette-mann)


Angehängte Dateien:

Lesenswert?

Bild vom LCD

COde bissel verändert. Gleiches Problem:
$regfile = "m8def.dat"
$crystal = 4000000
Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , 
Db7 = Portb.2 , E = Portb.0 , Rs = Portb.1
Config Lcd = 24 * 2
Config Lcdbus = 4
Cursor = Off
Config Adc = Single , Prescaler = Auto

Dim Adc_vh As Byte
Dim W_vh As Word

Adc_vh = Portc.0

Start Adc


Main:
    Cls
    Locate 2 , 1
    W_vh = Getadc(adc_vh)
    Lcd "wert:" ; W_vh
    Locate 2 , 10
    Lcd "TESTTEST"
  End If

Goto Main

PS: ADC ist nebensächlich. Teste nur bisschen rum

von Nette M. (nette-mann)


Lesenswert?

NUn gehts, zwar der ADC noch net, aber egal:

$regfile = "m8def.dat"
$crystal = 4000000
Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , 
Db7 = Portb.2 , E = Portb.0 , Rs = Portb.1
Config Lcd = 24 * 2
Config Lcdbus = 4
Cursor = Off
Config Adc = Single , Prescaler = Auto
Start Adc
Dim W As Word , Channel As Byte
Channel = 0

Do
  W = Getadc(channel)
  Cls
  Locate 2 , 1
  Lcd " value " ; W
  If Channel > 7 Then Channel = 0
Loop
End

von Nette M. (nette-mann)


Lesenswert?

NUn gehts

$regfile = "m8def.dat"
$crystal = 4000000
Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , 
Db7 = Portb.2 , E = Portb.0 , Rs = Portb.1
Config Lcd = 24 * 2
Config Lcdbus = 4
Cursor = Off
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim W As Word , Channel As Byte
Channel = 0

Do
  W = Getadc(channel)
  Lcd " value " ; W
  If Channel > 7 Then Channel = 0
Loop
End

Wo es dran lag man weis es nicht

von Edi (Gast)


Lesenswert?

Ich meine, Du hast das Display einfach nur zu schnell gelöscht und 
wieder beschrieben. Die ersten Zeichen werden nach dem Löschen zuerst 
wieder dargestellt und sind dadurch länger sichtbar, die letzten Zeichen 
werden praktisch gleich nach dem Anzeigen wieder gelöscht.

Mein Tip wäre, feste Texte ("value") nur einmal zu schreiben, und den 
eigentlichen Wert dann jeweils zu überschreiben, etwa in der Art:
1
Lcd " value "
2
3
Do
4
  ...
5
  Locate 2 , 8
6
  Lcd W
7
  ...
8
Loop
Damit man sich verändernde Ziffern noch erkennen kann, würde ich sowieso 
nicht mehr als 3-5 mal in der Sekunde neue Werte aufs Display schreiben.

von Stephan H. (stephan-)


Lesenswert?

tja das passiert eben wenn man einfach drauf los hackt.
Ein gewisses "Timing" sollte ein Programm schon haben.

zB. Messung jede Sekunde, dann Aktualisierung des LCD
Die Werte bleiben ja so lange stehen bis neue kommen.
Also keine Hast.

von Nette M. (nette-mann)


Lesenswert?

Momentan flimmern die VCC Werte aber LED AUS Flimmert nicht. Das liegt 
an Waitms 50 aber setzt ich das auf Wait 1 kann ich mein Programm 
knicken ;)

Muss aber

  Lcd Fusing(c , "#.##")
  Waitms 50

da stehen lassen ansonsten kann ich gar nix mehr lesen ;) kann es au nit 
vor Loop setzen es muss genau da bleiben aber egal ob waitms 500 oder 2 
es flimmert

Vorbeugend gegen Verwirrung:

Es wird Kanal ADC 0 und ADC 1 gemessen und im LCD angezeigt (VCC) und 
über UART ein Port gesteuert. Momentan versuch ich nen Taster 
einzubinden Druck drauf LED an Druck nomma drauf LED aus aber da hab ich 
atm seit 2 std nen Brett vorm kopf

von Karl H. (kbuchegg)


Lesenswert?

Nette Mann schrieb:
> Momentan flimmern die VCC Werte aber LED AUS Flimmert nicht. Das liegt
> an Waitms 50 aber setzt ich das auf Wait 1 kann ich mein Programm
> knicken ;)
>
> Muss aber
>
>   Lcd Fusing(c , "#.##")
>   Waitms 50
>
> da stehen lassen ansonsten kann ich gar nix mehr lesen ;) kann es au nit
> vor Loop setzen es muss genau da bleiben aber egal ob waitms 500 oder 2
> es flimmert

Wozu brauchst du einen Messwert der sich auf der Anzeige 20 mal in der 
Sekunde aktualisiert? Kein Mensch kann so schnell schauen bzw. 
reagieren.
Und was dabei auf der Anzeige rauskommt, wenn man zu kurz hintereinander 
Werte draufschreibt (oder gar das LCD löscht) hast du ja jetzt gesehen.

(Der ganze Ansatz mit der Schleife ist schon Müll. Aber wenns denn sein 
muss: Es reicht völlig, wenn du nur alle 10 oder 20 Schleifendurchgänge 
den LCD Wert aktualisierst)

von Nette M. (nette-mann)


Angehängte Dateien:

Lesenswert?

Hab versucht mit Interrupt (Enable Interrupts Enable ADC usw.) Nur das 
klappte net ganz so wie ich wollte und die praktische BASCOM Hilfe und 
Freund Google half da nicht nd weil man hier so freundlich unterstützt 
wird in Sachen Interrupts hab ich erst gar net gefragt.

Also:

  Locate 1 , 9
  Lcd Fusing(g , "#.##") ; " VCC Hinten"
  Locate 2 , 9
  Lcd Fusing(c , "#.##") ; " VCC Vorne"
  Waitms 50

verringert das flimmern nur leicht

von Karl H. (kbuchegg)


Lesenswert?

Nette Mann schrieb:
> Hab versucht mit Interrupt (Enable Interrupts Enable ADC usw.)

Nicht ADC Interrupt.

Ein Timer muss her.
Der Timer löst alle, meinetwegen, halbe Sekunde einen Interrupt aus.
Der Interrupt führt dazu, dass eine Messung gemacht wird und die 
Ergebnisse aufs LCD kommen.

Und wenn der Interrupt schneller als alle halbe Sekunde kommt, zb alle 
0.1 Sekunden, dann macht man zusätzlich einen Zähler ins Programm rein, 
der bis 5 zählt. Ist er bei 5, dann ist ebenfalls eine halbe Sekunde 
vergangen.

> wird in Sachen Interrupts hab ich erst gar net gefragt.

Ach komm. In BASCOM ist das doch nun wirklich ein Klacks.


Ein typischer Programmaufbau auf einem µC sieht praktisch fast immer 
gleich aus:
Da gibt es einen Timer, der für einen Basistakt sorgt. Damit hat man im 
Programm sowas wie eine 'Uhr' die regelmässig tickt. Alle anderen 
Aktionen werden an diesen Takt gekoppelt und man kriegt auf diese Art 
einen geordneten zeitlichen Ablauf hin.

von Stephan H. (stephan-)


Lesenswert?

der Kalr Heinz und ich habe doch gesagt wie es geht.
Also nochmal.

Wenn schon dann messe 20mal/Sek
Das Display und Dein Auge begnügen sich mit 3-5 Werten /Sek
Also hast Du genug Zeit aus den Werten einen Mittelwert zu bilden.
Ein Timer muß her !!
Lasse den Timer mit 20 Int/SEk laufen und Messe.
Nach 5 Messungen Mittelwert bilden und dann 1 Mal ausgeben.
Dann wieder 5 Messungen usw.
Da hast Du dann 4 Werte /Sek

Ist doch nicht sooo schwer.

Shit... Karl Heinz war schneller.

von Nette M. (nette-mann)


Lesenswert?

Also nehm ich:

 Config Timer0 = Timer, Prescale= 8
 Enable Timer0
 On  Timer0  Isr_von_Timer0
 Enable Interrupts

Hauptschleife

Isr_von_Timer0:
Hier den Dreck mit ADC
 Return

Grobes modell

von Karl H. (kbuchegg)


Lesenswert?

Nette Mann schrieb:
> Hab versucht mit Interrupt (Enable Interrupts Enable ADC usw.) Nur das
> klappte net ganz so wie ich wollte und die praktische BASCOM Hilfe und
> Freund Google half da nicht nd weil man hier so freundlich unterstützt
> wird in Sachen Interrupts hab ich erst gar net gefragt.
>
> Also:
>
>   Locate 1 , 9
>   Lcd Fusing(g , "#.##") ; " VCC Hinten"
>   Locate 2 , 9
>   Lcd Fusing(c , "#.##") ; " VCC Vorne"
>   Waitms 50
>
> verringert das flimmern nur leicht

Nochmal: Wozu brauchst du eine Anzeige, die 20 mal in der Sekunde 
aktualisiert wird? 2 oder 3 mal tuts auch!

  Counter = Counter + 1

  if Counter = 5 then
    Counter = 0
    Locate 1 , 9
    Lcd Fusing(g , "#.##") ; " VCC Hinten"
    Locate 2 , 9
    Lcd Fusing(c , "#.##") ; " VCC Vorne"
  end if

  waitms 50


(Keine Gewähr für die BASCOM Syntax)

von Karl H. (kbuchegg)


Lesenswert?

Nette Mann schrieb:

> Grobes modell

Viele Wege führen zum Ziel.
Du musst ein wenig experimentieren. Nur so lernt man die Details.

Aber im Allgemeinen erledigt eine Interrupt Routine nicht sehr viele 
Dinge. AM Besten funktioniert:

In der Interrupt Routine wird eine Variable auf 1 gesetzt.

In der Hauptschleife wird abgefragt, ob die Variable 1 ist. Ist sie das, 
wird sie wieder auf 0 gesetzt und der zugehörige Rotz (bei dir ADC 
abfragen und aufs LCD ausgeben) ausgeführt.

Auf die Art hat man den Interrupt möglichst schnell wieder frei und in 
der Hauptschleife wird im Timertakt spezieller Code regelmässig 
ausgeführt.

von Nette M. (nette-mann)


Lesenswert?

Probieren tue ich seit 1 Uhr heut morgen ;) Counter = Counter + 1 ist 
bei mir eher contra produktiv mal schaun Hatte erst die Idee ADC in ne 
Var als str zu schreiben und die Var dann immer auszulesen aber 
Interrupt ist auch mal interessant

Lc = Lc + 1
  If Lc = 20 Then
  Lc = Lc - 20

das sind ungefähr 2 sekunden Also kastriere ich das ganze und hab ne 
halbe sek bzw werde ich wohl ne ganze nehmen ;)

von Stephan H. (stephan-)


Lesenswert?

ich frage mich ob Bascom es hin bekommt den Wert auszugeben bevor die 
nächste Eins kommt...bei 20 S/Sek

von Karl H. (kbuchegg)


Lesenswert?

Nette Mann schrieb:
> Probieren tue ich seit 1 Uhr heut morgen ;) Counter = Counter + 1 ist
> bei mir eher contra produktiv

Ob du den Zähler Counter nennst oder Lc ist ja wohl Jacke wie Hose (Ich 
kenn ja dein Programm nicht, weiß daher auch nicht, welche Variablen du 
schon benutzt)

>
> Lc = Lc + 1
>   If Lc = 20 Then
>   Lc = Lc - 20
>
> das sind ungefähr 2 sekunden Also kastriere ich das ganze und hab ne
> halbe sek bzw werde ich wohl ne ganze nehmen ;)

Na siehste. Mit ein wenig Phantasie geht fast alles.


>   If Lc = 20 Then
>   Lc = Lc - 20

Wenn Lc gleich 20 ist, und das muss es sein, sonst wäre der Then Zweig 
nicht genommen worden, was ist dann das Ergebnis von Lc - 20?

Man sagt zwar, dass man nicht vorzeitig optimieren soll. Man soll aber 
auch nicht sonnlos Rechenoperationen ausführen, deren Ergebnis man 
kennt. Verbraucht nur Rechenzeit. Und in deinem Fall ist das auch noch 
besonders blöd, denn wenn du die 20 auf 10 änderst, musst du an 2 
Stellen ändern. Und dabei vergisst man dann gerne eine Codestelle. 
Speziell dann, wenn die Änderung erst morgen oder übermorgen oder 
nächste Woche gemacht wird.
-> Bau dir nicht selbst Stolpersteine ins Programm ein, wenn es nicht 
sein muss!

von Nette M. (nette-mann)


Lesenswert?

Reset LC

mochte er nicht:

Dim Lc As Byte
Dim I As Byte
Dim Hello As Bit
Dim G As Single
Dim X As Single
Dim B As Single
Dim C As Single
Dim D As Single
Dim An As Bit
Dim Vcc As Bit
Dim L As String * 10
Dim Z As Word , Channel2 As Byte
Dim W As Word , Channel As Byte

Bin bei 31 % Flash

von Stephan H. (stephan-)


Lesenswert?

Karl heinz Buchegger schrieb:
>
>>   If Lc = 20 Then
>>   Lc = Lc - 20
>
> Wenn Lc gleich 20 ist, und das muss es sein, sonst wäre der Then Zweig
> nicht genommen worden, was ist dann das Ergebnis von Lc - 20?

nullen muß er aber irgendiwe !

von Karl H. (kbuchegg)


Lesenswert?

Stephan Henning schrieb:
> Karl heinz Buchegger schrieb:
>>
>>>   If Lc = 20 Then
>>>   Lc = Lc - 20
>>
>> Wenn Lc gleich 20 ist, und das muss es sein, sonst wäre der Then Zweig
>> nicht genommen worden, was ist dann das Ergebnis von Lc - 20?
>
> nullen muß er aber irgendiwe !

Und? Wo ist das Problem bei

    Lc = 0

von Stephan H. (stephan-)


Lesenswert?

nix Problem, nur weniger Rechenaufwand mit LC=0.
Zumindest hat er den Sinn erfasst.

von Nette M. (nette-mann)


Lesenswert?

So genug verwirrt worden. Pflege mal mein RL bis heut Abend.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.