Forum: Mikrocontroller und Digitale Elektronik ATMega328P ADC Fehler im Datenblatt?


von AndreasG (Gast)


Lesenswert?

Guten Tag,

ich habe folgenden seltsamen Effekt bemerkt:
Programm: Timer 0 triggert bei Compare den ADC, dieser löst Interrupt 
aus, ISR liest ADC und löscht Interrupt-Flag von Timer0. So weit, so 
gut, aber wenn ich dann die CPU in den Idle-Mode bringe, gibt es ein 
Dauertriggern des ADC.
Im Datenblatt (Atmel-42735B-ATmega328/P_Datasheet_Complete-11/2016) 
steht auf Seite 312 im Abschnitt 28.6.1 (ADC Noise Canceler) 
ausdrücklich, daß der ADC im Single Conversion mode sein muß, damit der 
Idle-mode ein ADC-trigger auslöst. Hier ist der ADC jedoch ausdrücklich 
nicht in diesem Modus, trotzdem triggert er. Ist das nun ein Fehler im 
Datenblatt, oder interpretiere ich dieses nur falsch?

von Stefan F. (Gast)


Lesenswert?

> ISR liest ADC und löscht Interrupt-Flag von Timer0

Warum machst das? Der wird doch schon von der ISR des Timer gelöscht.

> daß der ADC im Single Conversion mode sein muß
> Hier ist der ADC jedoch ausdrücklich nicht in diesem Modus

Das bezweifle ich. Du löst die Messung doch durch Timer Intervalle aus. 
Das erfordert eben diesen Single Conversion mode.

Wäre dein ADC im free running Mode, dann würde der Timer so keinen Sinn 
ergeben. Zeige doch mal den Quelltext.

Beitrag #5039551 wurde von einem Moderator gelöscht.
von AndreasG (Gast)


Lesenswert?

Stefan U. schrieb:
>> ISR liest ADC und löscht Interrupt-Flag von Timer0
>
> Warum machst das? Der wird doch schon von der ISR des Timer gelöscht.

Nur wenn der Timer Interrupts auslöst. Er triggert aber bei Compare nur 
den ADC. Deshalb muß ich das Flag "von Hand" löschen.

>> daß der ADC im Single Conversion mode sein muß
>> Hier ist der ADC jedoch ausdrücklich nicht in diesem Modus
>
> Das bezweifle ich. Du löst die Messung doch durch Timer Intervalle aus.
> Das erfordert eben diesen Single Conversion mode.

Das Bit "ADATE" im Register ADCSRA ist gesetzt, damit der Wandler durch 
einen externen Event gestartet wird. In ADCSRB sind die Bits 0 und 1 
gesetzt, somit ist Timer0CompareA die Triggerquelle

> Wäre dein ADC im free running Mode, dann würde der Timer so keinen Sinn
> ergeben. Zeige doch mal den Quelltext.

Für den free running-mode müßte ADCSRB auf 0 stehen. Quelltext kann ich 
erst morgen posten, bin jetzt nicht mehr am Programmierplatz.

Beitrag #5039703 wurde von einem Moderator gelöscht.
Beitrag #5039722 wurde von einem Moderator gelöscht.
von batman (Gast)


Lesenswert?

AndreasG schrieb:
> steht auf Seite 312 im Abschnitt 28.6.1 (ADC Noise Canceler)
> ausdrücklich, daß der ADC im Single Conversion mode sein muß, damit der
> Idle-mode ein ADC-trigger auslöst.

Da steht bei mir was anderes. Ich würde für den Sleep Mode auch eher im 
Kapitel Sleep Modes (10.3. Idle Mode) gucken. Da steht klar:
"If the ADC is enabled, a conversion starts automatically when this mode 
is entered."

von Oberlajtnant (Gast)


Lesenswert?

> AndreasG schrieb:
>> steht auf Seite 312 im Abschnitt 28.6.1 (ADC Noise Canceler)....

batman schrieb:
> Da steht bei mir was anderes. Ich würde für den Sleep Mode auch eher im
> Kapitel Sleep Modes (10.3. Idle Mode) gucken....

Ergo->Fehler im Datenblatt.

Die Frage ist jetzt nur: Wessen Datenblatt ist neuer? Das neuere wird 
dann hoffentlich das richtigere sein.

von c-hater (Gast)


Lesenswert?

AndreasG schrieb:
> Guten Tag,
>
> ich habe folgenden seltsamen Effekt bemerkt:
> Programm: Timer 0 triggert bei Compare den ADC, dieser löst Interrupt
> aus, ISR liest ADC und löscht Interrupt-Flag von Timer0. So weit, so
> gut, aber wenn ich dann die CPU in den Idle-Mode bringe, gibt es ein
> Dauertriggern des ADC.

Was verstehst du unter "Dauertriggern"?

> Im Datenblatt (Atmel-42735B-ATmega328/P_Datasheet_Complete-11/2016)
> steht auf Seite 312 im Abschnitt 28.6.1 (ADC Noise Canceler)
> ausdrücklich, daß der ADC im Single Conversion mode sein muß, damit der
> Idle-mode ein ADC-trigger auslöst.

Nein, das steht da ganz sicher nicht. Der idle-Mode selber löst erstmal 
natürlich sowieso rein garnix aus, insbesondere auch nicht den ADC, 
weder startet er eine Konversion noch forciert er den ADC-Interrupt.

