Forum: Mikrocontroller und Digitale Elektronik ADC AVR 8535


von Toto (Gast)


Angehängte Dateien:

Lesenswert?

Hi

Das Programm im Anhang soll vom Kanal0 des ADC einen Wert einlesen und
über die serielle Schnittstelle ausgeben.(Im Moment nur zum Testen wird
nur das Lowbyte ausgegeben)
Der Kanal soll ständig abgefragt werden also im "Freerunning Modus"
betrieben werden.
Das ganze funktionert auch, aber nur wenn ich das ADSC(ADC start
conversation) Bit im ADCSR Register jedesmal neu setze.

Es wird also das ADSC Bit bei Eintritt in die ADC Interruptroutine
gelöscht und ich muss es manuell neu setzen sonst tritt kein Interrupt
mehr auf.Das ist aber doch eigentlich nicht der Sinn des "Freerunning
Modus".

Aus dem Datenblatt werde ich auch nicht ganz schlau.Muss ich das Bit
ADSC 2 mal setzen und ist die erste Umwandlung nur eine "Dummy"
Umwandlung zum initialisieren des ADC.
Unten hab ich mal einen Auszug aus dem Datenblatt kopiert.

Wäre nett wenn sich mal einer das Programm anschaut, ob es so richtig
ist das Bit jedesmal in der Interrupt Routine neu zu setzen oder muss
ich den ADC anders Initialisieren.

Grüsse
       Toto


Quote:
In Single Conversion Mode, a logical ?1? must be written to this bit to
start each conversion.
In Free Running Mode, a logical ?1? must be written to this bit to
start the first
conversion. The first time ADSC has been written after the ADC has been
enabled or if
ADSC is written at the same time as the ADC is enabled, an extended
conversion will
precede the initiated conversion. This extended conversion performs
initialization of the
ADC.
ADSC will read as one as long as a conversion is in progress. When the
conversion is
complete, it returns to zero. When a extended conversion precedes a
real conversion,
ADSC will stay high until the real conversion completes. Writing a ?0?
to this bit has no
effect.

von Danny (Gast)


Lesenswert?

Lass den ADC ohne Interrupt laufen, genauso wie Deine serielle Ausgabe
einfach in einer Endlosschleife. Dann klappt es so lange bis Du ADEN
wieder auf Null setzt.
Habe auch den 8535 und es klappt ohne probleme.

von Toto (Gast)


Lesenswert?

Das Programm läuft ja so wie es ist.
Ich habe es warscheinlich mit ein bisschen viel Text umschrieben, aber
ich wollte eigentlich nur wissen ob es normal ist das bei dem "Free
Running" Modus das ADSC(ADC start conversation) Bit jedesmal bei
Eintritt in die Interrupt Routine zurückgesetzt wird und ich es Manuell
neu setzen muss. Oder ich irgendwo einen Denkfehler mache.

Trotzdem danke für die schnelle Antwort

mfG
    Toto

von Danny (Gast)


Lesenswert?

Hast du dich im Code geirrt?

ldi temp,0b11101000              ;ADC aktivieren free running mode
Interrupt aktiviert
out ADCSR,temp                   ;Vorteiler 64

ADC aktivieren und vorteiler 64 sind doch 0b11101110 aber das nur
nebenbei.
Dein problem ist, das Du den Freerunning Mode und Start Conversion
gleichzeitig setzt. In dem Fall wird das als Single Confersion
verstanden (siehe seite 72/73 im Datenblatt:

? Bit 6 ? ADSC: ADC Start Conversion
In Single Conversion Mode, a logical ?1? must be written to this bit to
start each conversion.
In Free Running Mode, a logical ?1? must be written to this bit to
start the first
conversion. The first time ADSC has been written after the ADC has been
enabled or if
ADSC is written at the same time as the ADC is enabled, an extended
conversion will
precede the initiated conversion. This extended conversion performs
initialization of the
ADC. ADSC will read as one as long as a conversion is in progress. When
the conversion is
complete, it returns to zero. When a extended conversion precedes a
real conversion,
ADSC will stay high until the real conversion completes. Writing a ?0?
to this bit has no
effect.) Also erst den Freerunning Mode aktivieren und danach erst den
Start ADC. Dann sollte es gehen.....

von Toto (Gast)


Angehängte Dateien:

Lesenswert?

Hi

mit dem Vorteiler hast du natürlich Recht, hatte ich runtergesetzt
damit ich im AVR Studio (4,9,0,338) einfacher Simulieren kann.

Ich hab das Programm mal dementsprechend geändert also erst der Bits
ADEN (Enable)
ADFR (Free Running)
ADIE (ADC INT Enable)
ADPS2 = 1 (Vorteiler 64)
ADPS1 = 1
ADPS0 = 1

Danach den Kanal gewählt (Kanal 0) MUX0-2 = 0
und dann mit sbi ADCSR,ADSC den ADC gestartet.
Klappt aber immer noch nicht laut AVR Studio wird ADSC jedesmal bei
eintritt in die Int Routine zurückgesetzt.Und das nicht nur bei der 1.
Wandlung sondern jedesmal.

Ist ja eigentlich auch nicht schlimm Prog läuft ja, ich möchte halt nur
einfach verstehn warum das so ist und ob ich etwas falsch Programmiert
habe.

nochmal lob an das Forum hier ist ja besser als eine Onlinehilfe

mfg
 Toto

von Toto (Gast)


Lesenswert?

Noch ein Nachtrag habe den Kommentar nicht mitgeändert ADC wird aber bei
der ersten Initialisierung noch nicht gestartet Bit6(ADSC)=0

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.