Forum: Mikrocontroller und Digitale Elektronik ISR Vektortabelle


von alex (Gast)


Lesenswert?

Ich ich habe bis jetzt immer in C programmiert, muss jetzt aber bei
einem neuen Projekt (Comtroller: MEGA 16) auf Assembler umsteigen
(wegen Timing).

Habe eine Tabelle laut Datenblatt erstellt, jedoch springt er bei einem
Timeroverflow nicht in dir Richtige Spalte. Habe alles nochmals
kontrolliert und scheint auch zu stimmen.

mfg

Alex

von alex (Gast)


Lesenswert?

Sorry, ich meine natürlich Zeile, NICHT Spalte.....

von Hannes L. (hannes)


Lesenswert?

Ist dir bewusst, dass ab 16kB Flash die Vektoren im Doppelwort-Abstand
liegen? Für jeden Eintrag sind also 2 Worte reserviert, damit der
Befehl JMP drin Platz hat.

Da ich zwecks unfragmentierter Hexdatei darauf verzichte, jeden
einzelnen Eintrag mit .ORG zu adressieren, sieht meine Sprungtabelle
bei Mega16-Programmen anfangs so aus:

.org 0              ;Reset- und Interrupt-Vektoren AT-Mega 16
 jmp RESET          ;Reset Handler
 jmp nix ;EXT_INT0       ;IRQ0 Handler
 jmp nix ;EXT_INT1       ;IRQ1 Handler
 jmp nix ;TIM2_COMP      ;Timer2 Compare Handler
 jmp nix ;TIM2_OVF       ;Timer2 Overflow Handler
 jmp nix ;TIM1_CAPT      ;Timer1 Capture Handler
 jmp nix ;TIM1_COMPA     ;Timer1 CompareA Handler
 jmp nix ;TIM1_COMPB     ;Timer1 CompareB Handler
 jmp nix ;TIM1_OVF       ;Timer1 Overflow Handler
 jmp nix ;TIM0_OVF       ;Timer0 Overflow Handler
 jmp nix ;SPI_STC        ;SPI Transfer Complete Handler
 jmp nix ;USART_RXC      ;USA RT RX Complete Handler
 jmp nix ;USART_UDRE     ;UDR Empty Handler
 jmp nix ;USART_TXC      ;USART TX Complete Handler
 jmp nix ;ADC            ;ADC Conversion Complete Handler
 jmp nix ;EE_RDY         ;EEPROM Ready Handler
 jmp nix ;ANA_COMP       ;Analog Comparator Handler
 jmp nix ;TWSI           ;Two-wire Serial Interface Handler
 jmp nix ;EXT_INT2       ;IRQ2 Handler
 jmp nix ;TIM0_COMP      ;Timer0 Compare Handler
 jmp nix ;SPM_RDY        ;Store Program Memory Ready Handler
nix:                ;Interrupt nicht genutzt
 reti                   ;zurück...

Für die Interrupts, die ich dann brauche, schreibe ich ISRs und nehme
das 'nix ;' aus der Zeile raus. Während des Debuggens bekommt die
Routine 'nix' Debug-Code, um falsche Interrupts (Programmierfehler)
zu erkennen.

...

von alex (Gast)


Lesenswert?

Hi Hannes, danke für dem Tip, jetzt funktionierts.

ich hatte in meiner Tabelle nur ein reti stehen, das mit dem Doppelwort
hatte ich nicht bedacht.

mfg

Alex

von Hannes L. (hannes)


Lesenswert?

> ich hatte in meiner Tabelle nur ein reti stehen,

Das hatte ich vermutet... ;-)

...

von Bernhard S. (bernhard)


Lesenswert?

@HannesS

Ich hab jetzt hin und her überlegt, wie Du das meinst:

>... schreibe ich ISRs und nehme das 'nix ;' aus der Zeile raus

denn es gibt nach meiner Meinung einen Grundlegenden Unterschied.

Du schreibst:

>.org 0              ;Reset- und Interrupt-Vektoren AT-Mega 16
> jmp RESET          ;Reset Handler
> jmp nix ;EXT_INT0       ;IRQ0 Handler
> jmp nix ;EXT_INT1       ;IRQ1 Handler
> jmp nix ;TIM2_COMP      ;Timer2 Compare Handler
> jmp nix ;TIM2_OVF       ;Timer2 Overflow Handler
> .
> .
> .
> nix:                ;Interrupt nicht genutzt
> reti                   ;zurück...

_____________________________


Und das wäre der etwas umständliche Weg mit den "org":


.org 0          ;Startadresse=0
rjmp RESET     ; Reset Handler
.org $002 reti;rjmp EXT_INT0   ; IRQ0 Handler
.org $004 reti;rjmp EXT_INT1   ; IRQ1 Handler
.org $006 rjmp EXT_INT2   ; IRQ2 Handler  <= der wäre aktiv !!
.org $008 reti;rjmp TIM2_COMP   ; Timer2 Compare Handler
.
.


Bernhard

von Kai R. (kairiek)


Lesenswert?

@ Berhard: Das mit den .org's hat aber leider den Nachteil, dass du
Fehlerhafte Interrups nicht bearbeiten kannst.

>Während des Debuggens bekommt die
>Routine 'nix' Debug-Code, um falsche Interrupts (Programmierfehler)
>zu erkennen.

MFG

Kai

von Hannes L. (hannes)


Lesenswert?

@Bernhard & Kai:

Ihr habt Beide Recht, aber der Hase liegt ganz woanders im Pfeffer.

Schaut euch mal die Hexdatei eines Programms an, bei dem mit '.org'
Adressen übersprungen werden. Diese ist dann nämlich fragmentiert, weil
die übersprungenen Adressen undefinierte Werte haben. Das ist aber erst
das halbe Problem.

Ich hatte zu einer Zeit, als ich noch keinen WWW-Zugang hatte, mein
eigenes ISP-System (Hardware und Software) geschrieben. den
grundlegenden Aufbau der (unfragmentierten!!) Hexdatei habe ich durch
Versuche ermittelt. Meine ISP-Soft kommt mit diesen linearen
Speicherbereichen beim Einlesen der Hexdateien klar, es verheddert sich
aber bei fragmentierten Hexdateien. Und da ich bisher noch keine Lust
hatte, die Einleseroutinen neu zu schreiben, vermeide ich einfach
fragmentierte Hex-Dateien.

So einfach sind die Gründe manchmal...

;-)

...

von Bernhard S. (bernhard)


Lesenswert?

@HanneS

>Schaut euch mal die Hexdatei eines Programms an, bei dem mit '.org'
>Adressen übersprungen werden. Diese ist dann nämlich fragmentiert

>So einfach sind die Gründe manchmal...

Du hast Recht, so einfach ist es, jetzt hab' ich's kappiert :)

Guter Tipp

Danke

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.