Es ist vielmehr umgekehrt: es muss irgendein Interrupt auftreten, damit 
der idle-Mode beendete wird (das gilt für absolut jeden Schlafmodus).

> Hier ist der ADC jedoch ausdrücklich
> nicht in diesem Modus, trotzdem triggert er. Ist das nun ein Fehler im
> Datenblatt, oder interpretiere ich dieses nur falsch?

Ganz, ganz sicher Letzteres, soviel ist schonmal klar...

von batman (Gast)


Lesenswert?

Da ist dir wohl ne Kleinigkeit entgangen, C-Hater. Einfach mal die 
Beschreibung des Sleep Modes durchlesen, egal welche DB-Fassung (ich 
habe 11/2015). Fehler gibts maximal im Verständnis.

Beitrag #5039845 wurde von einem Moderator gelöscht.
von S. Landolt (Gast)


Lesenswert?

Das steht doch eindeutig in seinem Beitrag von 19:52.

von AndreasG (Gast)


Lesenswert?

batman schrieb:
> AndreasG schrieb:
>> steht auf Seite 312 im Abschnitt 28.6.1 (ADC Noise Canceler)
>> ausdrücklich, daß der ADC im Single Conversion mode sein muß, damit der
>> Idle-mode ein ADC-trigger auslöst.
>
> Da steht bei mir was anderes. Ich würde für den Sleep Mode auch eher im
> Kapitel Sleep Modes (10.3. Idle Mode) gucken. Da steht klar:
> "If the ADC is enabled, a conversion starts automatically when this mode
> is entered."

Welche Version des Datenblattes? Bei meiner ist das nicht drin:

14.4.
Idle Mode
When the SM[2:0] bits are written to '000', the SLEEP instruction makes 
the MCU enter Idle mode, stopping the CPU but allowing the SPI, USART, 
Analog Comparator, 2-wire Serial Interface, Timer/ Counters, Watchdog, 
and the interrupt system to continue operating. This sleep mode 
basically halts
clk CPU and clk FLASH , while allowing the other clocks to run.
Idle mode enables the MCU to wake up from external triggered interrupts 
as well as internal ones like the Timer Overflow and USART Transmit 
Complete interrupts. If wake-up from the Analog Comparator interrupt is 
not required, the Analog Comparator can be powered down by setting the 
ACD bit in the Analog Comparator Control and Status Register – ACSR. 
This will reduce power consumption in Idle mode.

Da steht nichts vom ADC. Dafür gibt es den ADC Noise Reduction Mode in 
Kapitel 14.5. Die Datenblatt-Version ist wie gesagt von 11.2016, ein 
neueres habe ich nicht gefunden. Anscheinend ist hier wohl die ältere 
Version die korrekte, das erklärt jedenfalls das Verhalten.

Schade eigentlich, wäre eine schöne Sache gewesen. So muß ich eine ISR 
für Timer0Compare einbauen, die dann den ADC startet, der somit dann 
also 25 statt 13 Takte zum wandeln braucht - was solls, wirds halt 
langsamer.

Bitte sag noch, aus welcher Version Dein Auszug stammt, das werde ich 
mir dann herunterladen. Vielen Dank.

von S. Landolt (Gast)


Lesenswert?

> Bei meiner ist das nicht drin
Das ist wohl diese vermurkste Version, in der mehr Wert auf die Farbe 
als auf den Inhalt gelegt wurde. Die von 10/2014 für ATmega48A..328P ist 
brauchbarer.

von batman (Gast)


Lesenswert?

Ja, tatsächlich ist dieses Sleep Modes Feature in der neuen Fassung im 
Kapitel Sleep Modes weggelassen und dadurch schlechter zu 
finden/verstehen. Ich habe "Atmel-8271J-AVR- ATmega-Datasheet_11/2015", 
da stehts noch drin.

In der neuen Fassung steht aber auch nicht, daß der Idle Mode 
AUSSCHLIESSLICH im Single Conversion anstößt. Aber das ist schon 
wirklich blöd gemacht.

von AndreasG (Gast)


Lesenswert?

batman schrieb:
> Ich habe "Atmel-8271J-AVR- ATmega-Datasheet_11/2015",
> da stehts noch drin.

Vielen Dank, habs mir heruntergeladen.

Schönen Abend noch.

von AndreasG (Gast)


Lesenswert?

batman schrieb:
> In der neuen Fassung steht aber auch nicht, daß der Idle Mode
> AUSSCHLIESSLICH im Single Conversion anstößt. Aber das ist schon
> wirklich blöd gemacht.

Ich hatte den Ausdruck "must be" so verstanden. Das ist wirklich sehr 
blöd gemacht.

"Single Conversion mode must be selected and the ADC conversion complete 
interrupt must be enabled." Das ist schon mehr als nur blöd gemacht.

Allen Mitdiskutierern vielen Dank für alle konstruktiven Beiträge.

Beitrag #5040000 wurde von einem Moderator gelöscht.
von AndreasG (Gast)


Angehängte Dateien:

Lesenswert?

Wie versprochen, hier nochmal mein Programm. Man möge mir den 
Programmierstil verzeihen, C ist nicht meine bevorzugte Sprache.

Noch einmal danke an alle.

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.