mikrocontroller.net

Forum: Compiler & IDEs Verständnisproblem mit Libs


Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz simple...

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

Mal n' bisschen nachdenken !

Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Werner B. (Gast)
Datum:

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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wurde hier schon mal diskutiert:

http://www.mikrocontroller.net/forum/read-2-167909...

Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Helge Dietert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.