Forum: Compiler & IDEs Verständnisproblem mit Libs


von flyingwolf (Gast)


Lesenswert?

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

von Werner B. (Gast)


Lesenswert?

Ganz simple...

es ist ein anderter prozessor, deshalb auch die unterschiedlichen
io...h.

Mal n' bisschen nachdenken !

von flyingwolf (Gast)


Lesenswert?

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.

von Werner B. (Gast)


Lesenswert?

Vielleicht zählen die einen ab 0 und die anderen ab 1 ?

von Rufus T. Firefly (Gast)


Lesenswert?


von flyingwolf (Gast)


Lesenswert?

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.

von Rufus T. Firefly (Gast)


Lesenswert?

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!

von flyingwolf (Gast)


Lesenswert?

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.

von Jörg Wunsch (Gast)


Lesenswert?

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.

von flyingwolf (Gast)


Lesenswert?

@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.

von Helge Dietert (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.