ADC an ATtiny25

Gast #1208779
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.