PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC problem



Robin1508
17.11.2007, 14:05
Hi, ich hab vor kurzem mein RN-Control Board (V1.4) bekommen und möchte nach ein paar LED tests einen LDR mittels ADC auswerten.
Doch auch mit der Suche und der RN-Wissensdatenbank bin ich nicht weitergekommen.
Meine Schaltung sieht folgendermaßen aus. Den LDR hab ich an einen der 3 VCC pins (JP1 Leiste) und an den 1. Stecker von Port 1 angeschlossen. (Ich hoffe soweit richtig)

Jetzt mein Source, der nicht funktioniert.





$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Output
Config Portc.4 = Output
Config Portc.5 = Output
Config Portc.6 = Output
Config Portc.7 = Output


Config Porta = Input



Config Adc = Single , Prescaler = Auto
Dim W As Word , Ch As Long

Dim Port As Long

Tccr1b = Tccr1b Or &H02


Do
Start Adc
W = Getadc(ch)

If W > 50 Then
Portc.0 = 0
End If
If W > 200 Then
Portc.1 = 0
End If
If W > 400 Then
Portc.2 = 0
End If

If W < 50 Then
Portc.7 = 0
End If


Ch = Ch + 1
If Ch > 7 Then
Ch = 0
End If


Waitms 100




Loop

End


Gruß Robin

PicNick
17.11.2007, 14:21
----Den "Start Adc" macht man üblicherweise VOR dem "Do", also nur einmal.

----Die Analog-Pins solltest du auf "Input" konfigurieren

----Einzelne Pins konfiguriert man mir "PINx.N", das ist gewöhnungsbedürtfig


CONFIG PORTc = OUTPUT ' ALLE Pins von 0-7
CONFIG PINc.3 = OUTPUT ' Nur Pin 3


--- du setzt deine Pins immer nur auf 0, niemals auf 1. Da wird nicht viel zu sehen sein.

--- Wenn du nur einen LDR angeschlossen hast, reicht GETADC(0)

--- Für Ch reicht "AS Byte"

--- Der LDR muß einen Spannungsteiler bilden, VCC nach analog-Pin ist zuwenig.

--- *schnauf*

Robin1508
17.11.2007, 15:22
Danke schonmal für deine Antwort.

Ich hab mein Code jetzt aktualisiert. Ich hoffe soweit richtig =P~





$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

Config Portc = Output
Config Porta = Input



Config Adc = Single , Prescaler = Auto
Dim W As Word


Tccr1b = Tccr1b Or &H02

Start Adc
Do

W = Getadc(0)
If W > 50 Then
Portc.0 = 0
End If
If W > 200 Then
Portc.1 = 0
End If
If W > 400 Then
Portc.2 = 0
End If

If W < 50 Then
Portc.7 = 0
End If


Waitms 100




Loop

End


Beim Spannungsteiler bin ich mir auch nich nicht sicher. Ich habs ausgerechnet, wenn auf den LDR sehr helles Licht fällt und er 500 Ohm Widerstand hat, dann ergibt sich durch den Spannungsteiler 1,66 Volt, wenn er stark abgedunkelt wird und >200k hat, liegen eben >4,9 Volt an.
Ist das richtig soweit ?

http://images.mpg-esports.eu/bild/175/spannungsteilerjpgMQ2KM.jpg

PicNick
17.11.2007, 18:12
Nun gut. Ich nehm an, daß du je nach Spannung verschieden viele LED leuchten sollen.
Also mußt du vor jeder Messung erstmal zurücksetzen:


Do
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.7 = 1

W = Getadc(0)
If W > 50 Then
Portc.0 = 0
End If
If W > 200 Then
Portc.1 = 0
End If
If W > 400 Then
Portc.2 = 0
End If
If W < 50 Then
Portc.7 = 0
End If
Loop


Den "waitms" brauchst du nicht, der nutzt nix

Zu geeigneten Werten mußt du dich hintasten

Dirk
17.11.2007, 18:47
Hallo Robin1508,

Beim Spannungsteiler bin ich mir auch nich nicht sicher. Ich habs ausgerechnet, wenn auf den LDR sehr helles Licht fällt und er 500 Ohm Widerstand hat, dann ergibt sich durch den Spannungsteiler 1,66 Volt, wenn er stark abgedunkelt wird und >200k hat, liegen eben >4,9 Volt an.
Ist das richtig soweit ?


Bei mir hat sich dies bewährt:
Ein Spannungsteiler 220 kOhm / 4,7 kOhm zwischen 5V und Masse.
Der LDR wird parallel zum 220 kOhm-Widerstand angeklemmt.

Der ADC-Eingang (AD-Wandler) des AVR wird an den Abgriff (zwischen 220k und 4,7k) angeschlossen.
Diese Schaltung liefert ca. 0,1 bis 4,9 V je nach LDR-Typ und Umgebungshelligkeit, hat also eine gute Spreizung.

Gruß Dirk

Robin1508
18.11.2007, 12:46
Alles klar, ich hab jetzt an meinem Code noch n bissl rumgebastelt und alles erneut verkabelt (um Wackelkontakte auszuschließen) und siehe da, es funktioniert. O:)

Hier ist mein Code.





$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

Config Portc = Output
Config Porta = Input





Config Adc = Single , Prescaler = Auto
Dim W As Long



Start Adc
Do


W = Getadc(7)
If W > 50 Then
Portc.1 = 0
Else
Portc.1 = 1
End If
If W > 100 Then
Portc.2 = 0
Else
Portc.2 = 1
End If
If W > 200 Then
Portc.3 = 0
Else
Portc.3 = 1
End If
If W > 400 Then
Portc.4 = 0
Else
Portc.4 = 1
End If
If W > 600 Then
Portc.5 = 0
Else
Portc.5 = 1
End If
If W > 700 Then
Portc.6 = 0
Else
Portc.6 = 1
End If
If W > 800 Then
Portc.7 = 0
Else
Portc.7 = 1
End If


If W < 50 Then
Portc.0 = 0
Else
Portc.0 = 1
End If





Loop

End


Nur könnte mir jemand sagen was diese Zeile bewirkt?




Tccr1b = Tccr1b Or &H02


Ich hatte sie Anfangs in meinem Code, weil ich irgentwo mitbekommen habe dass diese Zeile rein muss. Doch er funktioniert mit oder ohne genau gleich.

Gruß

linux_80
18.11.2007, 14:40
Hallo,

diese Zeile ist nur wenn man ein ältere Bascom-Version mit Timer1 und PWM verwendet, da brauchte man das wohl :-k

Wenn kein Timer1 im Einsatz ist, machts auch keinen Unterschied ;-)