www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC Port auslesen


Autor: Andreas R. (moron)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas R. (moron)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas R. (moron)
Datum:

Bewertung
0 lesenswert
nicht 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:)

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Elias B. (bouni)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.