PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC Wert falsch??? HILFEEE!



meldano
16.05.2007, 14:56
Hallo,

habe folgendes Programm getippt (Tiny45,Auszug):


$regfile = "ATtiny45.dat" 'Tiny45 Regfile

$crystal = 8000000 '8MHz

On Adc Onadc 'Interrupt für Adc Wert

Admux = &B00100010
' ^^-----------------Voltage Reference:00=Vcc
' ^----------------Left Adjust
' ^---------------Not Used
' ^^^^-----------Analog Channel:0010=ADC2 PB4

Adcsra = &B11111101
' ^-----------------Adc Enable
' ^----------------Adc Start Conversion
' ^---------------Adc Auto Trigger Enable
' ^--------------Adc Interrupt Flag
' ^-------------Adc Interrupt Enable
' ^^^----------Adc Prescaler Select Bits;Prescaler128

Enable Interrupts 'Interrupts globaleinschalten

Dim Analog As Word
Dim Akku_low As Bit

do
loop

Onadc: ' Interrupt ADC
Analog = Adch 'ADC Wert an Variable übergeben
If Analog =< 485 Then
Akku_low = 1 'Akku_low Bit bilden
End If
If Analog >= 533 Then
Akku_low = 0
End If
Return

Der ADC ist 10 Bit breit also 1024 Dig.
Also müsste bei der 5V Referenz das Akku_Low Bit bei <=2,368V gesetzt und bei 2,604V zurückgesetzt werden.
Tut es leider nicht, das Bit ist die ganze Zeit gesetzt. Ich muss die beiden Werte (485 sowie 533) schon auf ca. 100 runttersetzen mit sich etwas im 2V Bereich am ADC tut.

Langsam verzweifel ich. Das Datenblatt habe ich schon zig mal gelesen.
Vielleicht findet ja hier jemand den Fehler.

Danke
Daniel

Ratber
16.05.2007, 17:12
Ja,ich bin mal so gemein und frage dich was das Kürzel "ADCH" bedeutet (Ich weiß es) und ob da nicht doch noch etwas fehlt ?

meldano
16.05.2007, 18:34
Bist du gemein :cry:

Aber so lernt man ja am besten.


Onadc: ' Interrupt ADC
Analog = Adch 'ADC Wert an Variable


"ADCH" finde ich in der Bascom Hilfe nicht. Nach suchen im Netz habe ich herausgefunden das es das ADC Hibyte ist, also 8Bit breit.
Doch was ist ein Hi- bzw. Lowbyte?
Wenn ich jetzt mit einer Auflösung von 8Bit=256 messe, dann komme ich bei Spannungen um 2,3V auf 121Dig, was ja hinhauen würde.
Doch wie bekomme ich so eine 10Bit auflösung hin?
Vielleicht so:

Onadc: ' Interrupt ADC
Analog = Adch + Adcl
???
Der Compiler schimpft schon mal nicht...
Hab die Schaltung gerade nicht hier, so dass ich es ausprobieren kann.

Gruß
Daniel

robbifan
16.05.2007, 20:08
wert=adch*256+adcl

Ratber
16.05.2007, 20:28
@Meldano


Bist du gemein

Yep !



Aber so lernt man ja am besten.

Genau darum geht es.

Mich graust es immer wenn ich mitbekomme das die Leute zwar alles Mögliche basteln wollen aber sogut wie nichts an Grundlagen besitzen.
Selbst das Lesen und verstehen eines Datenblattes ist oft Fehlanzeige oder nur sehr Mangelhaft.

Da einfach nur Vorkauen zu oft dazu führt das der Jeweilige damit einfach verschwindet,nichts lernt um dann beim nächsten Problem wieder auf der Matte zu stehen händle ich es lieber nach Möglichkeit mit kleinen nicht zu komplizierten Anmerkungen und leichten Rätseln um die eigenständige Suche und Kombination des jeweiligen zu fordern.
Gerade letzteres ist in fast allen Gebieten menschlicher Tätigkeiten sehr wichtig.

Zur Rechnung und den Lösungsansätzen:

Du bist auf dem richtigen Weg und hast den Wesentlichen Teil schon entdekt.
Jetzt mußt du nur die Vorgehensweise in die richtige Reihenfolge bringen.

Es ist nur noch ein kleiner Schritt Mathematischer Natur.

Tipp:

Im Datenblatt des Controllers steht alles nötige dazu drinne.
Les einfach mal den Abschnitt zum ADC durch.
Du mußt nicht alles behalten aber ein grober Überblick bringt etwas Übersicht.


@Robbifan

Psssssssssst........Oller Spielverderber ;)

meldano
19.05.2007, 03:02
Hi Ratber,

