-         

Ergebnis 1 bis 10 von 10

Thema: Einfaches Wattmeter mit einem "Schönheitsfehler"

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    09.08.2008
    Beiträge
    22

    Einfaches Wattmeter mit einem "Schönheitsfehler"

    Anzeige

    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?

    Code:
    $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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.10.2004
    Ort
    Baoding
    Alter
    37
    Beiträge
    687
    Mache doch vorher ein CLS
    Signatur??? kann ich mir nicht leisten!!!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    09.08.2008
    Beiträge
    22
    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

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    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.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    09.08.2008
    Beiträge
    22
    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

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    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
    Code:
    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"
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    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.)

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.01.2005
    Alter
    45
    Beiträge
    294
    Jo, erst eine Leerzeichen ausgeben und dann die Zahl mit W.

    Oder jedesmal ein "W " ausgeben, dann wird das "W" das stehenbleibt überschrieben.
    Das Gegenteil von "gut" ist "gut gemeint"!

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.07.2005
    Ort
    127.0.0.1
    Alter
    26
    Beiträge
    824
    Hallo

    Mach es doch so:

    Code:
    If watt <10 then 
    
    Locate 1 , 12
    Lcd " "; Fusing(watt , "#.#") ; "W" 
    
    Else 
    
    Locate 1,12
    Lcd Fusing(watt , "#.#") ; "W" 
    
    end if

    mfg Luca
    Sollte ein Bild von mir nicht angezeigt werden, einfach eine PM schicken!

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    09.08.2008
    Beiträge
    22
    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.

    Code:
    $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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •