mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Analog Digital Converter beim AVR


Autor: Junis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich schlage mich nun schon die ganze Nacht und den halben Tag mit
diesem Problem rum.

Ich habe einen Temperatursensor am ADC Wandler meines AVRs. Bis jetzt
habe ich einfach den freerun Modus angeschaltet und ab und zu mal die
Werte eingelesen. Die temperaturen stimmten alle und ich war glücklich.
Nun wollte ich aber auf den single conversion modus umstellen und immer
die Kanäle umschalten. Nun zeigt er nur noch mist an, selbst, wenn ich
alle sensoren abziehe. Wenn ich einen Sensor kalt mache, dann gehen
alle anderen auch runter. Die ausgelesenen werte scheinen völlig
beliebig zu sein. vielleicht mache ich was falsch. Hier der code, mit
dem ich die werte auslese.


Im Programm:

  ldi  mp,0x01
  out  ADMUX,mp
  RCALL  ADC
  IN  SLOW,ADCL
  IN  SHIGH,ADCH

Zum Kanal setzen und aufrufen des unterprogrammes

adc:

  LDI  up,0b11000110
  OUT  ADCSR,up

adcwait:


  IN  up,ADCSR        ;soll auf ende der conversation warten
  SBRC  up,ADSC
  RJMP  adcwait


  LDI  up,0b10000110 ;0xE6
  OUT  ADCSR,up

  RET

Danach lese ich mit:

        ldi  mp,0x02
  out  ADMUX,mp
  RCALL  ADC
  IN  SLOW,ADCL
  IN  SHIGH,ADCH

den nächsten sensor ein. DAs klappt aber nun gar nicht.

Bitte helft!

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du an folgendes Gedacht:

Die allererste Wandlung des ADC ist ein "dummy", also Schrott.

Die allererste Wandlung brauch 12 Takte mehr als eine Normale.

Die Wandlungszeit ist bei Single-Conversion etwas länger.

Hast du register doppelt?

Dein Wandler kan vom CPU-Kern gestört werden, da kann man einen
Rauschreduzierer einschalten.

Wieso schaltest du den ADSC noch zusätzlich aus, nachdem die schleife
eh nur abgebrochen wird wenn er '0' ist?

Wie wird der Befehl aufgerufen   LDI mp,0x02, ich sehe keine
Sprungmarke davor? Kann es sein, dass dieser Befehl nie erreicht wird?

Wieso benutzt du nicht die Interrupt-funktion, dann brauchst du diese
Schleife nicht mehr?

Gruß
Chris

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.