ISR Vektortabelle

Gast #318681
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
#318683
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.

...
#318686
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
#318688
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...

;-)

...

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