Hallo Leute. Ich habe mal wieder ein Verständnisproblem. In der aktuellen iocan128.h finde ich #define SIG_INTERRUPT7 _VECTOR(8) #define SIG_OUTPUT_COMPARE2 _VECTOR(9) #define SIG_OVERFLOW2 _VECTOR(10) #define SIG_INPUT_CAPTURE1 _VECTOR(11) #define SIG_OUTPUT_COMPARE1A _VECTOR(12) Da ich einen Teil der Interrups benutze, und das Programm erwartungsgemäß arbeitet, gehe ich davon aus, dass das richtig ist. Im so viel gepriesenen Manual findet man dazu aber 8 0x000E INT6 External Interrupt Request 6 9 0x0010 INT7 External Interrupt Request 7 10 0x0012 TIMER2 COMP Timer/Counter2 Compare Match 11 0x0014 TIMER2 OVF Timer/Counter2 Overflow 12 0x0016 TIMER1 CAPT Timer/Counter1 Capture Event Alle Interrups scheinen um 1 verschoben zu sein. 1. Woher kommt das? 2. Warum wird das so gemacht? fw
Ganz simple... es ist ein anderter prozessor, deshalb auch die unterschiedlichen io...h. Mal n' bisschen nachdenken !
also wenn es ein anderer Prozessor wäre, hätte ich ja wohl kaum was zum vergleichen oder? Es ist eben ein und der gleiche Prozessor, AT90CAN128. @Werner Mal n' bisschen nachschauen! Aber Schlussendlich scheint das also zumindest nicht ganz normal zu sein, wenn man solche Antworten bekommt.
Ich stehe immernoch auf dem Schlauch. Heißt das, dass Vektor1 im Manual nicht gleich Vektor1 in C ist? Ich kann den Sinn darin nicht erkennen. Schön, es ist in C üblich, beim Zählen bei 0 anzufangen... Und das ist der Grund? Woher weiß ich ob der Zauberer der Lib nicht Mist gebaut und die Vektoren vertauscht hat? Ich frage, weil ich das halbe Wochenende damit zugebracht habe Vektor 48 zu suchen.
Tja - Du könntest ja mal die Adressen vergleichen, die im Handbuch stehen und die Adressen, die als Resultat von _VECTOR ausgespuckt werden. Du könntest Dir auch die Definition des Macros _VECTOR mal näher ansehen, vielleicht hilft das ja beim vom-Schlauch-steigen. Viel Erfolg!
es täte ja schon eine funktionstüchtige CAN-Lib für den 90CAN128 unter GCC oder mal ein paar Tips, außerhalb des Manuals, wie so eine Configuration und Sendung vor sich geht, aber irgendwie gibts sowas nicht.
CAN scheint noch ziemliches Neuland zu sein was AVRs betrifft. Hast du mal bei avrfreaks.net geguckt, ob da schon einer sowas gemacht hat? Vermutlich wird's hier aber viel mehr closed source als open source geben, weil das Zeug alles irgendwo als Payware im Automobilbau verschwindet. Ansonten: völlig richtig geraten: C fängt beim Zählen mit 0 an, daher fängt die Vektornummerierung der avr-libc auch mit 0 an. Der 0. Vektor selbst hat dabei keinen Namen, da es fest der Resetvektor ist, dem man sowieso keinen Handler zuweisen kann. Insofern findest du in den Headerfiles alles immer mit _VECTOR(1) beginnend. Warum Atmel in den Datenblättern unbedingt ab 1 nummerieren musste, entzieht sich meiner Kenntnis. Richtig logisch ist es nicht. Solange du also dieses ``off by one'' durchweg beobachten kannst, ist also alles in Butter.
@Jörg Ja ich habe schon jede Menger neuer Bekanntschaften aus dem AFR-Freak-forum und alle haben das gleiche Problem. Es gibt ein spezielles Beispiel, aber wie alle anderen auch funktioniert es bei mir nicht. Inzwischen habe ich ja auch schon die ersten Zeichen übertragen können, aber die Filter die Masken und die Mailboxen stimmen irgendwie alle nicht, bei diesen umgestrickten Tools. Nebenbei habe ich den Effekt, dass es mal funktioniert und am nächsten Tag garnichts mehr geht, was eindeutig auf nicht richtig eingestellte Register verweist.
Das Problem ist, dass beim AVR für ein Interupt wegen der Befehlslänge 2 Byte eingeplant sind. Dieses sind fest verdrahtet die ersten so und so viel Byte des Flash-Speichers. Tritt ein Interrupt auf, wird dann an diese Stelle gesprungen und dort das Programm ausgeführt, was typischerweise ein Sprunt oder ein reti ist. Bei 8 0x000E INT6 External Interrupt Request 6 ist die 8 die Nummer des Interrupts von 1 gezählt. Da für jedes vorherige Interrupt jeweils zwei Byte benötigt werden, müssen davor 7 andere Interrupts liegen. Da der Speicher von 0 gezählt wird, liegen diese somit von 0 bis 14. Das gesuchte Interrupt liegt also an der Adresse 15 (+16). Die 0x am Anfang bedeutet aber in C, dass es Hexadezimal dagestellt wird, so dass 15 0 = 0xE ist, wie es dort steht.
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.