-
LCD ADC Ausgabe Problem
Hallo,
Ich versuche, mit einem Atmega8 seine eigene Versorgungsspannung viac LCD auszugeben.
Dazu habe ich folgenden Code geschrieben
Code:
$regfile = "m8def.dat" ' specify the used micro
$crystal = 1000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 150 ' default use 32 for the hardware stack
$swstack = 150 ' default use 10 for the SW stack
$framesize = 60 ' default use 40 for the frame space
'note : tested in PIN mode with 4-bit
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portb.5 , Rs = Portb.6
Dim A As Byte
Dim Druck As Byte
Dim Var As Byte
Dim Uv As Byte
Dim X As Byte
Dim Y As Byte
Config Lcd = 16 * 2
'configure lcd screen
'other options are 16 * 4 and 20 * 4, 20 * 2 , 16 * 1a
'When you dont include this option 16 * 2 is assumed
'16 * 1a is intended for 16 character displays with split addresses over 2 lines
Config Timer1 = Timer , Prescale = 1024
Enable Timer1
Ddrd = &B00000000 'input D
Var = 35
Druck = 150
Enable Interrupts
Cursor Off Noblink
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc
'With STOP ADC, you can remove the power from the chip
'Stop Adc
Dim W As Word , Channel As Byte
'now read A/D value from channel 0
' ------------------------------------ hier liegt der Hund im Graben
Do
W = Getadc(4)
Uv = W * 25
Uv = Uv / 10
Lcd "Vers.Spannung:"
Locate 2 , 0
Lcd Uv ; " mV " ; "-" ; W
Waitms 1800
Cls
' --------------------------------
Loop
End
Rauskommen tut dann immer 16 mV -16
Gemessen sinds 2,55V - 2,54V (1 kOhm + 1 kOhm)
Wieso der ADC Minuswerte angibt, ist mir ein Rätsel. Habe den Spannungsteiler auch umgepolt (wie zu erwarten kein Effekt)
Mit dem Beispielprogramm hat es geklappt, der hat alle Channels (ADC 0-7) durchgeswitched. 546 , 433 usw kam immer raus also realistische Werte. Wieso er jetzt negative Werte ausgibt?
Habt ihr eine Idee???
EDIT: Auch wenn ich 0-W oder -1*W rechne, gibt er nachher Minuswerte aus!!
Mfg
-
Danke, hat schon geklappt.
Ich hatte "-" statt " " geschrieben ;) ...... Und statt Byte benutze ich jetzt Long. Und dann gehts :D
-
Der ADC kann schonmal keine negativen Spannungen messen. Zumindest nicht wenn du nur eine positive Versorgungsspannung hast.
Deswegen vermute ich einen Softwarefehler.
Warum rechnest du sowas?
W = Getadc(4)
Uv = W*25
Uv = Uv/10
Der ADC hat eine Auflösung von 10 Bit. Das heißt 1 Bit entspricht 5V/1024 = 0,0048V. Du sagst du hast einen Spannungsteiler mit 2x 1kOhm. Das heißt bei 5V liegen 2,5V am ADC an, also immer die Hälfte der Spannung am gesamten Spannungsteiler.
Du rechnest nun so:
W = Getadc(4)
W = W * 0,0048 (damit rechnest du den Digitalwert in eine Spannung um, z.B. hast du bei einer Spannung von 2,5V einen Wert von 512 und 512 x 0,0048 = 2,45...)
W = W * 2 (damit "kompensierst" du den Spannungsteiler)
Locate 1, 1
LCD "Vers. Spannung:"
Locate 2, 1
LCD W ; "V"
So sollte er dir das richtige anzeigen :)
Edit: Nagut wenn es so einfach war ^.^