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
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. ...
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
> ich hatte in meiner Tabelle nur ein reti stehen,
Das hatte ich vermutet... ;-)
...
@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
@ 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
@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... ;-) ...
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.