Hallo ich möchte über eine interruptgesteuerte Werteeinlesung machen. Er soll sozusagen, ein Signal abtasten und mir alle Werte in eine Variable speichern. Das Einlesen macht er schon, aber irgendwie bekomm ich da einen falschen Wert. Vielleicht weiß jemand, was ich da falsch eingestellt habe. Schick mal den nötigen Teil des Quelltextes: //Initialisierung des Analog Digitalwandler ADMUX = 1<<REFS0 | 1<<MUX2 | 1<<MUX0; ADCSRA= 1<<ADEN | 1<<ADATE | 1<<ADIE; DIDR0|= 1<<ADC5D; ADCSRA |= 1<<ADSC; ISR(ADC_vect) { messsig=(ADCL) +(8<<ADCH); //Messwerte werden in Register geschrieben messsigmV=messsig*5000/1027; //Umwandeln der Messwerte in mV messsigmV=messsigmV-1367; //Offset wird abgezogen } Irgendwo muss da jetzt ein kleiner Fehler sein. Aber ich find den gerade nicht. Hat jemand eine Idee, wäre super nett :) P.S. Das ist ein ATMEGA328
Andreas schrieb: > messsig=(ADCL) +(8<<ADCH); //Messwerte werden in Register Du schiebst die 8 um ADCH-Schritte nach links :-) --> (ADCH * 0x100) ist besser
Hi
> messsig=(ADCL) +(8<<ADCH);
-> messsig=(ADCL) +(ADCH<<8);
MfG Spess
spess53 schrieb: > Hi > >> messsig=(ADCL) +(8<<ADCH); > > -> messsig=(ADCL) +(ADCH<<8); > > MfG Spess Hmm, erfolgt ein automatischer Typcast auf 16-Bit, wenn das 8-Bit Register ADCH nach links geschoben wird?
Hi >Hmm, erfolgt ein automatischer Typcast auf 16-Bit, wenn das 8-Bit >Register ADCH nach links geschoben wird? Weiss ich nicht. Benutze kein C. MfG Spess
Hehe ^_^ @Andreas: Wenn Du AVR-GCC benutzt, kannst Du stattdessen auch ADCW benutzen. Das gibt Dir den 10 Bit Wert schon richtig zusammengebaut zurück. Ist eigentlich ein Funktionsmakro in der Bibliothek was ADCL und ADCH richtig zusammensetzt. ->> messsig = ADCW; /edit: Welcher Variablentyp ist eigentlich Deine messigmV-Variable? Double oder 32-Bit Integer?
Also zu Zeit hab ich das Ding als float, bin mir aber nicht sicher, ob das so gut ist :P . Über dieses ADCW liest er schon was ein. Aber die Werte passen kein Stück zu meinem eingelesenen Signal. Mein Signal liegt zwischen 1120mV und 1330mV und momentan bekomm ich da Werte zwischen 300mv und 8000mV. Das macht irgednwie keinen Sinn.
Andreas schrieb: > zwischen 1120mV und 1330mV und momentan bekomm ich da Werte zwischen > 300mv und 8000mV. Das macht irgednwie keinen Sinn. Dann lass dir erst mal die ADC Werte als Rohwerte anzeigen. Welchen Datentyp hat messig? > Also zu Zeit hab ich das Ding als float, bin mir aber nicht sicher, > ob das so gut ist :P Macht wahrscheinlich wenig Sinn http://www.mikrocontroller.net/articles/FAQ#Datentypen_in_Operationen
Also meiner Meinung nach müssten die digitalen Werte des ADC hinkommen. Hab jetzt einfach mal so aus Spass gesagt, er soll das jetzt mal mit 4 multiplizieren. Der offizielle Umrechnungsfaktor von Digitalwerten auf mV liegt ja irgendwie bei 4,87 (5000/1027) oder so. Und da gibt er mir schon völligen Mist aus. Seiner Meinung nach ist 4*100(digital)= 1680 oder so in der Art, also völliger Mist. Anscheinend muss der Fehler bei der Umrechung von Digitalwerten auf mV passieren. Liegt das vll am Variablentyp ?
Andreas schrieb: > Also meiner Meinung nach müssten die digitalen Werte des ADC hinkommen. Kommen sie oder kommen sie nicht? Im Vertrauen: Nichts gegen deine Meinung aber hier sind Fakten gefragt. Wenn ich für jeden Fall, bei dem sich hinterher rausgestellt hat, dass schon die Eingangswerte nicht stimmen einen Euro bekommen hätte, wäre ich heute ein reicher Mann. Da ich aber zu dämlich war, dafür jedesmal einen Euro zu verlangen, bin ich dazu übergegangen in einer Berechnung erst mal die Eingangswerte zu überprüfen. Das bringt mir zwar auch keinen Reichtum, spart aber Zeit, wenn wieder mal so ein Fall vorliegt. In der Kette Eingabe - Berechnung - Ausgabe ist nun mal 'Eingabe' der erste Schritt, bei dem schon Unsinn passieren kann. Und wie sagt schon der Volksmund so schön: garbage in - garbage out
PS: Dass 1023 * 5000 den Rechenbereich von int verlässt, stört dich irgendwie nicht besonders? (1023 ist der größte überhaupt mögliche Wert vom ADC)
Also ich habe jetzt messsig und messsigmV erstmal double gesetzt und dann kann er schon mal auf jeden Fall mit 4 multiplizieren. Das klappt schon mal. So mein Signal liegt also zwischen 1230 und 1460 mV. Meine digitalen Werte liegen jetzt zwischen 290 und 512, ab und zu kommt da mal sowas zwischen wie 1038 oder so. Wenn ich das jetzt mal so umrechne mit dem Faktor 5000/1027 passen die nicht dazu. Nur woran kann das liegen ?
Naja messsig und messsigmV sind ja jetzt double. Und das 5000/1027 ist ja nur für die Umrechnung da und hat letztendlich doch nichts mehr mit dem Einlesen vom ADC zu tun oder seh ich das falsch.
Nochmal bitte den aktuellen Code. Aber diesmal mit den tatsächlichen Datentypen Dazu die Analyse, was bei einem Messwert von 290 eigentlich rauskommen müsst und was tatsächlich rauskommt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.