ADC an ATtiny25

Gast #1208779
Lesenswert?

Ich versuche ein stark verauschtes, langsames (ewig high - 0.5sek bis 
einige sek Signal low - wieder ewig high) mittels ADC "auszulesen", dh 
ich muss eigentlich nur bei einem high-low Übergang gewissen Code 
ausführen.
Ursprünglich versuchte ich dies mit dem Analog Comparator - doch wegen 
dem starken Rauschen führte dies zu mehrfach auslösungen (die Flanken 
sind aufgrund von Kapazitäten leider auch nicht unendlich steil).
Ich verwende einen ATtiny25 mit dem Signal an ADC1 und folgendem code:

DDRB=0xfb;
ADMUX=0x81;
ADCSRA=0xe2;
ADCSRB=0x00;
DIDR0=0x04;     //ausschalten des Digitaleingangs von PB2/ADC1;

//// ADC-auslesen
        uint8_t adc=ADCH;
        if((adc|0x03)==0x03)       //oberer Bereich
        {
            bf0.adcLastTime=1;
        }
        else if((adc|0x03)!=0x02)  //unterer Bereich
        {
           ...
           bf0.adcLastTime=0;
        }


dies in einer Endlosschleife

da ich ja nur zwei Zustände habe sollten die 4 höchsten Bit ja genügen.

Aus irgend einem Grund funktioniert jedoch nichts (der ... code wird nie 
ausgeführt) - deshalb hab ich den Verdacht, dass der ADC gar nicht 
wirklich läuft ?!

vielen Dank bereits im Voraus
#1208847
Lesenswert?

Gewöhn dir am besten gleich an, Konstanten für Steuerregister besser als 
Kombination der einzelnen Bits darzustellen, und dabei die von der 
avr-libc vordefinierten Namen zu verwenden.

Also z.B.
1
ADCSRA  = _BV(ADEN)  | _BV(ADPS1) | _BV(ADPS0) | _BV(ADIE); // Enable, clk/8 clock,IRQ

Dann sieht man gleich, welche Optionen aktiviert sind.
Ich zumindest hab jetzt keine Lust aus dem Datenblatt rauszufriemeln, 
was nun wohl ein 0xe2 im ADCSRA bewirkt.
Gast #1208912
Lesenswert?

also - hab jetzt rausgefunden, dass die internen Referenzspannungen 
anscheinend von VCC her gerechnet sind und nicht von GND - deshalb hab 
ich diese jetzt ausgeschaltet, die neuen Register:

 ADMUX=0x01;
-> also Vcc als Ref-Spannung (REFS2=REFS1=REFS0=0)
-> ADLAR=0 richtet den gemessenen Wert so aus, dass die beiden höchsten 
Bit in ADCH an den Positionen 0 und 1 sind (so verstehe ich wenigstens 
das Datenblatt)
-> MUX3..0: 0001, also ADC1 als Input gewählt.

 ADCSRA=0xe0;
-> ADEN=1 : einschalten des ADC
-> ADSC=1 : starten des ADC
-> ADATE=1: autotrigger enabled
-> ADIE=0:  interrupt disabled
-> ADPSx=000: division factor 2

 ADCSRB=0x00;
alles 0, also free running mode!

ich hab diese sequenz nur beim initialisieren eingefügt!
ich nehme an, dass der ADC danach immer eingeschalten bleibt und die 
Werte ständig aktualisiert. ?
Oder muss ich vor jeder Messung den ADC starten?
Gast #1208965
Lesenswert?

ACH!
ich bin ei depp!

if((adc|0x03)==0x03)

anstelle von

if((adc&0x03)==0x03)

ersteres ist natürlich immer TRUE

:)

es funktioniert immer noch ganz, aber das ist ein anderes Problem!

entschuldigt meine Dummheit!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren