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.
Beitrag #5039551 wurde von einem Moderator gelöscht.
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.
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.
Beitrag #5039845 wurde von einem Moderator gelöscht.
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.
Beitrag #5040000 wurde von einem Moderator gelöscht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.