PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einfaches Wattmeter mit einem "Schönheitsfehler"



Caligula
09.08.2008, 13:09
Hallo,

ich habe mir mal ein kleines Wattmeter Programm gebastelt.
welches man später mit nur wenig externen Bauteilen in die Praxis umsetzen könnte.

Nur leider besitzt das Programm einen kleinen Schönheitsfehler.

Bei 8,1 Watt Leistung wird korrekt "8.1W " angezeigt.
Steigt die Leistung auf 10,1 Watt wird auch korrekt "10.1W" angezeigt.
Jetzt kommt der Schönheitsfehler. Wenn die Leisung aber wieder auf 7,9V absinkt wird aber leider "7.9WW" angezeigt. :(

Kann man die ...

Lcd Fusing(watt , "#.#") ; "W"

... Zeile so abändern das da was vernünftiges rauskommt?



$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 30
$framesize = 60


Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Cursor Off
Cls

Dim Messvolt As Word
Dim Messstrom As Word
Dim Volt As Single
Dim Strom As Single
Dim Watt As Single

Const Spannungsfaktor = 0.0048828125
Const Stromfaktor = 0.0048828125

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

Messvolt = Getadc(0)
Messstrom = Getadc(1)
Volt = Messvolt * Spannungsfaktor
Strom = Messstrom * Stromfaktor
Watt = Volt * Strom

Locate 1 , 1
Lcd "Wattmeter"

Locate 1 , 12
Lcd Fusing(watt , "#.#") ; "W" 'siehe Text

Locate 2 , 3
Lcd Fusing(volt , "#.#") ; "V"

Locate 2 , 11
Lcd Fusing(strom , "#.#") ; "A"

Waitms 100

Loop

End


gruß Cali :)

Rofo88
09.08.2008, 13:52
Mache doch vorher ein CLS

Caligula
09.08.2008, 15:40
Hallo Rofo88,

danke für deinen Hinweis, aber für Cls in der Hauptscheife ist das Display etwas zu träge.
Es flackert, vielleicht lässt sich das flackern mit ...

Cls 1 , 16 , 16

... in den Griff bekommen aber irgendwie funktioniert das nicht und aus der Hilfe werde ich auch nicht wirklich schlau.

gruß Cali :)

uwegw
09.08.2008, 15:48
Ich gebe in solchen Fällen an der betreffenden Stell erst so viele Leerzeichen aus, wie der Text maximal lang sein kann. Dann springe ich direkt wieder zurück, und überschreibe die Leerzeichen mit den Daten.

Und wenn man es wirklich gut machen will, schreibt man sich ne Funktion, die die Zahlen immer in fester Position ausgibt, also bei kleinen Zahlen führende Nullen oder Leerzeichen einfügt. Dazu müsstest du theoretisch nur testen, ob watt kleiner 10, und dann erst ein Leerzeichen schreiben. Das liest sich dann auch viel angenehmer, weil die Position nicht springt.

Caligula
09.08.2008, 16:21
Hallo uwegw,

danke für deine tipps.

Die erste Variante funktioniert zwar ist aber sehr unschön, weil man auch wieder das flackern hat.

Die 2. Variante klingt vernünftig, mir wäre es auch lieber wenn der Punkt nicht hinundherspringt. Leider habe ich keine Vorstellung wie eine solche Funktion aussehn könnte. Kennst du dafür irgend ein Guide oder Codebeispiel.

Ps: Hätte vielleicht erwähnen sollen, das ich ein absoluter Neuling in Sachen Programmierung bin. Hab mir gestern mittag meine myAVR Platine zusammengelötet und am abend meinen erstes Programm getippt.

gruß Cali :)

PicNick
09.08.2008, 16:27
Man kann das fusing erst in einen String machen, und dann mit LEN() fragen, wie lang die Sache geworden ist. Daraus kann man die Anzahl der notwendigen Füll-Blanks festellen.
Angenommen, du willst immer 4 stellen haben


DIM flo AS SINGLE

DIM ss AS STRING * 10
DIM fil AS BYTE
flo = 8.7 ' z.B.
ss = FUSING(flo, "#.#")
fil = 4 - LEN(ss)
If Fil > 0 Then
LCD Spc(fil) ;
End If
LCD Ss ; "W"

uwegw
09.08.2008, 16:29
Du machst erst dein Locate, und dann

If watt<10 Then
Lcd " "
Endif

Danach dann die Ausgabe.

(Hoffe, das funktioniert so. Hab jahrelang kein Bascom benutzt.)

Dnerb
09.08.2008, 18:24
Jo, erst eine Leerzeichen ausgeben und dann die Zahl mit W.

Oder jedesmal ein "W " ausgeben, dann wird das "W" das stehenbleibt überschrieben.

Spion
09.08.2008, 19:15
Hallo

Mach es doch so:



If watt <10 then

Locate 1 , 12
Lcd " "; Fusing(watt , "#.#") ; "W"

Else

Locate 1,12
Lcd Fusing(watt , "#.#") ; "W"

end if





mfg Luca

Caligula
10.08.2008, 12:58
Problem gelöst! :)

Hab den Vorschlag von PicNick mal unter die Lupe genommen, ihn aufgebröselt und nochmal etwas vereinfacht.

Strom, Spannung und Leistung werden jetzt korrekt sowie flimmerfrei angezeit. Desweiteren ist der Code übersichtlicher geworden und kann ohne weiteres auf x beliebige Stellen erweitert werden.



$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 30
$framesize = 60

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Cursor Off
Cls

Dim Messvolt As Word
Dim Messstrom As Word
Dim Volt As Single
Dim Volt_a As String * 10
Dim Strom As Single
Dim Strom_a As String * 10
Dim Watt As Single
Dim Watt_a As String * 10

Const Spannungsfaktor = 0.0048828125
Const Stromfaktor = 0.0048828125

Do

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

Messvolt = Getadc(0)
Messstrom = Getadc(1)

Volt = Messvolt * Spannungsfaktor
Strom = Messstrom * Stromfaktor
Watt = Volt * Strom

Locate 1 , 1
Lcd "Wattmeter"

Volt_a = Fusing(volt , "#.#")
If Len(volt_a) = 3 Then
Volt_a = " " + Volt_a + "V"
Else
Volt_a = Volt_a + "V"
End If
Locate 1 , 12
Lcd Volt_a

Strom_a = Fusing(strom , "#.#")
If Len(strom_a) = 3 Then
Strom_a = " " + Strom_a + "A"
Else
Strom_a = Strom_a + "A"
End If
Locate 2 , 12
Lcd Strom_a

Watt_a = Fusing(watt , "#.#")
If Len(watt_a) = 3 Then
Watt_a = " " + Watt_a + "W"
Else
Watt_a = Watt_a + "W"
End If
Locate 2 , 3
Lcd Watt_a

Waitms 250

Loop

End


gruß cali :)