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
Vectortabelle mit .org auf die richtigen Adressen gesetzt? Richtige Reihenfolge in der Vectortabelle?
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!
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
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?
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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.