Forum: Mikrocontroller und Digitale Elektronik Frage zu Bascom Programierstil


von Joachim (Gast)


Lesenswert?

Hallo,

wie ist denn der richtige Programmierstil für das nachfoldende Beispiel. 
Wenn ich das so umsetze flackert das LCD. Das macht man doch sicher 
anders ohne ständig in der schleife cls und den Text neu zu schreiben 
oder?

$regfile = "m8def.dat"
$crystal = 1000000
 Config Lcd = 16 * 2
 Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , 
Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
 Config Lcdbus = 4
 Portb = $00100000

Do
   If Pinb.1 = 1 Then
    cls
    Locate 1 , 1
    Lcd "gedrückt"
   Else
    cls
    Locate 1 , 1
    Lcd "losgelassen"
 End If
 Loop
 End

von murkscoder (Gast)


Lesenswert?

Hm... Ich kann kein Bascom, Pseudocode.

Pin_alt=0
Do
  If Pinb.1 nicht gleich Pin_alt then
     Pin_alt=Pinb.1
     hier das LCD updaten (s. oben)
  End if
End Do

von ichim (Gast)


Lesenswert?

Lasse das cls weg und füge hinten beim kürzeren text ein paar 
leerzeichen hinzu

von murkscoder (Gast)


Lesenswert?

ichim schrieb:
> Lasse das cls weg und füge hinten beim kürzeren text ein paar
> leerzeichen hinzu
Das ist imho Murks der sich u.U. später mal rächt...

von murkscoder (Gast)


Lesenswert?

Achso, statt Pin_alt=0 besser Pin_alt=Gegenteil von Pinb.1 nehmen um auf 
jeden Fall eine Anzeige auf dem LCD zu haben.

von ... (Gast)


Lesenswert?

Z.B. indem man sich den Zustand des Pins merkt und nur was aufs LCD 
malt, wenn der sich ändert.
Desweiteren indem man das cls wegläßt (dass dauert ewig) und einfach 
beide Zeichenketten gleich lang macht (kürzere hinten mit Leerzeichen 
auffüllen), dann überschreiben sich die einfach.

von Sam .. (sam1994)


Lesenswert?

murkscoder schrieb:
>> Lasse das cls weg und füge hinten beim kürzeren text ein paar
>> leerzeichen hinzu
> Das ist imho Murks der sich u.U. später mal rächt...

Warum Murks? Meine Menuroutinen machen das alle so. Beim Update wird 
immer erst der Text geschrieben und dann so viele Zeichen bis die Zeile 
voll ist.

von murkscoder (Gast)


Lesenswert?

Samuel K. schrieb:
> murkscoder schrieb:
>>> Lasse das cls weg und füge hinten beim kürzeren text ein paar
>>> leerzeichen hinzu
>> Das ist imho Murks der sich u.U. später mal rächt...
>
> Warum Murks? Meine Menuroutinen machen das alle so. Beim Update wird
> immer erst der Text geschrieben und dann so viele Zeichen bis die Zeile
> voll ist.

Naja, bei Menüs kann man sich vielleicht noch darüber streiten. 
Grundsätzlich halte ich das aber für Murks. Ich weiß nicht wie es in 
Bascom ist, in C oder ASM stehen meine Strings nicht unbedingt direkt da 
wo die Ausgabe erfolgt (dort steht nur ein Pointer bzw. ein Label). Wenn 
man dann etwas ändert kann man lange suchen warum immer ein paar 
zusätzliche Zeichen überschrieben werden und ähnliche Geschichten... 
Auch führen die Leerzeichen in C zu falschen Ergebnissen bei strlen(). 
Dann notfalls doch lieber 2 Zugriffe aufs LCD, erstmal nur Leerzeichen 
und dann Text.

von holger (Gast)


Lesenswert?

>Auch führen die Leerzeichen in C zu falschen Ergebnissen bei strlen().

Aber sonst gehts dir gut?

von Sam .. (sam1994)


Lesenswert?

