Forum: Mikrocontroller und Digitale Elektronik ATtiny84A ADC funktioniert nicht


von Hans F. (dani1632)


Lesenswert?

Hallo!
Ich verwenden den ATtiny84A und will den ADC benutzen:
http://www.atmel.com/Images/doc8183.pdf

Mein CODE:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
5
void init();
6
volatile uint16_t t1var = 0;
7
8
9
int main(void)
10
{
11
    init();
12
    while(1)
13
    {
14
15
    }
16
  return 0;
17
}
18
void init()
19
{
20
  PRR &= ~(1 << PRADC);  //disable Power Reduction for ADC
21
  ADMUX = (1 << REFS0) | (1 << MUX1);  //externe Referenz und ADC Channel 2 (PA2) aktivieren
22
  _delay_ms(1);
23
  ADCSRA = (1 << ADEN) | (1 << ADIE) | (1 << ADPS1) | (1 << ADPS0); // ADC aktivieren, AD INterrupt aktivieren und prescaler 8 -> 125 kHz
24
  _delay_ms(1);
25
  ADCSRA = (1 << ADSC);          
26
27
  sei();
28
}
29
30
ISR(ADC_vect)
31
{
32
         DDRA |= (1 << PA7);
33
  PORTA |= (1 << PA7);
34
}

Ich will nach fertiger Wandlung in der ISR ein Port auf High setzen, um 
zu sehen, dass der ADC mit interrupt funktioniert. An dem port hängt 
eine LED zur Anzeige, wenn ich im main die beiden zeilen der ISR 
aufrufe, leuchtet sie. Anscheinend wird jedoch die ISR nie erreicht, 
WARUM???

Vielen Dank!

von Felix P. (fixxl)


Lesenswert?

Der Grund ist ganz simpel:
1
ADCSRA = (1 << ADEN) | (1 << ADIE) | (1 << ADPS1) | (1 << ADPS0);
2
ADCSRA = (1 << ADSC);
Was steht nach der zweiten Anweisung in ADCSRA? Setz doch vor das zweite 
= mal einen | und probiere es erneut.

von Stefan E. (sternst)


Lesenswert?

Daniel F. schrieb:
> WARUM???

Weil du hier
1
  ADCSRA = (1 << ADSC);
den ADC-Interrupt deaktivierst (sogar den ganzen ADC deaktivierst).

von amateur (Gast)


Lesenswert?

Die Atmels sind nicht sonderlich vergesslich. Aus diesem Grunde ist es 
auch unnötig bei jeder Unterbrechung den Befehl:
DDRA |= (1 << PA7);
auszuführen. Einmal während der Initialisierung reicht wohl aus.

Der Befehl:
PORTA |= (1 << PA7);
setzt Dir jedes Mal den Pin A7, wobei es keinen Unterschied gibt, ob 
dies zum hundertsten oder hundertersten Mal geschieht. Auch beim 
hundertzweiten Mal tut sich von außen gesehen nicht neues ;-)

von Hans F. (dani1632)


Lesenswert?

:) vielen vielen Dank, was für ein blöder fehler...

@amateur: ist mir klar, sind wirklich nur testzwecke...

DANKE

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.