mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR-GCC ADC "Noise Reduction"-Konfiguration unklar mit sleep()


Autor: Björn G. (tueftler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi da.

Ich würde gerne das "noise Reduction" Feature des ATMega16 nutzen um die 
störenden PWM Signale bei einem Sample zu unterbinden.

Das Datenblatt ist in dem Punkt leider sehr undurchsichtig und 
Forenbeiträge helfen bisher auch nicht weiter.

Bisher programmiert wurde es so:
#include <avr/sleep.h>

set_sleep_mode(SLEEP_MODE_ADC);

main()
{
   sleep_mode();
}

ISR ADC im one shot mode
{
   ...
   ADC wieder anstubsen mit ADCSRA |= (1<<ADSC);
}

Muß man den ADCSRA nun direkt vor dem sleep(); Aufruf ausführen oder ist 
es in der ADC-ISR am Ende in Ordnung?
Oder muß man das ganze komplett anders machen?

Noch eine Frage dazu:
...stopping the CPU but allowing the ADC, the external...,Timer/Counter2...to continue operating

Wir nutzen derzeit Timer0 und Timer2 für die PWM.
Heißt das nun, das die Timer2 PWM beim Sleep ohnehin gar nicht 
deaktiviert würde?

Irgendwie blicke ich hier nicht durch :)

Könnte mir jemand mal von der Leitung runter helfen?

Gruß
Björn

Autor: Jörg H. (idc-dragon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich mich recht erinnere legt der ADC (im Noise-Reduction Modus) 
automagisch erst dann los, wenn die CPU schlafen geht.

Wenn kurz danach ein Interrupt reinbritzelt hat man für diese Messung 
dann wohl Pech gehabt?

Jörg

Autor: Björn G. (tueftler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann dem ADC ja nicht selber sagen das er nun im Noise-Reduction 
Modus läuft.
Das einzige das man machen muß ist den Freerun mode raus machen und das 
ganze als one shot laufen lassen (zumindest so wie ich es verstanden 
habe).
Sehr schade das das Atmel Datenblatt hier große Fragen offen lässt.

Was ich noch machen könnte ist natürlich einen Timer oder einen Zähler 
in der Main loop nutzen mit dem ich geziehlt die PWMs aus schalte, dann 
die ADC anstubse und danach die PWMs wieder aktiviere...

Hoffe es hat noch jemand Erfahrungswerte in dem Mode.

Björn

Autor: Jörg H. (idc-dragon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so, ich dachte da gäbe es ein Konfigurationsbit für diesen Modus.
Davon unabhängig, ich habe das mal so gebaut, daß ich den ADC als letzte 
Aktion in meinem Heartbeat-Interrupt starte. (Danach macht die 
Hauptschleife üblicherweise wieder einen sleep.)

Speziell wenn der ADC vorher aus war braucht er noch etliche Takte, bis 
er tatsächlich loslegt.

Zu deinen Timern, und freihändig ohne Datenblatt: die laufen im 
Idle-Mode weiter, im Deep Sleep nicht. Die neueren Prozessoren haben 
noch ein Power-Reduction-Register, mit dem man nicht benutzte Peripherie 
abschalten kann. Sehr nützliche Sache, so schalte ich die Timer bei 
Bedarf ein und nach Ablauf wieder aus.

Jörg

Autor: Ingo Stahl (ingo-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich mache das in einer ADC-Funktion mit Überwachung, ob nicht ein 
Interrupt den "sleep" gestört hat (diese setzen Flag "bIntset" in GPIO 
Register).
Hier für den ATtin44/45, muss für ATMega16 evtl. angepasst werden.

---
int getAdcval (uint8_t nAdc)
{
  ADMUX  = nAdc;            // first set input channel
  do{
    // AD-Wandlung starten - Achtung bei Noise Reduction Mode kein ADSC 
setzen!
    ADCSRA = (1<<ADIE)+(1<<ADEN)+(1<<ADPS2)+(1<<ADPS1);
    intevent &= ~(1<<bIntset);
    MCUCR  |= (1<<SE);        // das startet die AD-Wandlung
    asm volatile ("sleep");      // in Verbindung mit "sleep"
    do{                // noch aktiv wegen fremden Interrupt?
    }while(ADCSRA & (1<<ADSC));
  }while(intevent & (1<<bIntset));  // anderer interrupt - > try again
  return ADC;
}

Gruß Ingo

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.