ja zum lernen bin ich ja hier! Ich möchte keine Codeschnipsel ohne sie zu verstehen. Deswegen setze ich die Register weitestgehend ja auch händisch.
Nur so lernt man wie der Controller funktioniert.

Leider komme ich mit deinen Tips aber nicht so ganz weiter.

Folgende Info habe ich gefunden (Ein Gedankengang):
-Das ADC Messergebnis wird in die Register ADCH sowie ADCL geschrieben (da Ergebnis 10Bit also in zwei Register).
-Wichtig ist auch ADLAR im Steuerregister ADMUX. Hier wird "eingestellt" wie das Messergebnis ausgerichtet ist. Also Rechts- oder Linksbündig.

Rechtsbündig:Die 8 niederwertigsten Bits des Ergebnisses werden in ADCL abgelegt. Die verbleibenden 2 Bits des Ergebnisses werden im Register ADCH in den Bits 0 und 1 abgelegt.

Linksbündig:Die 8 höchstwertigen Bits des Ergebnisses werden in ADCH abgelegt. Die verbleibenden 2 niederwertigen Bits werden im Register ADCL in den Bits 6 und 7 abgelegt.

Ich hatte ja im eingangs genannten Beispiel linksbündig ausgerichtet. Also:

2 hoch 9 ; 2 hoch 8 ;.....2 hoch 2 > ADCH

2 hoch 1 ; 2 hoch 0 > ADCL

Wenn ich jetzt also rechtsbündig ausrichte, und adcl "voll" habe ergibt das ja 255. Wenn adch 2hoch0 sowie 2hoch1 "Eins" ist komme ich auf 3.

In die Formel von Robifan eingesetzt, (3*256)+255= 1023 also 10 Bit auflösung.

Wenn der ADC jetzt nur 8Bit breit wäre, dann würde ich einfach rechtsbündig ausrichten und ADCL auslesen.
__________________________________________________ ____________

Gedankengang ende ;-)

Liege ich mit meiner Logik jetzt richtig und kann sagen, ich habe es verstanden, oder liege ich voll daneben ?????


Danke für eure Hinweise!

Ratber
19.05.2007, 08:20
Bis auf den letzten Satz kann man alles so stehen lassen.




Wenn der ADC jetzt nur 8Bit breit wäre, dann würde ich einfach rechtsbündig ausrichten und ADCL auslesen.

Wenn der ADC wirklich nur 8 Bit hätte dann gäbe es kein ADCH und ADCL sondern nur ein einzelnes Ausgaberegister und im Forum viiiiielll weniger Fragen zu dem Thema "Wie lese ich meinen ADC aus" (Ne,kein Quatsch.Is wirklich so). :D

Spaß beiseite.

Oder meintest du das in Zusammenhang mit dem anderen Topic also der Auflösungsreduzieung ?

Wenn ja dann ist es etwas komplexer.
Wenn man diue auflösung reduzieren will dann nimmt man die Niederwertigsten Stellen weg (Willst du 0-100V Messen und das Multimeter bietet schon auf 0.01V Genau an dann schneidet man die Niederwertigsten Stellen also die beiden hinterm Komme weg).
Dh. beim ADC läst man die niederwertigsten Bits angefangen bei 0 weg.
Man kann den ganzen 10-Bit wert nehmen und per Shiftbefehl bzw. durch entsprechende Teilung die Auflösung herabsetzen.

Soweit ok ?

meldano
19.05.2007, 15:23
Hi Ratber,

vielen Dank!
Jetzt kann ich sagen, ich habe alles verstanden :-)
Und habe nicht einfach nur nen Codeschnipsel eingefügt.

War halt gestern spät als ich den letzten Beitrag geschrieben habe.

Gruß
Daniel

Ratber
19.05.2007, 17:06
Yo,is ja kein Problem.

Ich sehe gerade das ich Heut Morgen auch nicht gerade sehr gradeaus geschrieben habe :lol:

robbifan
20.05.2007, 14:59
...Wenn der ADC jetzt nur 8Bit breit wäre, dann würde ich einfach rechtsbündig ausrichten und ADCL auslesen. .....


jo...

Ratber
20.05.2007, 15:52
...Wenn der ADC jetzt nur 8Bit breit wäre, dann würde ich einfach rechtsbündig ausrichten und ADCL auslesen. .....


jo...





Wenn der ADC wirklich nur 8 Bit hätte dann gäbe es kein ADCH und ADCL sondern nur ein einzelnes Ausgaberegister und im Forum viiiiielll weniger Fragen zu dem Thema "Wie lese ich meinen ADC aus" (Ne,kein Quatsch.Is wirklich so). :D