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?
> 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.
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.
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."
> 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.
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...
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.
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.
> 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.
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.
batman schrieb:> Ich habe "Atmel-8271J-AVR- ATmega-Datasheet_11/2015",> da stehts noch drin.
Vielen Dank, habs mir heruntergeladen.
Schönen Abend noch.
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.
Wie versprochen, hier nochmal mein Programm. Man möge mir den
Programmierstil verzeihen, C ist nicht meine bevorzugte Sprache.
Noch einmal danke an alle.