mikrocontroller.net

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


Autor: Nette Mann (nette-mann)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nette Mann (nette-mann)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Nette Mann (nette-mann)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nette Mann (nette-mann)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Edi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
Lcd " value "

Do
  ...
  Locate 2 , 8
  Lcd W
  ...
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.

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nette Mann (nette-mann)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Nette Mann (nette-mann)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nette Mann (nette-mann)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nette Mann (nette-mann)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Stephan Henning (stephan-)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Nette Mann (nette-mann)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan Henning (stephan-)
Datum:

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

Autor: Nette Mann (nette-mann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So genug verwirrt worden. Pflege mal mein RL bis heut Abend.

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.