www.mikrocontroller.net

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


Autor: Vul Kain (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen!

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

TCCR2A = ( 1<<WGM21  );
TCCR2B = ( 1<<CS22   );
TIMSK2 = ( 1<<OCIE2A );

OCR2A = 5;

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

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
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

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sei(); hast du aber verwendet?

Autor: Vul Kain (Gast)
Datum:

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

Autor: Tim (Gast)
Datum:

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

Autor: Vul Kain (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
18 | 0x0022 | SPI, STC | SPI Serial Transfer Complete

Ein Komma wird wohl eher nicht in der Vektor Bezeichnung vorkommen?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

/* Timer/Counter2 Compare Match A */
#define TIMER2_COMPA_vect    _VECTOR(7)
#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)

/* SPI Serial Transfer Complete */
#define SPI_STC_vect      _VECTOR(17)
#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.

Autor: Falk Brunner (falk)
Datum:

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

Autor: Vul Kain (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

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.