Forum: Mikrocontroller und Digitale Elektronik Interrupt bei fertiger AD-Wandlung auf Atmega128


von Oz z. (ozzy)


Lesenswert?

Hi,

um Code zu sparen möchte ich gerne für meine AD-Wandlungen folgendes 
machen: in einem Array stehen die Pinnummern, an denen die auszulesenden 
Werte anliegen. Nun wird mit einer for-Schleife durch das Array 
durchgegangen, und an Feld i die Pinnummer eingelesen, die AD-Wandlung 
gemacht, und dann in ein zweites Array an Nummer i geschrieben.
Nun aber meine Frage: gibt es eine intelligente Möglichgkeit, diese 
AD-Wandlung das erste mal anzustoßen? Denn ich möchte ungerne für die 
erste Wandlung den Code noch einmal einfügen...

Habt Ihr da eine schlaue Idee für mich?

Vielen Dank schon einmal im Voraus, Ozzy

von Falk B. (falk)


Lesenswert?

@  Christoph Osterloh (ozzy)

>Nun aber meine Frage: gibt es eine intelligente Möglichgkeit, diese
>AD-Wandlung das erste mal anzustoßen?

Was gibt es da anzustossen? Ausser deine Routione ist in einem 
Interrupt. Dann reicht es, den ADC zu konfigurieren und im Fre-Running 
Modus zu aktivieren.

> Denn ich möchte ungerne für die erste Wandlung den Code noch einmal einfügen...

???

MFG
Falk

von Oz z. (ozzy)


Lesenswert?

Moin,

dann hatte ich das wohl etwas falsch verstanden: ich dachte, man müsse 
die AD-Wandlung erst einmal anstossen (eben durch eine AD-Wandlung), 
nach derem Ende er dann in die Interrupt-Routine springen würde.

Dann werde ich das mal mit dem Free-Runngin-Modus probieren.

Aber noch eine Frage: wenn ich im Interupt eine AD-Wandlung anstoße, was 
passiert dann mit dem Wert? Oder geht doch so etwas:

ad_values[AdcChannel] = ADConv(ad_pin[AdcChannel]);

denn nach der ADäWandlung springt er doch in die Routine, oder?

MfG, Ozzy

von Falk B. (falk)


Lesenswert?

@ Christoph Osterloh (ozzy)

>dann hatte ich das wohl etwas falsch verstanden: ich dachte, man müsse
>die AD-Wandlung erst einmal anstossen (eben durch eine AD-Wandlung),
>nach derem Ende er dann in die Interrupt-Routine springen würde.

Genau das macht der ADC auch.

>Aber noch eine Frage: wenn ich im Interupt eine AD-Wandlung anstoße, was
>passiert dann mit dem Wert? Oder geht doch so etwas:

>ad_values[AdcChannel] = ADConv(ad_pin[AdcChannel]);

>denn nach der ADäWandlung springt er doch in die Routine, oder?

Ja. Aber pass auf dass du das mit dem ADC-MUX richtig machst, da kann 
man sich ins Knie schiessen und denkt, man hat eine Versatz von einem 
Kanal drin.

MFG
Falk

von Johannes M. (johnny-m)


Lesenswert?

Christoph Osterloh wrote:
> Moin,
>
> dann hatte ich das wohl etwas falsch verstanden: ich dachte, man müsse
> die AD-Wandlung erst einmal anstossen (eben durch eine AD-Wandlung)
Man muss nur am Anfang einmal das ADSC setzen, nachdem man den ADC 
initialisiert hat. Der Rest läuft (im Free Running Modus) von selbst. 
Allerdings ist es sinnvoll, nach dem Einschalten des ADC (ADEN setzen) 
eine Dummy-Wandlung durchzuführen und das Ergebnis wegzuschmeißen. Die 
erste Messung nach dem Einschalten ist i.d.R. für die Tonne.

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.