Forum: Mikrocontroller und Digitale Elektronik Interrupts + m168 + Vektor Namen


von Vul Kain (Gast)


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

von Tim (Gast)


Lesenswert?

sei(); hast du aber verwendet?

von Vul Kain (Gast)


Lesenswert?

dachte cli() und sei() ist nur dafür da die interrupts für bestimmte 
code abschnitte zu deaktivieren?
sind interrupts ohne sei() dauerhaft deaktiviert?

von Tim (Gast)


Lesenswert?

Nach einem Reset sind die Interrupts AUS.
ein sei(); nach deinem Hardware Setup hilft.

von Vul Kain (Gast)


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?

von Stefan B. (stefan) Benutzerseite


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.

von Falk B. (falk)


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

von Vul Kain (Gast)


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.

von Stefan B. (stefan) Benutzerseite


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.

von Stefan E. (sternst)


Lesenswert?

Stefan B. wrote:
> Nachtrag zu der "18"
> ...

Die Nummerierung ist doch nur symbolisch und hat sonst weiter keine 
Bedeutung. Das Datenblatt zählt den Reset-Vector mit, die avr-libc 
nicht. Das ist alles.

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.