Forum: Mikrocontroller und Digitale Elektronik Interrupt Vector setzen


von Jaguar xj (Gast)


Lesenswert?

Hallo,

ich nutze sehr gern die Möglichkeit Programmmodule zu erstellen und 
diese bei
Bedarf zu includieren.
Jetzt gibt es das Problem, wenn das Modul einen Interrupt benutzt und 
die Interruptroutine
beinhaltet, das ich beim einbinden des Moduls  im Hautprogramm den 
jeweiligen
Interruptvector händisch mit der .org Direktive setzen muss.

Da jedes Modul eh eine Initialisationsroutine besitzt, wäre es ja 
toll,dabei auch gleich den
Vector von dort aus zu setzen.

Wie löst ihr solche Dinge?

Danke fürs lesen und eventuellen Tip :)

von Ische (Gast)


Lesenswert?

Du mußt die Tabelle mit den Interruptvektoren ins RAM packen, und dann 
mit der Initialisierungsroutine den Vektor an die passende Stelle 
schreiben.

von Thomas (kosmos)


Lesenswert?

Versuche mal einfach
 eine weitere .inc Datei einzubinden die mit .org beginnt dann die 
ganzen Sprungbefehle folgen.

von uiii. (Gast)


Lesenswert?

>Du mußt die Tabelle mit den Interruptvektoren ins RAM packen..

Welcher controller ?

von c-hater (Gast)


Lesenswert?

Jaguar xj schrieb:

> Wie löst ihr solche Dinge?

Das hängt ganz stark von der Architektur des Zielsystems und der 
verwendeten Programmiersprache ab.

Beides hast du nicht erwähnt, sinnvolle Antworten sind also nicht 
möglich.

von Jaguar xj (Gast)


Lesenswert?

...na das ging aber schnell,Danke für Eure Antworten :)

c-hater schrieb:
> Beides hast du nicht erwähnt, sinnvolle Antworten sind also nicht
> möglich.

Da habt Ihr natürlich vollkommen Recht, manchmal ist man so mit der 
Problembeschreibung beschäftigt, das genau solche wichtigen Dinge gerne
vergessen werden.

Prozessor:  alle Atmegas, vorzugsweise Atmega88

Programmiersprache: vorzugsweise Assembler

von uiii. (Gast)


Lesenswert?

Ein include file setzt den betreffenden Interrupt vektor per CSEG & ORG

von Jaguar xj (Gast)


Lesenswert?

Thomas O. schrieb:
> Versuche mal einfach
>  eine weitere .inc Datei einzubinden die mit .org beginnt dann die
> ganzen Sprungbefehle folgen.

Das ist eine gute Idee um nicht jedesmal bei einem neuen Programm per 
Copy&Paste die Interruptvectortabelle an den Anfang des Programmcodes 
einfügen zu müssen.
Aber man muss ja die Sprungadressen in den Vectoren noch anpassen und 
damit die Tabelle modifizieren, wodurch das includieren in diesem Fall 
keinen Sinn macht.

Je nach Aufgabenstellung binde ich ein Modularen Programmschnipsel per 
.include ein, welcher z.B. INT0 auswertet.
Jetzt hat aber die darin enthaltene Interruptroutine nicht immer den 
selben Namen,weswegen ich diesen im Vector eintragen muss,welcher aber 
im Hauptprogramm ganz am Anfang mit .org Direktiven stehen muss.
Somit ist Handarbeit gefragt....

Interessant wäre jetzt diesen Eintrag direkt aus der im Modul 
enthaltenen Initialisationsroutine machen zu können, da dieser Teil ja 
sowieso beim Start des Hauptprogrammes aufgerufen wird.

von Jaguar xj (Gast)


Lesenswert?

uiii. schrieb:
> Ein include file setzt den betreffenden Interrupt vektor per CSEG
> & ORG

...der Assembler wird dann aber nach meinen Einträgen den restlichen 
Programmcode einfügen,oder lieg ich da falsch?
Das würde bedeuten,wurde zwischenzeitlich schon Programmcode 
übersetzt,so
überschreibt er diesen, da die Vectortabelle am Anfang des Speichers 
steht...?

von c-hater (Gast)


Lesenswert?

Jaguar xj schrieb:

> Prozessor:  alle Atmegas, vorzugsweise Atmega88
>
> Programmiersprache: vorzugsweise Assembler

Da schreibt man sich einfach ein Macro für.

;->@0: Basisadresse der Vektortabelle
;  @1: Offset des Vektors

.MACRO SetInterruptVector
  .SET PCBACKUP=PC
  .SET VECTORADDR=@0+@1
  .ORG VECTORADDR
  .IF Abs(PCBACKUP-VECTORADDR)<2048
    rjmp PCBACKUP
  .ELSE
    jmp PCBACKUP
    .WARNING "extra tick (far jump to ISR)"
  .ENDIF
  .ORG PCBACKUP
.ENDMACRO

Eine einfache ISR für Int0 schreibst du dann z.B. so:

SetInterruptVector RWW_START_ADDR,INT0addr
  ;hoffentlich sinnvoller Inhalt
  reti

von Jaguar xj (Gast)


Lesenswert?

@ c-heater

Das sieht sehr interessant aus, mit Macros wollte ich mich schon länger 
beschäftigen, ich glaube der Zeitpunkt ist reif ;-)
Danke für Deine Mühe,sehr nett von Dir!!!

Wenn zu der Problematik noch andere Ansätze oder Ansichtsweisen 
existieren, so können wir diese ja trotzdem beleuchten, es ist immer 
interessant zu sehen wie Andere solche Dinge angehen :)

von Jaguar xj (Gast)


Lesenswert?

....sorry es sollte natürlich c-hater statt c-heater lauten ;-)

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.