Archiv verlassen und diese Seite im Standarddesign anzeigen : Strom und Spannungsmessung
Hallo
Ich habe hier ein Programm was an einem ADC Eingang vom Mega32 die Spannung misst und an einem zweiten die Spannung die an einem Widerstand abfällt um daraus den Strom zu berechnen.
Allerdings zeigt das LCD mir die Werte jeweils zwei mal an und ich weiß nicht wieso.
Hier ist der Code
$regfile = "m32def.dat"
$crystal = 16000000
Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4
Start Adc
Declare Sub _spannungsmessung()
Declare Sub _strommessung()
Declare Sub _spannungsanzeige()
Declare Sub _stromanzeige()
Const Ref = 5 / 1023
Dim Spannung As Single
Dim Strom As Single
Dim Volt As Single
Dim Ampere As Single
Main:
Do
Initlcd
Cls
Call _spannungsmessung
Call _spannungsanzeige
Call _strommessung
Call _stromanzeige
Loop
End
Sub _spannungsmessung
Local W As Word
W = Getadc(0.)
Spannung = W * Ref
Spannung = Spannung * 1
Volt = Spannung
End Sub
Sub _strommessung
Local S As Word
S = Getadc(1.)
Strom = S * Ref
Strom = Strom / 100
Ampere = Strom
End Sub
Sub _spannungsanzeige()
Locate 1 , 1
Lcd "Spannung :"
Locate 1 , 13
Lcd Spannung
End Sub
Sub _stromanzeige()
Locate 2 , 1
Lcd "Strom :"
Locate 2 , 13
Lcd Ampere
End Sub
Und hier ein Foto um das Problem zu zeigen.
http://img684.imageshack.us/img684/6269/bilddk.jpg
Was ich meine ist das z.B. 2x der Spannungswert angezeigt wird.
Hallo Kampi,
versuch die LCD-Ausgabe mal so:
Locate 1 , 1
Lcd "Spannung: " ; Spannung
Sonstiges:
- Initlcd gehört nicht in die Do-Loop Schleife, sondern davor.
- Vor Loop würde ich eine kurze Pause setzen: Wait 1
Gruß Dirk
Gut das klappt. Und wie kann ich es machen das er die Single Variable rundet oder so? Weil der stellt jetzt ca 12 oder mehr Stellen da und das ist mir zu lang.
Das kannst Du mit folgendem Befehl machen.
Du brauchst dazu noch eine String-Variable (im Beispiel SpannungSTR)
SpannungSTR = Fusing(Spannung , "#.###")
Dies würde Dir die Werte mit 3 Stellen hinter dem Komma ausgeben.
Du musst dann natürlich die String-Variable im Display anzeigen lassen.
Wie sieht das den Beispielhaft aus? Weil ich kann mir irgendwie grad nichts darunter vorstellen
Du musst eine zusätzliche Variable deklarieren:
Dim SpannungSTR as String
Dann kommt nach dem messen der Spannung der genannte Befehl:
SpannungSTR = Fusing(Spannung , "#.###")
und zur Anzeige auf dem Display schreibst Du dann z.B.:
Locate 1 , 1
Lcd "Spannung: " ; SpannungSTR
So das runden funktioniert allerdings wird die Spannung nun wieder doppelt dargestellt :D
Hallo!
Die Bascom Hilfe ist Dir ein Begriff?
Such nach Fusing und ersetz einfach Print durch Lcd.
MfG
Rone
So ich habd en Code nun soweit fertig....außer die Formeln die müssen noch angepasst werden. Das ist er:
$regfile = "m32def.dat"
$crystal = 16000000
Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4
Start Adc
Declare Sub _spannungsmessung()
Declare Sub _strommessung()
Declare Sub _spannungsanzeige()
Declare Sub _stromanzeige()
Declare Sub _widerstandsmessung()
Declare Sub _widerstandsanzeige()
Const Ref = 5 / 1023
Dim Volt As Single
Dim Strom As Single
Dim Ohm As Single
Dim Spannung As Single
Dim Voltstr As String * 2
Dim Ampere As Single
Dim Stromstr As String * 2
Dim Widerstand As Single
Dim Ohmstr As String * 2
Initlcd
Cls
Main:
Do
Call _spannungsmessung
Call _spannungsanzeige
Call _strommessung
Call _stromanzeige
Wait 1
Loop
End
Sub _spannungsmessung
Local V As Word
V = Getadc(0.)
Spannung = V * Ref
Spannung = Spannung * 1
Volt = Spannung
Voltstr = Fusing(volt , "#.&&")
End Sub
Sub _strommessung
Local A As Word
A = Getadc(1.)
Strom = A * Ref
Strom = Strom / 100
Ampere = Strom
Stromstr = Fusing(strom , "#.##")
End Sub
Sub _widerstandsmessung
Local O As Word
Local P As Word
O = Getadc(2.)
P = Getadc(3.)
Widerstand = Spannung * 1
Ohm = Widerstand
End Sub
Sub _spannungsanzeige()
Locate 1 , 1
Lcd "U = " ; Voltstr ; ""
End Sub
Sub _stromanzeige()
Locate 2 , 1
Lcd "I = " ; Stromstr ; ""
End Sub
Sub _widerstandsanzeige()
Locate 3 , 1
Lcd "R = " ; Ohm
End Sub
Allerdings zeigt mir das LCD die Sachen immernoch nicht richtig an. Zwischen U= und I= ist eine Leerzeile. Und die Bascom Hilfe hilft mir auch irgendwie nicht wirklich weiter, weil das Problem einfach nicht verschwindet.
Hallo!
Was mir mal so spontan ins Auge springt:
Du definierst einen String mit 2 Zeichen:
Dim Stromstr As String * 2
Dann probierst Du 4 Zeichen da reinzuquetschen:
Stromstr = Fusing(strom , "#.##")
Ich find zwar keine Leerzeile,aber:
Lcd "I = " ; Stromstr ; ""
Vor und nach dem = ist sehr wohl ein Leerzeichen!
Vielleichts hilfts weiter.
MfG
Rone
Nein das hilft alles nichts. Und was ich meinte ist das hier.
So sieht das LCD Display vom Text her im moment aus
----------------------
| U =
|
| I =
----------------------
Und es soll so aussehen:
----------------------
| U =
| I =
| R =
----------------------
Also im ganz groben :D
Hallo!
Wo wird die Widerstandsanzeige aufgerufen?
MfG
Rone
Die hab ich im moment noch rausgeschmissen aus dem Hauptprogramm, weil die durch den Fehler jedesmal die ganze Anzeige verhuntzt.
Hallo
Versuch mal vor dem End Sub in den Unterprogrammen Stromanzeige und Spannungsanzeige ein Waitms 1000 einzusetzen.
Ansonsten scheint dein Programm schon i.O. zu sein.
Roland
Mmh bringt auch nichts.....aber wenns nicht das Programm ist was ist es dann?
Hallo !
Hast Du mal anstelle von Locate X, X
die Befehle Secondline, Thirdline, Fourthline benutzt ?
Nur mal um zu testen , das es auch ein 4 zeiliges Display ist.
Roland
Hallo !!
Kleiner Fehler von mir.
Die Befehle heissen :
Upperline --1. Zeile
Lowerline --2. Zeile
Thirdline --3. Zeile
Fourthline --4. Zeile
Damit klappts bestimmt
Roland
Die Befehle kommen jeweils immer anstelle von dem Locate oder? Hab die jetzt mal anstelle vom Locate gemacht aber es geht immernoch nicht >.<. Langsam nervt das echt
Hallo !
So:
Thirdline
LCD "Text"
Dann sollte der Text in Linie 3 des LCD ausgegeben werden
Lowerline
LCD "Text"
Dann sollte der Text in Linie 2 des LCD ausgegeben werden
Die Waitms 1000 nicht vergessen.
Roland
Ne er schreibt es in Zeile 1 und 3 obwohl es in Zeile 1 und 2 soll..... . Kann das eventuell auch ein Fehler am LCD sein?
molleonair
09.02.2010, 21:50
hatte mal ähnliche Probleme
kann es sein das du ein EADOG oder EADIP Display verwendest ?
probier mal:
Config LCD = 20 * 4a
Versuch mal folgendes :
CLS
Upperline
LCD "U= "
Waitms 1000
Lowerline
LCD "I= "
Waitms 1000
Thirdline
LCD "R= "
Waitms 1000
Dann müsste es klappen
Roland
Ne klappt auch nicht richtig.....2 und 4 will er nicht darstellen :/
molleonair
09.02.2010, 22:01
was genau hast du für ein lcd ??
Das hier:
http://www.conrad.de/goto.php?artikel=181863
molleonair
09.02.2010, 22:09
Das läuft bei mir in meiner reflowsteuerung auch
hier mal der code
wahrscheinlich reicht es bei dir die config lcd anzupassen
initlcd gleich mit oben hin und noch ein waitms 500
und es sollte laufen
Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcdbus = 4
Initlcd
Config Lcd = 20 * 4a , Chipset = Ks077
Die Zeile wars. Es klappt endlich!!!!!
Tausend Dank an alle für die Tipps ](*,)
molleonair
09.02.2010, 22:16
naja ist mit den EA-LCDs immer so ein Spaß
die tanzen immer ein bissl außer der Reihe
Hallo !!
Hier werden Sie geholfen !!
Roland
So das hier ist dann das fertige Werk:
$regfile = "m32def.dat"
$crystal = 16000000
Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Lcd = 20 * 4a , Chipset = Ks077
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4
Start Adc
Declare Sub _spannungsmessung()
Declare Sub _strommessung()
Declare Sub _spannungsanzeige()
Declare Sub _stromanzeige()
Declare Sub _widerstandsmessung()
Declare Sub _widerstandsanzeige()
Const Ref = 5 / 1023
Dim F As Integer
Dim Volt As Single
Dim Strom As Single
Dim Ohm As Single
Dim Spannung As Single
Dim Voltstr As String * 4
Dim Ampere As Single
Dim Stromstr As String * 4
Dim Widerstand As Single
Dim Ohmstr As String * 4
Initlcd
Cls
Main:
Do
Call _spannungsmessung
Call _spannungsanzeige
Call _strommessung
Call _stromanzeige
Call _widerstandsmessung
Call _widerstandsanzeige
Wait 1
Loop
End
Sub _spannungsmessung
Local V As Word
V = Getadc(0.)
Spannung = V * Ref
Volt = Spannung
Voltstr = Fusing(volt , "#.##")
End Sub
Sub _strommessung
Local A As Word
A = Getadc(1.)
Strom = A * Ref
Strom = Strom / 1 'Shunt = 1 Ohm
Ampere = Strom
Stromstr = Fusing(strom , "#.##")
End Sub
Sub _widerstandsmessung
Local O As Word
Local P As Word
O = Getadc(2.) 'U1
P = Getadc(3.) 'Ux
F = 100 'R1 = 100 Ohm
Widerstand = F * P
Widerstand = Widerstand / O
Ohm = Widerstand
Ohmstr = Fusing(ohm , "#.##")
End Sub
Sub _spannungsanzeige()
Upperline
Lcd "U = " ; Voltstr
Waitms 1000
End Sub
Sub _stromanzeige()
Lowerline
Lcd "I = " ; Stromstr
Waitms 1000
End Sub
Sub _widerstandsanzeige()
Thirdline
Lcd "R = " ; Ohmstr
Waitms 1000
End Sub
Werde Donnerstag auf der Arbeit erstmal die Schaltung Hardwareseitig aufbauen und hoffentlich klappts dann so wie ichs mir vorgestellt habe =)
Falls noch Fragen !!!
Einfach melden.
Roland
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.