Forum: Analoge Elektronik und Schaltungstechnik Suche Hilfe beim Analog Comparator Interrupt!


von FrankyP50187 (Gast)


Lesenswert?

Hallo liebe AVR-Freunde,

ich lese hier zwar schon eine ganze Weile und habe bis jetzt auch immer 
alles gefunden, leider komme ich jetzt aber mit den schon verhandenen 
Threads nicht weiter.

Ich hoffe einer von euch kann mir die Richtung weisen :-)

Also, ich experimentiere gerade mit dem AnalogComparator meines 
Atmega32U4 rum.

Leider bekomme ich es nicht hin, dass er mir den Interrupt schmeißt.

Mein Code sieht folgendermaßen aus:
1
ISR (ANA_COMP_vect)
2
{
3
  PORTD ^= (1 << 5); //toggle LED on every call
4
}
5
6
void main()
7
{
8
   cli(); // disable interrupt 
9
   DDRD |= (1 << 5);
10
   ACSR = 0; //set everything to 0
11
   ADMUX = 0; //set everything to 0       
12
   ADCSRA &= ~(1 << ADEN); // deactivate ADC 
13
   ADCSRB |= (1 << ACME);// activate multiplexer
14
   ACSR |= (1 << ACIE); // activate analog comparator interrupt
15
   // ADIN1 is AIN+ for MUX2:0 --> 0 AIN- should be ADC0
16
   // ACIS0 and ACIS1 are 0 --> Interrupt Mode = Toggle Mode
17
   sei(); // global interrupt enable
18
19
   while(1)
20
   {
21
    //nothing here
22
   }
23
}

Der Atmega32 hat keine AIN1, daher muss immer der Multiplexer verwendet 
werden. Der AIN+ ist entweder der AIN0 oder interne Referenz, bei meiner 
Einstellung sollte der AIN0 gewählt sein.

Bin für jeden Tipp mehr als Dankbar!!

von c-hater (Gast)


Lesenswert?

FrankyP50187 schrieb:

> Bin für jeden Tipp mehr als Dankbar!!

Hmm.

>   ACSR = 0; //set everything to 0

Das ist nicht ganz korrekt.

    ACSR = (1 << ACI)

wäre korrekt.

Aber ansonsten ist das Programm ok und der kleine Fehler sollte es auch 
nicht am Funktionieren hindern, maximal wird unmittelbar nach dem sei() 
ein Interrupt geworfen, ohne daß sich am Pin was tut.

Bleibt die Hardware. Eventuell falsche Pins erwischt? Was für ein Signal 
hast du an die beiden AC-Pins angelegt? LED korrekt angeschlossen? Auch 
wieder: am richtigen Pin?

von Frank P. (frankyp50817)


Angehängte Dateien:

Lesenswert?

Hallo C-hater,
danke dass du dich meiner annimmmst :-)

An AIN0 habe ich wahlweise GND oder 3,3V bzw an ADC0 3,3V oder GND.
Ich versuche den Interrupt mit Jumperwires herbeizuführen, also GND an 
AIN0 und ADC0 und dann ADC0 umgejumpert auf ebenfalls ADC0, sollte ja 
eine Flanke sein, oder??

Die LED ist richtig angeschlossen, das sie in einer Testfunktion (also 
ohne Interrupt) fröhlich vor sich hinblinkt, als wäre nichts gewesen :-)

Liegt es vielleicht da dran, dass ich für die Flanke mit ADC0 über den 
Analogwert von AIN0 rausmuss? Also vielleicht 5V?

Liebe Grüße

von c-hater (Gast)


Lesenswert?

Frank Pinecker schrieb:

> An AIN0 habe ich wahlweise GND oder 3,3V bzw an ADC0 3,3V oder GND.
> Ich versuche den Interrupt mit Jumperwires herbeizuführen, also GND an
> AIN0 und ADC0 und dann ADC0 umgejumpert auf ebenfalls ADC0, sollte ja
> eine Flanke sein, oder??

Es können und werden in der Regel mehrere sein (Prellen). Wenn du mit so 
behelfsmäßigem Gebastel einen sicheren Nachweis haben willst, darfst du 
die LED in der ISR nur setzen. Dann weißt du zwar nicht, wie oft der 
Interrupt ausgelöst wurde, aber wenigstens, daß er überhaupt ausgelöst 
wurde.

Besser: einen der beiden Anschlüsse über einen Spannungsteiler auf 1/2 
Vcc und den anderen an einen als Ausgang programmierten Pin, z.B. den 
OC-Ausgang eines Timers. Den läßt du dann per CTC-Mode toggeln und hast 
damit saubere und eindeutige Flanken. Die LED sollte dann mit "halber" 
Helligkeit leuchten.

Übrigens: Das Foto hilft kein bissel dabei, die Wahl der korrekten Pins 
zu überprüfen. Dazu ist es einfach viel zu beschissen.

von Frank P. (frankyp50817)


Lesenswert?

Möglich, ich werde es morgen gleich mal ausprobieren.
Vielen Dank für deine Hilfe, auch wenn die Wortwahl etwas zu wünschen 
übrig lässt...

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.