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 :)
Du mußt die Tabelle mit den Interruptvektoren ins RAM packen, und dann mit der Initialisierungsroutine den Vektor an die passende Stelle schreiben.
Versuche mal einfach eine weitere .inc Datei einzubinden die mit .org beginnt dann die ganzen Sprungbefehle folgen.
>Du mußt die Tabelle mit den Interruptvektoren ins RAM packen..
Welcher controller ?
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.
...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
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.
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...?
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
@ 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 :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.