Interrupts + m168 + Vektor Namen

Gast #1156270
Lesenswert?

Hallo Zusammen!

Ich will ein Interrupt in einem m168 programmieren.
Dazu steht folgendes in meiner main() funktion:
1
DDRD  |=  ( 1<<6 );
2
PORTD |=  ( 1<<6 );
3

4
TCCR2A = ( 1<<WGM21  );
5
TCCR2B = ( 1<<CS22   );
6
TIMSK2 = ( 1<<OCIE2A );
7

8
OCR2A = 5;

Und folgendes vor der main() funktion:
1
ISR(TIMER2_COMPA_vect) //TIMER2 COMPA
2
{
3
     PORTD &= ~( 1<<6 );
4
}

Es soll ein Timer2 im CTC Modus verwendet werden.
Zuerst sollte PIND6 High sein und sobald das erste mal der Interrupt 
ausgeführt wird sollte es Low sein.
Es ist aber die ganze Zeit High.
Ist übrigens nur ein Test-Aufbau.

Wo finde ich die Namen der Interrupt Vektoren?

Im Datenblatt steht zum Beispiel
1
8 | 0x007 | TIMER2 COMPA | Timer/Counter2 Compare Match A

Mein Code funktioniert weder mit
ISR(_VECTOR(8))
noch mit
ISR(TIMER2_COMPA_vect)

Gruß,
Kain
Gast #1156292
Lesenswert?

Und wie finde ich die Vektor Namen raus?
Aus dem "TIMER2 COMPA" im Datenblatt habe ich mir mal 
"TIMER2_COMPA_vect" gedichtet und es funktioniert ja nun.
Ist das Zufall oder Prinzip?

Und was ist dann damit?
1
18 | 0x0022 | SPI, STC | SPI Serial Transfer Complete

Ein Komma wird wohl eher nicht in der Vektor Bezeichnung vorkommen?
Persönliche Seite #1156296
Lesenswert?

Ich schaue immer in der betreffenden Includedatei nach. Beim Atmega168 
wäre das die iom168.h und die darin eingebundene iomx8.h

Dort findet sich dann ein Abschnitt in der Form
1
/* Timer/Counter2 Compare Match A */
2
#define TIMER2_COMPA_vect    _VECTOR(7)
3
#define SIG_OUTPUT_COMPARE2A    _VECTOR(7)

Wenn Vektor 7 dein Interruptvektor ist (Datenblatt), dann ist der Text 
hinter dem define dein symbolischer Name: (TIMER2_COMPA_vect

> Und was ist dann damit?
> 18 | 0x0022 | SPI, STC | SPI Serial Transfer Complete

Dazu findet man in iomx8.h (WinAVR 20071221)
1
/* SPI Serial Transfer Complete */
2
#define SPI_STC_vect      _VECTOR(17)
3
#define SIG_SPI        _VECTOR(17)

D.h. die Vektornummer 18 kann ich im Moment nicht nachvollziehen. Aus 
der 0x0022 würde ich auf 17 tippen, so wie im Includefile.
#1156300
Lesenswert?

@ Vul Kain (Gast)

>Aus dem "TIMER2 COMPA" im Datenblatt habe ich mir mal
>"TIMER2_COMPA_vect" gedichtet und es funktioniert ja nun.
>Ist das Zufall oder Prinzip?

Prinzip, da haben die Jungs vom WINAVR schon mitgedacht.
Wenn du es genau wissen willst, such im WINAVR Verzeichnis die Include 
Files, dort steht alles drin.

MFG
Falk
Gast #1156305
Lesenswert?

Das stand auch im Tutorial. Nachdem ich in der iom168.h selbst nix 
gefunden hatte, kam ich aber nicht auf die idee in den dortigen includes 
auch weiter zu suchen ;-)

Danke für eure Hilfe!
Ich glaube nun sind alle meine Fragen dazu geklärt.
Persönliche Seite #1156333
Lesenswert?

Nachtrag zu der "18"

In meinem Datenblatt vom Atmega168 (Rev. 2545M-AVR-09/07) ist in Table 
11-1 die Vektor No., die Program Address, Source und Interrupt 
Definition angegeben.

Die Vektor No. ist wie du (Vul Kain) schreibst (18 für SPI Serial 
Transfer Complete).

ABER die Program Address ist anders: nur halb so gross wie dein Wert 
(0x011 hex. = 17 dez.). Es scheint so, dass das Makro _VECTOR() diese 
(kleinere) Program Address benutzt, um die ISR-Adressen zu platzieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren