Hallo
Ich möchte in C durch eine Flanke an INT0 eines Mega8 einen Interupt
auslösen.
Die Hardware löst einen Interupt aus, jedoch wird dann sofort ein Reset
ausgeführt.
Im Dissassembler steht bei Vector 1, dem INT0-Vektor keine konkrete
Adresse, sondern eine auf den Programm Pointer bezogene eingetragen z.B.
PC+0x002C.
Der Interupt INT0 lässt sich durch sein Enable Bit verhindern. Der Reset
kommt dann nicht.
Ich denke, an Adresse 1 im Programmspeicher müsste die genaue Adresse
der ISR stehen. Das tut sie aber wohl nicht.
In anderen Programmen habe ich auch die Anweisung PC+0x002C noch nicht
in den Interuptvektoren gesehen. Diese waren immer 0x000049 o.ä.
Ich habe das Interuptproblem in ein AVR Studio Projekt gepackt.
Kann das mal jemand compilieren?
Springt der AVR wieder zum Anfang, weil er keine konkrete ISR-Adresse
bekommt?
>sondern eine auf den Programm Pointer bezogene eingetragen z.B.>PC+0x002C
Das liegt ja auch daran, dass rjmp benutzt wird, was grundsätzlich nur
Sprünge relativ zum Program Counter macht...
Jetzt wäre interessant, was denn an Adresse 0x2D (oder 0x2E?)
passiert...
Laut deinem C-Quellcode sollte da irgendwas mit OUT oder so stehen (IN,
OR, OUT...).
Hallo
Er soll zu PC+0x002C springen.
Der PC hat aber immer einen anderen Wert. Die ISR-Adresse müsste doch
darin stehen, oder?
Ich hatte gestern danach noch einaml die neueste Version von WINAVR
installiert. Damit hing sich AVRStudio aber immer auf und jetzt ist
wieder die Version 20050214 auf meinem System.
avr-gcc -v meldet Version 3.4.3
Muss ich da etwas mit Signal machen wegen alter Versionen?
Kann jemand vielleicht mal einen Int0 Testcode tippen, der in Vector1
eine feste Adresse hieneinschreibt?
Oder ist der rjmp mit PC+X normal?
Im Anhang ist das Dissassembling der ISR.
Klar hat der PC immer einen anderen Wert.
Der wird jedes mal geändert, wenn ein Befehl abgearbeitet wurde.
Im Falle des ISR-Vectors befindet er sich beim nächsten "rjmp".
Von dort aus 0x2C Schritte weiter befindet sich ja auch die
entsprechende ISR, wie man an deinem Bild wunderschön erkennen kann
(hatte mich verrechnet...).
Dein Reset scheint (meiner Meinung nach) woanders her zu kommen.
Kann das sein, daß alle IRQ-Vektoren auf die gleiche Adresse zeigen?
0001: rjmp PC+002C -> 2d
0002: rjmp PC+002B -> 2d
...
002d: rjmp PC-002D -> 00 (Resetvektor)
Also wie ich das sehe, wird deine ISR überhaupt nicht angesprungen,
sondern direkt der Resetvektor ...
Grüße, Freakazoid
> Kann das sein, daß alle IRQ-Vektoren auf die gleiche Adresse zeigen?
Auf den Default-Vektor. Dann ist wohl kein einziger Interruptvektor
installiert worden. Der Default-Vektor springt zur Adresse 0, sieht
im Ergebnis also einem Reset sehr ähnlich.
Wenn ich das Ganze bei mir compiliere, wird der Interruptvektor für
den Externinterrupt 0 (der erste nach dem Reset) aber sehr wohl
ausgefüllt. Allerdings habe ich 1. kein AVR Studio, compiliere das
also mit der Hand, und 2. ließ sich das Ganze so nicht compilieren,
da das #include "main.h" gefehlt hat. Das legt also nahe, dass der
offierte Sourcecode irgendwie nicht zum Rest passt.
> Auf den Default-Vektor. Dann ist wohl kein einziger Interruptvektor> installiert worden. Der Default-Vektor springt zur Adresse 0, sieht> im Ergebnis also einem Reset sehr ähnlich. Das mein ich ja. Hab mich wohl
schlecht ausgedrückt ;-)
Grüße, Freakazoid
Das Problem war die ISR. Mit SIGNAL ging das Ganze.
Jetzt wird der Pin gesetzt, aber irgendwie bin ich damit noch nicht
zufrieden.
Ich habe ein Handy-Display zusätzlich angeschlossen, die
Displayschreibroutinen laufen jedoch nicht aus dem Interrupt heraus.
Ich habe alle Variablen als volatile deklariert.
Hin und wieder werdenneben dem Portsetzen, auch noch ein oder zwei Pixel
gezeichnet.
Was muss ich beim Funktionsaufruf besonderes beachten?
@Freakazoid: bei mir ist die main included. Komisch.
AVR Studio zeigt auch bei der lauffähigen Interruptvaraiante immer noch
diese relativen rjmp-Adressen an.
> Das Problem war die ISR. Mit SIGNAL ging das Ganze.
Dann hast du 'ne zu alten Version der avr-libc (1.2.x, aktuell ist
1.4.5).
> die> Displayschreibroutinen laufen jedoch nicht aus dem Interrupt heraus.
Sowas macht man nicht. Interruptroutinen möglichst kurz halten.
> bei mir ist die main included.
Nicht in dem Zip-File, das du in deinem ersten Beitrag hast. Dann
hast du da irgendwas zusammengewickelt, was nicht deinem Arbeitsstand
entspricht.
> AVR Studio zeigt auch bei der lauffähigen Interruptvaraiante immer noch> diese relativen rjmp-Adressen an.
Dafür heißt es ja auch *r*jmp.
Tip:
Bringe deine Software auf den neusten Stand: AvrStudio (SP4, Build-498)
und WinAVR (WinAVR-20060421.) Sonst stolperst Du noch über alte
Probleme, die schon längst gelösst sind! Dann funktioniert auch ISR()
anstelle des längst nicht mehr aktuellen SIGNAL()
MfG Peter