www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC fehler


Autor: luxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo
ich hab bei meinem mega16 mal den adc testweise in betrieb genommen.
nur leider ist das ergebniss immer 1023, egal ob 0,01V oder 4,99V
anliegt(an PORTA, 7). Die konfiguration muüsste eigentlich richtig
sein. ich habe als messspannungsquelle einfach nen 1KOHM poti
hergenommen, schleifer auf ADC7 und der rest auf gnd und +5V .

Unten ist mal der wichtigste teil des quelltextes:
wichtig, der untere teil ist nicht documentiert, da wird dann bloß noch
geschaut welcher wert in "balken" steht, damit die entsprechende
routine zur ausgabe aufgerufen werden kann.

==================================================

ldi temp, 0b01111111          ;Port A = Ausgang/eingang
           out DDRA, temp

       ldi temp1, 0b11100000
       out DDRD, temp1               ;Port D = Ausgang, Eingang

       cli                           ; Interrupts sperren

           ; _ADC_ einrichten

           ldi temp, 0b00000111          ; Vorteiler einstellen (128)
       out ADCSRA, temp              ; und nach ADCSRA ausgeben

       cbi ADCSRA, ADIE              ; ADC Int ausschalten


       cbi ADMUX, REFS1              ; AREF ext hernehmen
       cbi ADMUX, REFS0

       sbi ADMUX, 0                  ; Kanal 7 hernehmen
       sbi ADMUX, 1
       sbi ADMUX, 2
       cbi ADMUX, 3
       cbi ADMUX, 4



       sbi ADCSRA, ADEN              ; ADC generell einschalten


           rcall lcd_init                ; Display hochfahren
       rcall lcd_clear

loop:      rcall auslesen                ; ADWandlung aufrufen
           rcall ausgabe

           rcall warteschleife

       rjmp loop





auslesen:

           sbi ADCSRA, ADSC              ; ADWandlung starten

ADC_busy:  sbis ADCSRA, ADIF             ; ADC noch busy?
           rjmp ADC_busy

           in SL, ADCL                   ; Daten auslesen
     in SH, ADCH

           ror SH                       ; auf 256 werte verkleinern
           ror SL
           ror SH
           ror SL

           mov WERT, SL                  ; ab das eigentliche Register



       ret


ausgabe:
           clr balken       ; balken loeschen

ausgabe1:
           subi WERT, 32    ; von WERT 32 abziehen
           brmi count       ; wenn negativ, dann Ende
           inc balken       ; balken hochzählen
           rjmp ausgabe1    ; und nochmal

count:
           ldi temp, 0x01
           cp temp, WERT
           breq balken1a

       ldi temp, 0b00000010
           cp temp, WERT
           breq balken2a

       ldi temp, 0b00000011
           cp temp, WERT
           breq balken3a

       ldi temp, 0b00000100
           cp temp, WERT
           breq balken4a

       ldi temp, 0b00000101
           cp temp, WERT
           breq balken5a

       ldi temp, 0b00000110
           cp temp, WERT
           breq balken6a

       ldi temp, 0b00000111
           cp temp, WERT
           breq balken7a

       ldi temp, 0b00001000
           cp temp, WERT
           breq balken8a

Autor: Andreas R. (rebirama)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi, programmiere normalerweise nicht in asm, aber
probier mal nach jedem "kanalwechsel" eine probemessung zu machen,
bei der du das ergebnis verwirfst.
erst dann die eigentlcihe messung machen.
hat bei mir wunder geholfen

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei ausgabe sehe ich kein ret. Außerdem kannste Dir die Rotiererei
sparen, wenn Du das ADLAR-Bit in ADMUX setzt und nur das High-Byte
ausliest...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, die Marke 'warteschleife' sehe ich auch nirgends. Oder haste
das Programm unten einfach abgeschnitten?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du bei PortA.7 den Pull-Up deaktiviert???

Autor: Michele B.. (luxx) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also:
ja warteschleife ist weiter unten, ich hab ja gesagt, es ist nur der
wichtigste teil des codes.

dann, kanalwechsel ? wieso, ich mess nur auf ADC7, die restlichen
kanäle sind io's.

das ret bei ausgabe wird nicht gebraucht. er springt, sobalt er fertig
ist mit dem runterzählen, zu "count" da gibt er dann das ergebniss
aus und dann, kommt irgendwann mal ret. dass is nimmer da oben drauf!

Autor: Michele B.. (luxx) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum pullup aus?
der is auf eingang geschaltet...

luxx

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der Pull-Up an ist, misst Du alles Mögliche, nur nicht den Wert,
der mit dem Poti eingestellt wird...

Autor: Michele B.. (luxx) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähhm blöde frage, wie soll ich den abschalten?

luxx

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ldi temp1, 0b00000000
out PORTA, temp1

oder so ähnlich

Autor: Michele B.. (luxx) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ok das hab ich schon gemacht.
und ddra is auch 0b00111111
also liegts daran nicht, oder?


luxx

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wo ihr einmal bei dummen Fragen seit.
Dein Poti ist i.O.?

Autor: Michele B.. (luxx) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Dein Poti ist i.O.?"    <<< ??
in ordnung? ja ist er ich hab ja schon diverse messungen durchgeführt.
hätt ja sein können dass es keinen kontakt gibt oder AREF(is auf +5V)
kein Referenzstrom kriegt.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Poti hängt an Aref?

Autor: Michele B.. (luxx) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein des hängt an ADC7. an AREF ist +5V.

luxx

Autor: luxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo
aslso der adc funzt jetzt soweit, der fehler war im code.

aber was anderes:

wenn ich den poti "aufdrehe", also mehr V in den ADC reinlass, geht
soweit alles gut, aber genau bei der hälfte(ca.2,5V) baut der adc
plötzlich mist, er liefert als wert nur noch "0" ... "-1" (ich hab
die ausgabe erweitert). woran kann das liegen?

luxx

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die interne Referenz ist ca 2,5V. Hast du also wirklich deine externe
Referenz in den ADC-Steuerregistern eeingestellt?

Autor: luxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja hab ich ganz sicher.
siehste ja ganz oben, da hab ich die konfiguration gepostet.

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.