Forum: Mikrocontroller und Digitale Elektronik Analog Comparator Atmega16 GCC


von Kai K. (lekai)


Lesenswert?

Hallo,

ich habe ein Problem mit dem Analog Comparator meines Atmega 16.
Ich möchte den Analogcomparator mit der internen Bandgap Referenz am 
Positven Eingang verwenden, und den Negativen Eingang mit dem ADC MUX 
auf Pin PA4 legen. Der Analog Komparator löst eine Interrupt und die ISR 
soll sich dann bemerkbar machen ( LED an ).
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
// Analog Comparator Interrupt
5
#define INT_ANA_COMP_vect        _VECTOR(17)
6
7
void master_init (void) {
8
/*----------PORT Initialisierung----------*/
9
// LEDs
10
  DDRC = 0xFF;        // setzte PORTC als Ausgang, LED1-8
11
  PORTC = 0x00;        // LEDs ein
12
13
/*----------Analog Comparator---------*/
14
  ACSR &= ~(1<<ACD);      //AnalogComparator ein
15
  ACSR |= (1<<ACBG)|(1<<ACIE)|(1<<ACIS1)|(1<<ACIS0);  //BandgapRef ein, Interrupt enable ein, Interrup on rising edge
16
  ADCSRA &= ~((1<<ADEN)|(1<<MUX1)|(1<<MUX0));      //ADC aus, ADMUX auf Kanal AD4
17
  ADCSRA |= (1<<MUX2);
18
  SFIOR |= (1<<ACME);     //Multiplexer für Analogkomparator ein
19
  DDRA &= ~(1<<PA4); 
20
}
21
22
ISR( INT_ANA_COMP_vect )    //ANALOG COMPARTOR Interrup Routine
23
{
24
PORTC = 0x0f;      // LED an
25
}
26
27
28
int main( void )
29
{
30
master_init();
31
....
32
}

Es löst kein Interrupt aus. Kann mir da jemand auf die Sprünge helfen?
vielen Dank Gruß Kai

von Karl H. (kbuchegg)


Lesenswert?

Erst mal die naheliegenden Dinge, ehe die Konfigurationsbits 
abgeklappert werden:

sei()   hast du?
JTAGEN ist abgeschaltet?

von Kai K. (lekai)


Lesenswert?

ja sei(); hab ich, taucht in dem Code oben nicht auf, hab da nur 
einzelne Teile rauskopiert. sorry.
JTATGEN Fuse ist auch nicht gesetzt.

Ausser der ISR oben, verwende ich noch einen Timer Interrupt und den 
INT0, könnte da ein Problem liegen. Der Code oben sollte doch soweit 
richtig sein, oder??

von Karl H. (kbuchegg)


Lesenswert?

Das hier
1
// Analog Comparator Interrupt
2
#define INT_ANA_COMP_vect        _VECTOR(17)
macht mir ein wenig Sorgen.

Generell ist das keine gute Idee sich die Vektoren selbst zu definieren. 
Ich hab zwar nur das Datenblatt zum Mega16 hier, aber der sollte 
eigentlich identisch zum 32 sein.
Da ist Vektor 17 der TWI Interrupt.
Der Comperator Complete Interrupt ist 16 und heisst
1
ISR( ANA_COMP_vect )
2
{
3
}

Die Kunfigurationsbits hab ich jetzt nicht weiter im Detail überprüft. 
ADC Enable muss aus sein und ACME im SFIOR auf 1. Beides hast du.

von Kai K. (lekai)


Lesenswert?

Im Atmega16 Datenblatt steht:

Vector No.     Prgramm Adress     Source
17             $020               ANA_COMP

Also müsste der Interrup Vector ja stimmen, nach denk Regel spiele ich 
gerne macht es ja meistens einfacher. Habe das nur definiert, weil ich 
in der interrup.h nichts finden konnte.

nach den Regel wäre doch dann wie du geschrieben hast ein
1
ISR ( ANA_COMP_vect )
2
{
3
...
4
}

