www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik newbe frage zu interrupts


Autor: Bill (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich würde gerne mal verstehen was da passiert :)

im datenblatt zum mega644 aus der int-vektor tabelle:
Vector No: 23
Addr: $002C
Source: USART0_TX
Def: USART0 Tx Complete


.. im datenblatt steht also welcher int (hier nummer 23) an welche 
adresse springt (hier 2C)??

iomxx4.h:
/* USART0, Tx Complete */
#define USART0_TX_vect      _VECTOR(22)
#define SIG_USART_TRANS      _VECTOR(22)

für jeden interrupt gibt es ein define
(alle zahlen sind 1 kleiner als im datenblatt, auf reset (vektor = 1) 
kann man nicht reagieren)


sfr_defs.h:
#define _VECTOR(N) _vector ## N

was macht dieses define, was soll das "## N" ??
für _vector hab ich kein define gefunden, was tut das?


im eigenen code:

ISR(SIG_USART_TRANS){ ... }


der code würde jetzt an addr $002C gesetzt und wenn der int feuert wird 
automatisch dahin gesprungen?

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieh das mal aus ASM-Sicht, dann ist das verständlicher. Der AVR kann 
kein C.

...

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

Bewertung
0 lesenswert
nicht lesenswert
Bill wrote:
> für jeden interrupt gibt es ein define
> (alle zahlen sind 1 kleiner als im datenblatt, auf reset (vektor = 1)
> kann man nicht reagieren)

Wahrscheinlicher ist, dass eine der beiden Zählungen bei 0 beginnt, 
während die andere bei 1 beginnt. Ich habs jetzt aber nicht 
kontrolliert, ob das so ist und wer bei 1 und wer bei 0 anfängt.

> #define _VECTOR(N) _vector ## N
>
> was macht dieses define, was soll das "## N" ??

Das ist die Präprozessor-Anweisung zwei Tokens miteinander zu verketten. 
Aus "__vector_" und "22" wird so "__vector_22"

> für _vector hab ich kein define gefunden, was tut das?

Es wird wohl dafür sorgen, dass die Startdresse der Funktion in die 
Vektortabelle eingetragen wird.

> im eigenen code:
>
> ISR(SIG_USART_TRANS){ ... }
>
>
> der code würde jetzt an addr $002C gesetzt und wenn der int feuert wird
> automatisch dahin gesprungen?

Fast.
Der Code kommt nicht an $002C
Am Anfang des Speichers steht die Interrupt Vektor Tabelle. Die kannst 
du dir wie eine Art INhaltsverzeichnis vorstellen. In diesem 
Inhaltsverzeichnis wird eingetragen, wo deine Funktion wirklich im 
Speicher platziert ist.
Der µC kennt nur diese Vektor Tabelle. Tritt ein Interrupt auf, dann 
holt er sich aus dieser Tabelle die Startadresse der Funktion und sprint 
sie an. Der ganze ISR, _VECTOR und sonstige Klimbim dient nur dazu, den 
Compiler dazu zubringen, die Startdresse der Funktion an der richtigen 
Stelle einzutragen (und natürlich den Funktionsreturn anders zu 
gestalten).

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Karl heinz Buchegger wrote:

> Der Code kommt nicht an $002C
> Am Anfang des Speichers steht die Interrupt Vektor Tabelle. Die kannst
> du dir wie eine Art INhaltsverzeichnis vorstellen. In diesem
> Inhaltsverzeichnis wird eingetragen, wo deine Funktion wirklich im
> Speicher platziert ist.
> Der µC kennt nur diese Vektor Tabelle. Tritt ein Interrupt auf, dann
> holt er sich aus dieser Tabelle die Startadresse der Funktion und sprint
> sie an. Der ganze ISR, _VECTOR und sonstige Klimbim dient nur dazu, den
> Compiler dazu zubringen, die Startdresse der Funktion an der richtigen
> Stelle einzutragen (und natürlich den Funktionsreturn anders zu
> gestalten).

Als kleiner Hinweis wegen der Mehrdeutigkeit: beim AVR wird mit der 
Abarbeitung ab Vektor-Adresse fortgesetzt.
Dort steht üblicherweise ein Sprungbefehl, weil innerhalb der Tabelle 
nicht mehr Platz pro Vektor reserviert ist.

Die "echten" Vektorlisten kenne ich noch vom 6510. ;)

Gruß aus Berlin
Michael

Autor: Bill (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke sehr, hab das jetzt zu meiner vollsten zufriedenheit geblickt.
wenn mit langweilig ist schaue ich mir mal den asm code an... :)

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.