Forum: Mikrocontroller und Digitale Elektronik Interrupt, AVR, IAR-Compiler


von Michael (Gast)


Lesenswert?

Hallo,
ich hab etwas Startschwierigkeiten einen Interrupt zu deklarieren.

Ich verwende den AVR µC Tiny26 und schreibe meinen C-Code in der
IAR-Workbench (Kick-Start).

Was muss ich machen um eine Interrupt-Service-Routine für
beispielsweise den INT0 zu schreiben?

Meine Versuche:

void interrupt[INT0_vect] INT0_interrupt(void)
{
}

oder:

#pragma vektor=INT0_vect
__interrupt void INT0_vect(void)
{
}

schlugen bisher fehl. (Ich weis auch nicht wirklich was da gemacht
wird. Ist nur abgepinselt.)
Kann mir jemand bei dem Syntax helfen? Gibt es eine (oder mehrere) gute
Literatur zum Syntax des IAR Compilers?

Grüße,
Michael

von Schmidle (Gast)


Lesenswert?

Hallo,

probiere mal: #pragma vector = INT0_vect.
Also das vector mit "c" schreiben und nicht mit "k".

Gruß
Schmidle

von OldBug (Gast)


Lesenswert?

Ich kann mich nicht mehr richtig erinnern, aber könnte evtl. auch das
möglich sein:

interrupt[INT0_vect] void INT0_interrupt(void)

von Michael Wilhelm (Gast)


Lesenswert?

Bei mir aus einem Prg gerissen ATMEGA 64:

Entweder:

#pragma vector = INT7_vect
__interrupt void ext_int_7_isr(void)
{
  ...
}

oder:
#pragma vector = 0x20
__interrupt void ext_int_7_isr(void)
{
  ...
}

MW

von Michael (Gast)


Lesenswert?

Perfekt!!!!

Tausend Dank!!!

Die Frage, warum das so sein muss bleibt zwar noch, aber ich kann
wenigstens weiter machen :-)

Grüße,
Michael

von marcel (Gast)


Lesenswert?

zu c und c++ gibt es einen (Quasi)-Standard, in dem gesagt wird, dass
alle schlüsselwörter, die nicht dem allgemeinem standard entsprechen
mit _ oder  und Großbuchstabe beginnen.

__interrupt ist so ein schlüsselwort, weil es im standard-c keine
interrupt service routinen gibt (das soll eigentlich alles das runtime
enviroment bzw. das BS machen).

deshalb gibt es von jedem compiler-hersteller eine andere technik mit
dem problem umzugehen.
(siehe #pragma-anweisung darüber)

von Chris (Gast)


Lesenswert?

> zu c und c++ gibt es einen (Quasi)-Standard, in dem gesagt wird,
> dass alle schlüsselwörter, die nicht dem allgemeinem
> standard entsprechen mit _ oder  und Großbuchstabe beginnen.

Der offizielle Standard sagt genauer, dass keine globalen Bezeichner
mit einem und keine lokalen mit einem doppelten Unterstrich beginnen
dürfen (ist bestimmt noch genauer festgelegt), da diese Bezeichner für
den Compiler bzw. die Runtime-Bibliotheken reserviert sind.

Deswegen sollte man z.B. auch bei include-guards keine führenden
Unterstriche verwenden:
#ifdef __BLA_H
#define __BLA_H
#endif

Das wäre z.B. soweit ich weiß kein "well-formed" C/C++-Code.

von OldBug (Gast)


Lesenswert?

Es gibt auch mit Sicherheit ein Makro, ähnlich SIGNAL(#ir_vector) beim
avr-gcc, welches einem das ganze #pragma- und __interrupt-Geraffel
abnimmt.

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.