murkscoder schrieb:
> Naja, bei Menüs kann man sich vielleicht noch darüber streiten.
> Grundsätzlich halte ich das aber für Murks. Ich weiß nicht wie es in
> Bascom ist, in C oder ASM stehen meine Strings nicht unbedingt direkt da
> wo die Ausgabe erfolgt (dort steht nur ein Pointer bzw. ein Label).
Es war C. Außerdem würde ich die Ausgabe in eine Routine schreiben und 
nicht übers ganze Programm ziehen. Meine Ausgabemethode nimmt die Länge 
des LCD und zieht pro geschriebenes Zeichen eins ab. Nach dem Schreiben 
werden die restlichen Zeichen per Leerzeichen gelöscht.
> Wenn
> man dann etwas ändert kann man lange suchen warum immer ein paar
> zusätzliche Zeichen überschrieben werden und ähnliche Geschichten...
> Auch führen die Leerzeichen in C zu falschen Ergebnissen bei strlen().
> Dann notfalls doch lieber 2 Zugriffe aufs LCD, erstmal nur Leerzeichen
> und dann Text.
Was im Endeffekt flackert. strlen sollte übrigens nur bei 0 (='\0') 
enden.

von Karl H. (kbuchegg)


Lesenswert?

Samuel K. schrieb:
> murkscoder schrieb:
>>> Lasse das cls weg und füge hinten beim kürzeren text ein paar
>>> leerzeichen hinzu
>> Das ist imho Murks der sich u.U. später mal rächt...
>
> Warum Murks? Meine Menuroutinen machen das alle so. Beim Update wird
> immer erst der Text geschrieben und dann so viele Zeichen bis die Zeile
> voll ist.

Aber du machst den Textupdate doch sicher nur dann, wenn auch 
tatsächlich ein Update notwendig ist. Das ist der wichtigere der beiden 
Punkte in diesem konkreten Fall.


> aja, bei Menüs kann man sich vielleicht noch darüber streiten.
> Grundsätzlich halte ich das aber für Murks.

Ein Cls ist aber ein noch viel größerer Murks.
Denn dann ist das LCD komplett leer. Selbst dann wenn irgendein anderer 
Programmteil in einer Ecke des LCD eine wichtige Information 
hinterlassen hat, die man jetzt erst mühsam wieder rekonstruieren muss.

von murkscoder (Gast)


Lesenswert?

holger schrieb:
>>Auch führen die Leerzeichen in C zu falschen Ergebnissen bei strlen().
>
> Aber sonst gehts dir gut?
Danke, ja.
Ich meine folgendes:
1
char string[]="Eintrag 1       ";
2
int i=strlen(string);
i enthält jetzt 16 obwohl der eigentliche Text nur 9 Buchstaben lang 
ist.

Samuel K. schrieb:
> murkscoder schrieb:
>> Naja, bei Menüs kann man sich vielleicht noch darüber streiten.
>> Grundsätzlich halte ich das aber für Murks. Ich weiß nicht wie es in
>> Bascom ist, in C oder ASM stehen meine Strings nicht unbedingt direkt da
>> wo die Ausgabe erfolgt (dort steht nur ein Pointer bzw. ein Label).
> Es war C. Außerdem würde ich die Ausgabe in eine Routine schreiben und
> nicht übers ganze Programm ziehen. Meine Ausgabemethode nimmt die Länge
> des LCD und zieht pro geschriebenes Zeichen eins ab. Nach dem Schreiben
> werden die restlichen Zeichen per Leerzeichen gelöscht.
Das klingt ganz gut, also die Leerzeichen NICHT direkt in die 
Ausgabestrings gepackt.

>> Wenn
>> man dann etwas ändert kann man lange suchen warum immer ein paar
>> zusätzliche Zeichen überschrieben werden und ähnliche Geschichten...
>> Auch führen die Leerzeichen in C zu falschen Ergebnissen bei strlen().
>> Dann notfalls doch lieber 2 Zugriffe aufs LCD, erstmal nur Leerzeichen
>> und dann Text.
> Was im Endeffekt flackert.
Hm, meinst du? Ja, doch, wenn man erst Leerzeichen schreibt und dann 
Text vielleicht. Naja, dann trag ich mein Pseudonym wenigstens zu Recht. 
;-)

