Forum: Mikrocontroller und Digitale Elektronik ADC Noise reduction bei Tiny25


von Werner (Gast)


Lesenswert?

ich möchte im noise reduction mode wandeln,
er wacht aber nicht mehr auf, kommt nie in den ADC Interrupt,
was fehlt denn da?
Den einzigen Interrupt den ich sonst verwende ist der Timer, den möchte 
ich währenddessen deaktivieren

// Leer IRQ fuer ADC
ISR (ADC_vect)
{
  PORTB &= ~_BV(PLED);
}


// ADC starten, warten und Wert holen
uint16_t GetADC(uint8_t channel)
{
    ADCSRA = (1<ADIE) | (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | 
(0<<ADPS0);
    ADMUX = channel | (1<<REFS1) | (0<<REFS0); // (1,1V)
    TIMSK &= ~_BV(TOIE0);
    sei();
    set_sleep_mode(SLEEP_MODE_ADC);
    sleep_mode();
    cli();
    TIMSK = _BV(TOIE0);  // Timer/Counter0 Overflow Interrupt Enable
    return ADCW;
}

von Werner (Gast)


Lesenswert?

keiner einen Tipp?

wenn ich's ohne Interrupt mache gehts:
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
ADMUX = (1<<REFS1) | (0<<REFS0); // interne Referenzspannung (1,1V)

ADCSRA |= (1<<ADSC);
while( ADCSRA & (1<<ADSC) )   // auf Abschluss der Konvertierung warten
    ;

ohne Schlafen, aber mit Interrupt, da kommt er auch nie in den 
Interrupt:
ADCSRA = (1<ADIE) | (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
ADMUX = (1<<REFS1) | (0<<REFS0); // interne Referenzspannung (1,1V)
sei();
ADCSRA |= (1<<ADSC);
...


ISR (ADC_vect)
{
  PORTB &= ~_BV(PLED);   // zu Kontrolle
  adw = ADCW;
}

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.