richtig? Wenn ich das #define weglasse. Aber meine Definition dürfte ja 
nicht gestört haben, da ja der _vector17 richtig sein sollte. Kann es 
leider gerade nicht ausprobieren.

von spess53 (Gast)


Lesenswert?

Hi

ANA_COMP -> ADC Conversion Complete

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Karl Kunze schrieb:
> Im Atmega16 Datenblatt steht:
>
> Vector No.     Prgramm Adress     Source
> 17             $020               ANA_COMP
>
> Also müsste der Interrup Vector ja stimmen,

Wo wird angefangen zu zählen? Bei 0 oder bei 1?

> gerne macht es ja meistens einfacher. Habe das nur definiert, weil ich
> in der interrup.h nichts finden konnte.

In interrupt.h stehen die auch nicht drinnen.

Prozessorspezische Dinge sind immer in den ioXXXX.h enthalten. Wobei 
XXXX ein kürzel für den Prozessor ist. Für den M16 heisst die Datei 
iom16.h

Ich hab ihn auch erst gefunden, als ich in iom16.h nach der 17 gesucht 
habe. Nur leider ist 17 der TWI Vektor. Aber der unmittelbar 
davorstehende Eintrag ist der Richtige :-)


> richtig? Wenn ich das #define weglasse. Aber meine Definition dürfte ja
> nicht gestört haben, da ja der _vector17 richtig sein sollte.

Nö, ist er nicht.
16 wäre richtig gewesen.

Aber bei solchen Sachen gilt: Wenn du den Vektor nicht findest, dann 
suchst du entweder im falschen File oder du benutzt den falschen 
Suchbegriff. Derartige Dinge sind 100% im entsprechenden 
Konfigurations-Header-File.
Also niemals selber definieren, sondern solange weitersuchen bist du ihn 
hast!


Edit: Wie bin ich weiter oben eigentlich auf den M32 gekommen? Da sind 
mir wohl gedanklich 2 Threads durcheinander gekommen. Sorry for that.

von Kai K. (lekai)


Lesenswert?

Alles klar.
Da bin ich auf die Nummerierung im Datenblatt reingefallen da steht ja 
auch deutlich $020 also 16.
Die iom16.h werde ich mir dann auch mal anschauen.
Vielen dank für die Tips und Erklärungen.

von Kai K. (lekai)


Lesenswert?

Hi Spess,

ANA_Comp -> Analog Comparator
ADC -> ADC Conversation Complete

Atmega16 Datenblatt (Table 11-1.  Reset and Interrupt Vectors)

Gruß Kai

von Kai K. (lekai)


Lesenswert?

blödsinn $020(Hex) -> 32(Dez)

von Kai K. (lekai)


Lesenswert?

Neues Problem, der Interrupt löst jetzt mit dem richtigen Vector aus. 
Allerdings nur wenn ich AIN0 und AIN1 vergleiche, wenn ich den 
Multiplexer verwenden will, passiert nichts.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
// Analog Comparator Interrupt
5
6
void master_init (void) {
7
sei();
8
9
/*----------PORT Initialisierung----------*/
10
// LEDs
11
  DDRC = 0xFF;        // setzte PORTC als Ausgang, LED1-8
12
  PORTC = 0x00;        // LEDs ein
13
14
/*----------Analog Comparator---------*/
15
  ACSR &= ~(1<<ACD);      //AnalogComparator ein
16
  ACSR |= (1<<ACIE);  //Interrupt enable ein
17
  ADCSRA &= ~((1<<ADEN)|(1<<MUX1)|(1<<MUX0));      //ADC aus, ADMUX auf Kanal AD4
18
  ADCSRA |= (1<<MUX2);
19
  SFIOR |= (1<<ACME);     //Multiplexer für Analogkomparator ein
20
  DDRA &= ~(1<<PA4);      
21
}
22
23
ISR( ANA_COMP_vect )    //ANALOG COMPARTOR Interrup Routine
24
{
25
PORTC = 0x01;      // LED an
26
}
27
28
29
int main( void )
30
{
31
master_init();
32
....
33
}

gibt es da noch mehr zubeachten??

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.