Ich komme grad nicht weiter, sehe vermutlich den Fehler nicht:
In meiner Anwendung will ich einen Drehgeber auswerten. Also habe ich
den einen Kanal am ATMEGA88 auf Port D.1 und den anderen an Port D.2
gehängt.
D.2 ist ja mit INT0 verbunden, ich will also beim Auslösen des
Interrupts (L->H) die ISR aufrufen und die Richtung abfragen und
entsprechende Reaktion auslösen.
Schon im Simulator (Atmel Studio 6) bekomme ich keinen Sprung in die
ISR, wenn ich PIND2 toggle.
Leider habe ich bisher meinen Fehler selbst nicht finden können,
vielleicht hat ja hier jemand nen Tipp.
Hier die relevanten Abschnitte:
1
#ifndef F_CPU
2
#define F_CPU 1000000UL //factory default clock value
INT0 ist an PD2, INT1 ist an PD3,
du fragst in der ISR aber PD1 ab.
Ist das so gewollt?
Ich kenne den AVR-Sim nicht. Bist du sicher, daß der in der Lage ist,
auf PinChange-Interrupts zu reagieren?
>EIMSK |= 0x01; /** activate external interrupt 0 */>EIFR |= 0x01; /** activate execution of interrupt 0 */
Reihenfolge falsch, Kommentar falsch, Bitzuweisung schlecht lesbar
EIFR = (1 << INTF0 ); /** Clear Pending INT0*/
EIMSK |= ( 1 << INT0 ); /** activate external interrupt 0 */
Gruss, Heinz
katastrophenheinz schrieb:> INT0 ist an PD2, INT1 ist an PD3,> du fragst in der ISR aber PD1 ab.> Ist das so gewollt?
Sorry, wer lesen kann, ist klar im Vorteil. Du wolltest das so.
Meine kleinen Korrekturen werden das Verhalten deines Programms nicht
gravierend verändern, also bleibt di Frage, ob der AVR-Sim in der Lage
ist, INT0 auszulösen, wenn du am PIND2 rumwackelst.
Danke für die Tipps.
Ich habs mal geändert. Im Simulator hab ich in Einzelschrittbetrieb zwar
noch immer keinen Erfolg gehabt, aber wenn ich den Pin toggle und dann
auf Run gehe, wird der Interrupt aufgerufen... komisches Verhalten.
Nachdem ich jetzt also in der ISR mal direkt noch ein paar LEDs hab
blitzen lassen, weiß ich jetzt zumindest, dass die ISR aufgerufen wird.
Muss dann also noch wo anders nen Bug haben. :)
Was soll das mit dem Interrupt? Das wird auch dir nicht gelingen, damit
einen Drehgeber einzulesen. Guck dir die Routine von PeDa an. Da steht
wie man das richtig macht.
mfg.
@Thomas Eckmann:
Nur weil du das noch nicht gesehen hast, heißt nicht, dass es nicht
funktionieren kann.
Ich hatte in einer aufgerufenen Funktion noch einen logischen Fehler,
aber funktionieren tut das hervorragend.
Schau dir mal nen Drehgeben an: zwei um 90° versetzte Rechteck-Kurven
kommen da raus.
Wenn du auf die (steigende) Flanke des einen Rechtecksignals triggerst
(Interrupt) und dann schaust, welchen Pegel das andere Signal zu diesem
Zeitpunkt hat, kannst du sauber feststellen, ob jetzt nach links oder
rechts gedreht wurde.
Da ich das Signal in Hardware entprelle, muss ich das in der Software
nicht beachten.
__, .__, .__, .__, .__
A: |__| |__| |__| |__|
_, .__, .__, .__, .__
B: |__| |__| |__| |__|
^ ^
| |- Interrupt bei Linksdrehung: A == 0
|---- Interuupt bei Rechtsdrehung: A == 1
Hi
>Nur weil du das noch nicht gesehen hast, heißt nicht, dass es nicht>funktionieren kann.
Mit diesen Ansatz kommen Anfänger hier öfters. Also nichts unbekanntes.
MfG Spess