Forum: Mikrocontroller und Digitale Elektronik atmega64 und externe Interrupts


von jakob (Gast)


Lesenswert?

Hallo µC Community,

Ich sitze hier vor einem Atmega64 und möchte INT0-INT3 auf steigende 
Flanke aktivieren. Doch immer wenn ich diese Aktiviere, springt der PC 
unkontrolliert in eine Stelle des Flashs, ich weiß nicht woran es liegt. 
Hat hier jemand schonmal diese aktiviert und kann mir einen 
Codeausschnitt senden? Ob ASM oder C ist mir eigentlich egal, kann ich 
dann ja jeweils portieren!

Ich hoffe sehr, dass mir jemand weiterhelfen kann, denn aus dem 
Atmel-Datasheet werde ich nicht schlau :D

Gruß,
Jakob

von Sumynona (Gast)


Lesenswert?

Richtige header-Datei verwendet?
Richtigen Interrupt verwendet?

von Klaus (Gast)


Lesenswert?

Vectortabelle mit .org auf die richtigen Adressen gesetzt?
Richtige Reihenfolge in der Vectortabelle?

von jakob (Gast)


Lesenswert?

Hmm ich arbeite mit C, setze folgende Register:
1
EIMSK &= ~(1<<INT0) & ~(1<<INT1) & ~(1<<INT2);
2
EICRA |= (1<<ISC00) | (1<<ISC01) | (1<<ISC10) | (1<<ISC11) | (1<<ISC20) | (1<<ISC21);
3
EIFR |= (1<<INTF0) | (1<<INTF1) | (1<<INTF2);
4
EIMSK |= (1<<INT0) | (1<<INT1) | (1<<INT2);

Diese werden so im Datasheet vorgeschrieben, wenn ich es richtig 
interpretiert habe.

Die ISRs sind: IN0_vect bis INT2_vect, sie werden jedoch garnicht es 
durchlaufen!

von Max (Gast)


Lesenswert?

Ich würde garnicht erst die Register setzen.

Wenn du in GCC arbeitest ist die beste lösung:

#include <avr/interrupts.h> //oder interrupt

im Code mit sei(); aktivieren
dann einfach nur noch die ISRs setzen

MFG Max

von Johannes M. (johnny-m)


Lesenswert?

Max wrote:
> Ich würde garnicht erst die Register setzen.
Und woher soll der µC dann bitteschön wissen, welche Interrupts aktiv 
sein sollen und auf welche Flanke die reagieren sollen?

> Wenn du in GCC arbeitest ist die beste lösung:
>
> #include <avr/interrupts.h> //oder interrupt
Ohne "s". Aber das wird er wohl schon gemacht haben, weil der Compiler 
ihm sonst einen Haufen Fehlermeldungen um die Ohren gehauen hätte, 
allein wegen unbekannter Dinge wie "ISR" und "sei()"...

> im Code mit sei(); aktivieren
Auch das ist wohl selbstverständlich.

> dann einfach nur noch die ISRs setzen
Setzen? Wie meinen?

von Max (Gast)


Lesenswert?

Ich sehe nur das er die Register setzt. Er hat uns nicht gesagt ob er 
die interrupt.h einbindet.

Dadurch ist sei(); auch nicht selbstvertändlich.

ISR: ISR(INT0_vect)
     {
       ....
     }

Wenn du ein konkretes Codebeispiel brauchst, kann ich ich es gerne hier 
rein stellen

MFG max

von Johannes M. (johnny-m)


Lesenswert?

Max wrote:
> Ich sehe nur das er die Register setzt. Er hat uns nicht gesagt ob er
> die interrupt.h einbindet.
Zitat OP:
>> Die ISRs sind: IN0_vect bis INT2_vect, sie werden jedoch garnicht es
>> durchlaufen!
Es ist also davon auszugehen, dass er das getan hat, da er ansonsten, 
wie oben schon gesagt, noch einen Haufen Fehlermeldungen bekäme und 
demzufolge weder etwas Flashbares noch etwas Simulierbares bekommen 
hätte.

> Dadurch ist sei(); auch nicht selbstvertändlich.
Doch. Er schreibt schließlich, dass bei einem Interrupt gesprungen wird 
(was ohne sei() nicht der Fall ist), nur eben nicht dahin, wo er 
hinspringen will...

von Peter D. (peda)


Lesenswert?

Die üblichen Verdächtigen:

- M103 Fuse
- ein Interrupthandler fehlt
- falsches Target


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