Interrupt Vector setzen

Gast #3469101
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 :)
Gast #3469275
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
Gast #3469361
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.
Gast #3469375
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...?
Gast #3469408
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
Gast #3469453
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 :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren