mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Analog Comparator Atmega16 GCC


Autor: Kai Kiste (lekai)
Datum:

Bewertung
0 lesenswert
nicht 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 ).

#include <avr/io.h>
#include <avr/interrupt.h>

// Analog Comparator Interrupt
#define INT_ANA_COMP_vect        _VECTOR(17)

void master_init (void) {
/*----------PORT Initialisierung----------*/
// LEDs
  DDRC = 0xFF;        // setzte PORTC als Ausgang, LED1-8
  PORTC = 0x00;        // LEDs ein

/*----------Analog Comparator---------*/
  ACSR &= ~(1<<ACD);      //AnalogComparator ein
  ACSR |= (1<<ACBG)|(1<<ACIE)|(1<<ACIS1)|(1<<ACIS0);  //BandgapRef ein, Interrupt enable ein, Interrup on rising edge
  ADCSRA &= ~((1<<ADEN)|(1<<MUX1)|(1<<MUX0));      //ADC aus, ADMUX auf Kanal AD4
  ADCSRA |= (1<<MUX2);
  SFIOR |= (1<<ACME);     //Multiplexer für Analogkomparator ein
  DDRA &= ~(1<<PA4); 
}

ISR( INT_ANA_COMP_vect )    //ANALOG COMPARTOR Interrup Routine
{
PORTC = 0x0f;      // LED an
}


int main( void )
{
master_init();
....
}

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erst mal die naheliegenden Dinge, ehe die Konfigurationsbits 
abgeklappert werden:

sei()   hast du?
JTAGEN ist abgeschaltet?

Autor: Kai Kiste (lekai)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier
// Analog Comparator Interrupt
#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
ISR( ANA_COMP_vect )
{
}

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.

Autor: Kai Kiste (lekai)
Datum:

Bewertung
0 lesenswert
nicht 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
ISR ( ANA_COMP_vect )
{
...
}

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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

ANA_COMP -> ADC Conversion Complete

MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kai Kiste (lekai)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kai Kiste (lekai)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Spess,

ANA_Comp -> Analog Comparator
ADC -> ADC Conversation Complete

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

Gruß Kai

Autor: Kai Kiste (lekai)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
blödsinn $020(Hex) -> 32(Dez)

Autor: Kai Kiste (lekai)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr/io.h>
#include <avr/interrupt.h>

// Analog Comparator Interrupt

void master_init (void) {
sei();

/*----------PORT Initialisierung----------*/
// LEDs
  DDRC = 0xFF;        // setzte PORTC als Ausgang, LED1-8
  PORTC = 0x00;        // LEDs ein

/*----------Analog Comparator---------*/
  ACSR &= ~(1<<ACD);      //AnalogComparator ein
  ACSR |= (1<<ACIE);  //Interrupt enable ein
  ADCSRA &= ~((1<<ADEN)|(1<<MUX1)|(1<<MUX0));      //ADC aus, ADMUX auf Kanal AD4
  ADCSRA |= (1<<MUX2);
  SFIOR |= (1<<ACME);     //Multiplexer für Analogkomparator ein
  DDRA &= ~(1<<PA4);      
}

ISR( ANA_COMP_vect )    //ANALOG COMPARTOR Interrup Routine
{
PORTC = 0x01;      // LED an
}


int main( void )
{
master_init();
....
}

gibt es da noch mehr zubeachten??

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.