Forum: Mikrocontroller und Digitale Elektronik ADC Port auslesen


von Andreas R. (moron)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
ich habe einen AT90CAN128.
ich lese zu beginn meines Programmes alle 8 ADC-Ports direkt 
nacheinander ein. nun stelle ich fest, dass sich die Werte gegenseitig 
beeinflussen, sprich: wenn ich das zu messende Spannungssignal am ersten 
ADC-Port verändere, so verändern sich auch alle nachfolgenden Werte der 
7 weiteren Ports, obwohl die dort anliegenden Signale konstant geblieben 
sind.
weiß jem woran es liegen könnte. ich lese bei jeder Messung immer einen 
"WarmUP" Wert aus und setze die Variablen immer wieder auf 0 zurück.
die Funktion aus dem "AVR-GCC-Tutorial" was ich hier mal gefunden habe. 
ich habe sie etwas verändert, nicht viel.

mfg
Andreas

von Johannes M. (johnny-m)


Lesenswert?

Als erstes fällt mir auf: ADCH und ADCL sind Read-Only-Register. Die 
kannst Du nicht schreiben!

von Johannes M. (johnny-m)


Lesenswert?

Ich kann im Code konkret keine dicken Fehler entdecken. Allerdings ist 
der Code erstens unvollständig (wo ist main?) und außerdem unformatiert 
und somit schlecht lesbar.

Abgesehen davon: Ich kenne keinen AVR-C-Compiler, der keinen 
16-Bit-Zugriff auf die ADC-Ergebnisregister unterstützt. Das Gefuddel 
mit der richtigen Reihenfolge beim Auslesen und High-Byte schieben usw. 
ist in C überflüssig.

von Andreas R. (moron)


Lesenswert?

das wäre meine 2. frage gewesen. in dem tutorial hat er ein 8bit 
register ausgelesen. und hat sich auch immer den mittelwert aus 4 
messungen von der funktion Readchannel() zurückgeben lassen. deswegen 
ist da auch die for-schleife noch drin.
Ich wußte nicht, wie ich das bei zwei 8bit registern (10bit adc-port) 
machen sollte, deswegen hab ich da rumgeschoben.
kannst du mir sagen, wie du die werte der ADCH- und ADCL-register 
übergeben würdest? so, dass man auch nen mittelwert bilden kann.

von Andreas R. (moron)


Lesenswert?

ok, hab den fehler.
hatte vorher "ADMUX |= mux" geschrieben, hab nun "ADMUX=mux" und es 
läuft. das mit dem mittelwert und dem auslesen ohne schiebeoperatoren 
funzt auch.
danke und schönes we:)

von Johannes M. (johnny-m)


Lesenswert?

Ist klar, wenn Du die MUX-Bits mit |= setzt, ohne sie vorher alle 
gelöscht zu haben, steht natürlich irgendwann "111" da drin....

von Elias B. (bouni)


Lesenswert?

Tag zusammen,

@ Andreas R.

Könntest du deinen jetzt funktionierenden Code mal bitte posten!?

Ich will in den nächsten Wochen auch mal n bissel mit ADC-Ports 
rumspielen und bin nicht grade die größte Leuchte was C angeht, da sind 
beispiele immer hilfreich!

Danke im Voraus!!!

Gruß Bouni

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
Noch kein Account? Hier anmelden.