Hallo, ich hab mir so eben ein kleines Programm zusammengestrickt und jetzt folgendes Problem. Und zwar springt mir beim Überlauf des Timers T0 das Programm immer an die Adresse des Interrupts "Two-Wire Serial Interface" anstatt an die Stelle des Timer0 Overflow Interrupts, woran könnte das liegen? .include "m16def.inc" .cseg .org 0x00 jmp main ; Reset Handler reti ; IRQ0 Handler reti ; IRQ1 Handler reti ; Timer2 Compare Handler reti ; Timer2 Overflow Handler reti ; Timer1 Capture Handler reti ; Timer1 CompareA Handler reti ; Timer1 CompareB Handler reti ; Timer1 Overflow Handler rjmp T0overflow ; Timer0 Overflow Handler reti ; SPI Transfer Complete Handler reti ; USART RX Complete Handler reti ; UDR Empty Handler reti ; USART TX Complete Handler reti ; ADC Conversion Complete Handler reti ; EEPROM Ready Handler reti ; Analog Comparator Handler reti ; Two-wire Serial Interface Handler reti ; IRQ2 Handler reti ; Timer0 Compare Handler reti ; Store Program Memory Ready Handler main:
Das liegt daran, dass der Mega16 mehr Speicher hat als der Mega8. Folgerichtig braucht man 2 Bytes um eine Adresse im Speicher zu adressieren. Folgerichtig hat jeder Eintrag im Interrupt-Vektor 2 Bytes anstatt nur 1 wie beim Mega8. Du musst also nach den reti noch jeweils ein Byte einfügen. Einfacher und sicherer ist es allerdings die Interrupt Vektoren mittls .org Instruktionen auf die richtige Adresse zu platzieren. So wie es zb hier gemacht wurde: http://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer#Erste_Tests
@Karl heinz Buchegger > Das liegt daran, dass der Mega16 mehr Speicher hat als > der Mega8. Folgerichtig braucht man 2 Bytes um eine > Adresse im Speicher zu adressieren. Folgerichtig > hat jeder Eintrag im Interrupt-Vektor 2 Bytes > anstatt nur 1 wie beim Mega8. Es ist viel SCHLIMMER! Du meinst sicherlich 2 Worte = sage und schreibe 4 Bytes! ;-) > Du musst also nach den reti noch jeweils ein Byte einfügen. Neee, Wort. MFG Falk
> Du meinst sicherlich
Kann sein, dass ich das meine :-)
Ich überlass sowas dem Compiler bzw. Assembler :-)
Das Einfachste ist, statt "reti" ein "jmp RESET" in die unbenutzten Vektoren zu schreiben, dann kann man fehlgeleitete Interrupts gleich am Neustart erkennen und ggf. abfangen. Außerdem füllt dieses Kommando exakt die 2 Worte.
Wenn man Interrupts nimmt, dann sollte man bitteschön auch die vordefinierten Vektoren nehmen. Wozu schreiben sie die denn extra ins Include. Die Vektoren sind nunmal bei den verschiedenen AVRs nicht in der gleichen Reihenfolge. Also immer schön mit .org die Adresse setzen und dann zum Handler springen. Alles andere ist Mumpitz und geht beim nächsten Derivat garantiert wieder schief. Peter
also mal einfach gesagt: nicht RJMP sondern JMP verwenden.... am besten so: (MEGA16) .org 0x000 jmp main ; Reset Handler ; steht immer ganz am Anfang des Speichers jmp falsch ; IRQ0 Handler jmp falsch ; IRQ1 Handler jmp falsch ; Timer2 Compare Match jmp falsch ; Timer2 Overflow jmp falsch ; Timer1 Capture Handler jmp falsch ; Timer1 CompareA Handler jmp falsch ; Timer1 CompareB Handler jmp falsch ; Timer1 Overflow Handler jmp falsch ; Timer0 Overflow Handler jmp falsch ; SPI Transfer Complete Handler jmp falsch ; USART RX Complete Handler jmp falsch ; UDR Empty Handler jmp falsch ; USART TX Complete Handler jmp falsch ; ADC Conversion Complete Interrupt Handler jmp falsch ; EEPROM Ready Handler jmp falsch ; Analog Comparator Handler jmp falsch ; Two-wire Serial Interface Handler jmp falsch ; IRQ2 Handler jmp falsch ; Timer0 Compare Match jmp falsch ; Store Program Memory Ready Handler falsch: reti
Wenn man sich nicht sicher ist: Einfach im Datenblatt nachsehen. ATMEL hat immer recht viele Code-Beispiele drin, und dazu zählen auch die Vektortabellen in Assembler. Braucht man eigentlich nur abzutippen.
@ Michele Ja, genau so sollte man es eben nicht machen. Was stört Dich daran, für jeden Vektor das passende .org zu nehmen ? Man muß dann bloß den nachfolgenden Code hinter dem letzten Vektor beginnen lassen. Und wenn dann mal ein Vektor nicht existiert oder anders heißt, kriegt man sofort ne ordentliche Fehlermeldung und muß nicht erst tagelang debuggen. Peter
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.