PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger kann keine 3 leds ansteuern?



kusli
27.07.2007, 19:03
Hallo
ich anfänger bräuchte mal hilfe den ich bringe es nicht zustande 3 Leds (rot,gelb, grün) anzusteuern.
Es Ist so:
Ich habe eine Spannung in einer Variablen gespeichert ,wenn die spannung unter 5V ist sollte rot leuchten bei 5 bis 10 V die gelbe und über 10V die grüne. Ansteuerung klapt aber das mit den Spannungen nicht,
irgendwie stehe ich auf der leitung. Weiss jemand einen trick oder hat einen tip?

CsT
27.07.2007, 19:30
Quellcode wäre sehr hilfreich .. und natürlich auch, wie die Spannung am ADC angelegt wurde, falls du die vollen 10V angelegt hast, wird wohl irgendwas Schaden genommen haben. Also zumindest Ausschnitte vom Schaltplan, falls nötig.

Grüße
CsT

nikolaus10
27.07.2007, 19:31
Hallo

Verstehe nicht so ganz was du meinst.
Hast du dich ueberhaupt mal mit den Grundlagen beschaeftigt?

MFG

kusli
27.07.2007, 19:47
Das einlesen mache ich über einen spannungsteiler und geb es an einem display wieder aus. fuktioniert einwand frei.
Der Wert wir in einer Variablen gespeichert. und die 3 Leds sollten lediglich eine Ladezustandsanzeige geben.
ich bringe es aber nicht hin eben das bei0- 5 volt nur die gelbe leuchtet und bei 5-10V die gelbe und bei 10-13V die grüne.

kolisson
28.07.2007, 00:19
da brauchste sowas in der art:




Const Maxvolt = 248 '14.4 volt
Const Maxvolt2 = 211 '13.8 volt
Const Minvolt2 = 82 '11.7 volt
Const Minvolt = 43 '11.0 volt

die constanten hier sind abhängig vom adc, von der referenz und dem spannungsteiler

Dim Spannung As Word
Dim Spannung8 As Byte

Config Adc = Single , Prescaler = 128 , Reference = Internal
Start Adc

Spannung = Getadc(0 )
Shift Spannung , Right , 2
Spannung8 = Spannung

und dann irgenwie die leds ansteuern --->>
if spannung8 < minvolt dann rot
if spannung8 >minvolt and spannung8< maxvolt2 then gelb
if spannung8> maxvolt2 then grün

kusli
28.07.2007, 10:49
Ja das auslesen klapp tip top.
aber die auswertung mit if>5 then.... und if > und und und klappt irgend wie nicht.
irgendwie stehe ich auf dem schlauch und sehe das problem nicht.
2 leds ansteuern kein problem. aber sobald ich eine dritte dan klappt es irgendwie nicht mit dem if then else usw. jemand ein tip?

Rofo88
28.07.2007, 10:58
Wie weiter oben bereits erwähnt wäre der Quellcode nötig um das problem zu erkennen, meine Kristallkugen ist im Wochenende!

kusli
28.07.2007, 11:21
$regfile = "m32def.dat"
$crystal = 8000000
$baud = 4800

Dim W0 As Word
Dim Spannung0 As Single
Dim Spannungger0 As String * 4

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

Do
Channel = 0
W0 = Getadc(channel)
Spannung0 = W0 * 0.0117192
Spannungger0 = Fusing(spannung0 , "##.##")
Locate 1 , 1
Lcd ; "Bat.1:" ; Spannungger0 ; "V"
Print "ADC-Pin " ; Channel ; " : V " ; Spannungger0
Waitms 500


Jetzt wollte ich hier noch 3 leds ansteuern rot gelb grun für die zustandsanzeige:
(if blblbl > then bla bla bla) das haut aber irgendwie nur mit 2 leds hin)

Loop

kolisson
28.07.2007, 23:18
also ... hier mal aus langeweile für dich gemacht:

anmerkung dazu:
diese ganze wandlung zu single und string und der ganze fusing ist ja lustig und für dein display ja auch wichtig! ich würde es aber erstmal weglassen.

also zunächst die auswertung deiner werte und die steuerung der dioden... und das alles in ganzzahlen... das spart cpu-kapazität.

wenn es denn eher um einen batteriewächter geht reichen 8 bit auflösung erstmal... deswegen die shift-befehle.

// einige werden mich steinigen wegen der speziellen befehle im atmel zur justierung ... aber es spielt hier keine rolle //


die verwendung von avcc als referenz ist nicht so gut, da die betriebsspannung des prozessors ja nicht unbedingt stabil ist. zumindest kann man sagen, dass die option reference=internal irgendwie besser ist.
da haste wenigstens einen realen bezugspunkt, der beim mega32 wohl auf 2,56 liegen soll.
es bietet sich auf jeden fall an, an dem pin für die referenzspannung nachzumessen, was denn der reale wert ist.

für den fall, dass du also die shiftbefehle nun verwendest, können wir davon ausgehen, dass wir vom adc werte zwischen 0 und 255 bekommen.

nun sagen wir, dass die led1 leuchten soll, wenn die werte unter 100 sind
wir sagen auch, dass led2 leuchten soll, wenn der wert von 100 bis 200 ist
und wir sagen led3 ist an, wenn der wert über 200 ist.

bitte prüfe noch, ob du wirklich auf 8mhz arbeitest... das ist für das programm unwichtig... aber mit 4800 baud scheint mir das nicht okay.

also hier mein programmvorschlag:

$regfile = "m32def.dat"
$crystal = 8000000

dim spannug as word
dim spannung8 as byte

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

do

Spannung = Getadc(0 )
Shift Spannung , Right , 2
Spannung8 = Spannung



if spannung8 < 100 then led1=ein else led1 = aus
if spannung8 > 99 and spannung8 < 201 then led2 = ein else led2 = aus
if spannung8 > 200 then led3 = ein else led3 = aus



loop


************************************************** ****


nun kann man das bestimmt besser programmieren, aber es funzt erstmal.... optimierungen kommen halt später



gruss kolisson

Torsten_G
29.07.2007, 10:55
Gerade Dein "Blablabla" wäre schon interessant gewesen - ist der Code für den CIA oder warum schaffst Du es nicht, das VOLLSTÄNDIGE Programm einzustellen??

Grüße

Torsten