Forum: Mikrocontroller und Digitale Elektronik Autorannge Voltmeter


von ralf (Gast)


Lesenswert?

Servus zusammen

kann mal eine bitte über das Prgramm schauen und sagen, worum das 
Programm auf dem Controller net das macht, was ich möchte?Also die 
automatische Umschaltung( Der MEssbereich 3V funktioniert)

Kurz zum Projekt:

Auto-Range multimeter( Versuchs/ Messplatine) mit 3 Fenster +/- 
3V/300mV/ und 30mV
Die Spannungsbereiche wollen wir mittles HighPegel aus Fensterkomparator 
ausgegeben der nun die Funktionen im Programm ansteuern soll.
Die Spannungen zeigt er mir nur " normal als Volt an, also nicht als mV 
ausgabe. Desweiteren schwangen die Spannungen im 300mV auf der Ausgabe 
des LCD, was kann ich dagegen Softwaremäßig machen?
Das Programm:


$regfile = "m16def.dat"
$crystal = 4000000
$hwstack = 16
$swstack = 32
$framesize = 32
Baud = 9600


Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , 
Db7 = Portb.5 , E = Portb.6 , Rs = Portb.7
Config Lcd = 16 * 2

Led1 Alias Portc.5


Config Portc.0 = Input 'port für ac Messung-anzeige

Config Portc.1 = Input 'port für 3V
Config Portc.2 = Input 'port für 300mv
Config Portc.3 = Input 'port für 30mV
Config Portc.4 = Input


Dim C0 As Bit , C1 As Bit,
Dim C2 As Bit , C3 As Bit,
Dim C4 As Bit , C5 As Bit

Const Adc_multi = 0.0048828125
Const Negativ = 2.5
Const Drei = 1.2
Const Dreih = 0.12
Const Dreissig = 0.012 ' = 5.0 / 1024.0
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Messergebnis As Word
Dim Volt As Single


C0 = Pinc.0
C1 = Pinc.1
C2 = Pinc.2
C3 = Pinc.3
C4 = Pinc.4
C5 = Pinc.5

Config Led1 = Output
If C0 = 1 Then Set Led1 'led für ac MESSUNG
Led1 = 1



If C0 = 0 Then Reset Led1
Led1 = 0


Initlcd
Cls

Cursor Off
Cls 'Begrüßungsfenster
Locate 1 , 3
Lcd "text"
Locate 2 , 3
Lcd "textE"
Wait 10
Cls
Locate 1 , 1
Lcd "Experimentier-"
Locate 2 , 1
Lcd "Platine"
Wait 10
Cls

Start Adc
Do


'Config Led1 = Output
'If C0 = 1 Then Set Led1 'led für ac MESSUNG
' Led1 = 1





Messergebnis = Getadc(0)



If C1 = 1 And C2 = 0 And C3 = 0 Then ' 3V
Volt = Messergebnis * Adc_multi
Volt = Volt - Negativ
Volt = Volt * Drei


Locate 1 , 1
Lcd "ADC0 "
Lcd Messergebnis
Lcd " "

Locate 2 , 1
Lcd Fusing(volt , "###.###")
Lcd " V "
Waitms 500

End If

If C2 = 1 And C3 = 0 And C1 = 0 Then ' 300mv
Volt = Messergebnis * Adc_multi
Volt = Volt - Negativ
Volt = Volt * Dreih
Volt = Volt * 1000


Locate 1 , 1
Lcd "ADC0 "
Lcd Messergebnis
Lcd " "

Locate 2 , 1
Lcd Fusing(volt , "###.###")
Lcd "mV "
Waitms 500

End If

If C3 = 1 And C1 = 0 And C2 = 0 Then ' 30mv
Volt = Messergebnis * Adc_multi
Volt = Volt - Negativ
Volt = Volt * Dreissig
Volt = Volt * 1000

Locate 1 , 1
Lcd "ADC0 "
Lcd Messergebnis
Lcd " "

Locate 2 , 1
Lcd Fusing(volt , "###.###")
Lcd "mV "
Waitms 500

End If

Loop




End

von Karl H. (kbuchegg)


Lesenswert?

So wie ich das sehe
1
C0 = Pinc.0
2
C1 = Pinc.1
3
C2 = Pinc.2
4
C3 = Pinc.3
5
C4 = Pinc.4
6
C5 = Pinc.5

liest du genau EINMAL den Zustand der Pins ein.
Das hier ist kein Alias, mit dem du dem Pinc.0 einen anderen Namen 
gibst, sondern da wird eingelesen.
Allerdings nur ein einziges mal, vor der Hauptschleife. Nachdem die 
Werte feststehen, ändern sie sich nie wieder, egal wie oft du danach C0 
in der Schleife prüfst.


> Desweiteren schwangen die Spannungen im 300mV auf der Ausgabe
> des LCD, was kann ich dagegen Softwaremäßig machen?

Aus mehreren Messungen einen Mittelwert nehmen

von ralf (Gast)


Lesenswert?

Also

Karl Heinz Buchegger schrieb:
> C0 = Pinc.0
> C1 = Pinc.1
> C2 = Pinc.2
> C3 = Pinc.3
> C4 = Pinc.4
> C5 = Pinc.5
>
> liest du genau EINMAL den Zustand der Pins ein.
> Das hier ist kein Alias, mit dem du dem Pinc.0 einen anderen Namen
> gibst, sondern da wird eingelesen.
> Allerdings nur ein einziges mal, vor der Hauptschleife. Nachdem die
> Werte feststehen, ändern sie sich nie wieder, egal wie oft du danach C0
> in der Schleife prüfst.

Also diese Anweisung mit in dei SChleife nehmen, wenn ich es richtig 
verstehe?!
Eigentlich wollte ich dieses als Namenszuweisung geben, damit ich diese 
in der Schleife ansprechen kann. Wie würde es denn richtig sein?

von Karl H. (kbuchegg)


Lesenswert?

ralf schrieb:

> Eigentlich wollte ich dieses als Namenszuweisung geben, damit ich diese
> in der Schleife ansprechen kann. Wie würde es denn richtig sein?

Tja. Was du wolltest ist aber nicht das was du geschrieben hast.
Und für den Compiler zählt nur das, was du geschrieben hast.

Schau mal in die BASCOM Doku zum Thema "ALIAS"

von ralf (Gast)


Lesenswert?

So danke erstmal für deine Hilfe, hab es wie folgt geändert

Pinc.0 Alias C0
Pinc.1 Alias C1
Pinc.2 Alias C2
Pinc.3 Alias C3
Pinc.4 Alias C4
Pinc.5 Alias C5

Werd am Montag gleich mal schauen was es jetzt macht ;)

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.