www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC mit Mega88.


Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!
Befasse mich zum ersten mal mit dem ADC des Mega88 und habe dazu einige 
Fragen:

Ich möchte bei jedem Zählerüberlauf im Counter0 einen Messwert an einem 
bestimmten PIN des µC einlesen lassen.

Dazu habe ich bereits aus dem Datenblatt entnommen, dass ich im ADC dies 
einstellen kann und bei jedem Zählerüberlauf der ADC den Wert misst. Nur 
funktioniert das bei mir nicht. Mir ist aufgefallen, dass wenn ich z. B. 
mit lds r16, (1<<ADEN)|(1<<ADATE)... sts ADCSRA, r16 keine Bits im 
jeweiligen Register gesetzt bekommen. Scheint so als würden meine 
Befehle im Sande verlaufen und nicht berücksichtigt.
Wenn ich per Hand das ADEN und ADSC bit setze bekomme ich sofort den 
richtig gemessenen Wert. Aber alle anderen bits die ich in ADCSRA vorher 
gesetzt habe erscheinen nicht.

Hier mal mein bisheriger Code. Ist nur die Initialisierung. Müsste ja 
dann wenn der Interrupt ausgelöst wird in einer Schleife die Werte noch 
sichern, oder?

lds r16, (1<<REFS0)
sts ADMUX, r16
lds r16,(1<<ADEN)| (1<<ADATE)|(1<<ADPS2) | (1<< ADPS1)|(0<<ADPS0)
sts ADCSRA, r16
lds r16, (1<<ADTS2)|(1<<ADTS2)|(1<<ADATE)
sts ADCSRB, r16

So müsste doch eigentlich alles passen, oder? Mehr habe ich dem 
Datenblatt bisher nicht entnehmen können.

Vielen Dank schon mal für jede Anregung!!

gruss

p.s. der zähler läuft richtig und aktiviert.

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

Bewertung
0 lesenswert
nicht lesenswert
> lds r16, (1<<REFS0)
Das ist doch Murks. lds lädt ein Byte von der angegebenen Adresse aus 
dem SRAM in das Zielregister. (1 << REFS0) wird da als Adresse 
interpretiert.

Du willst doch einen konstanten Wert in r16 laden. Und das geht mit ldi 
und nicht mit lds...

Das selbe gilt für die beiden anderen lds.

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

Bewertung
0 lesenswert
nicht lesenswert
> lds r16, (1<<ADTS2)|(1<<ADTS2)|(1<<ADATE)
Und das macht auch nicht viel Sinn. Das ADATE steht im ADCSRA (wo es ja 
auch weiter oben korrekt gesetzt ist) und nicht im ADCSRB. Und das ADTS2 
zweimal setzen macht es auch nicht besser.

Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen Dank für deine Antwort!
hatte das lds noch im kopf von gestern, da man beim mega88 ab einem 
gewissen bereich ja nicht mehr mit in/out usw. arbeiten kann.
jetzt ist es mir wie schuppen von den augen gefallen...
vielen dank nochmal!

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.