Forum: Mikrocontroller und Digitale Elektronik newbe frage zu interrupts


von Bill (Gast)


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?

von Hannes Lux (Gast)


Lesenswert?

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

...

von Karl H. (kbuchegg)


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

von Michael U. (amiga)


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

von Bill (Gast)


Lesenswert?

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

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.