Karl Heinz Buchegger schrieb:
> Aber du machst den Textupdate doch sicher nur dann, wenn auch
> tatsächlich ein Update notwendig ist. Das ist der wichtigere der beiden
> Punkte in diesem konkreten Fall.
Natürlich.

> Ein Cls ist aber ein noch viel größerer Murks.
Das Gegenteil habe ich auch nicht behauptet...

Lasst gut sein, ich war müde.

von Martin S, (Gast)


Lesenswert?

Machs doch einfach mit einem Status-Bit


$regfile = "m8def.dat"
$crystal = 1000000
 Config Lcd = 16 * 2
 Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 ,
Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
 Config Lcdbus = 4
 Portb = $00100000

DIM STATUS as BIT
set STATUS         'damit beim 1.Durchlauf auch was angezeigt wird
Do
  If Pinb.1 = 1 and STATUS=0 Then
    cls
    Locate 1 , 1
    Lcd "gedrückt"
    STATUS=1
  ENDIF
  If Pinb.1 = 0 and STATUS=1 Then
    cls
    Locate 1 , 1
    Lcd "losgelassen"
    STATUS=0
  End If
Loop
End

von Peter D. (peda)


Lesenswert?

murkscoder schrieb:
> Ich meine folgendes:
> char string[]="Eintrag 1       ";
> int i=strlen(string);
> i enthält jetzt 16 obwohl der eigentliche Text nur 9 Buchstaben lang
> ist.

Nö, nach Deiner Ansicht ist der Text nur 8 Buchstaben lang.
Vor der '1' steht ja schon ein ' ', das gehört dann konsequenter Weise 
auch nicht zum Text.
Entweder Du schließt alle ' ' aus oder keines.
Aber dazu mußt Du Deine eigene Programmiersprache schreiben.

In C ist das ' ' ein gültiges Zeichen, also gehört es mit zum Text.
Genauer, alles von 0x01 .. 0xFF ist Text, nur die 0x00 ist als 
Endezeichen reserviert.


Peter

von Andreas P. (smufte)


Lesenswert?

$regfile = "m8def.dat"
$crystal = 1000000
 Config Lcd = 16 * 2
 Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 ,
Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
 Config Lcdbus = 4
 Portb = $00100000

CLS
Do
   If Pinb.1 = 1 Then
    Locate 1 , 1
    Lcd "gedrückt        "
   Else
    Locate 1 , 1
    Lcd "losgelassen     "
 End If
 Loop
 End

mach es so, und nichts Flackert mehr.....

In Bascom geht es nicht besser.

von Martin S, (Gast)


Lesenswert?

wvs swsef schrieb:
> In Bascom geht es nicht besser.

hää? dann schau mal meinen Code weiter oben an. Da wird nur bei einer 
Änderung das Display neu beschrieben. Da flackert nix mehr und es sind 
auch keine Leerzeichen nötig.

von Andreas P. (smufte)


Lesenswert?

hast du dein Code mal ausprobiert?

von Hannes L. (hannes)


Lesenswert?

Martin S, schrieb:
> wvs swsef schrieb:
>> In Bascom geht es nicht besser.
>
> hää? dann schau mal meinen Code weiter oben an. Da wird nur bei einer
> Änderung das Display neu beschrieben. Da flackert nix mehr und es sind
> auch keine Leerzeichen nötig.

Das ist auch nur die halbe Miete, Du musst es so programmieren, dass das 
LCD nur dann aktualisiert wird, wenn auch jemand drauf schaut.

Duck&weg...

...

von murkscoder (Gast)


Lesenswert?

Peter Dannegger schrieb:
> ...
Ach Mensch, ich kann mich einfach nicht klar ausdrücken. :-( Was du 
schreibst ist natürlich richtig und mir bekannt, lassen wir das.

von Sam .. (sam1994)


Lesenswert?

Martin S, schrieb:
> hää? dann schau mal meinen Code weiter oben an. Da wird nur bei einer
> Änderung das Display neu beschrieben. Da flackert nix mehr und es sind
> auch keine Leerzeichen nötig.

natürlich flackert das - auch wenn nur einmal. Zudem die Methode mit 
Leerzeichen hinzufügen eleganter ist, da es nicht so lange dauert.

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.