Hallo! Ich habe folgendes Problem. Bei dem Versuch, einen Interrupt mittels INT2 auszulösen, passiert genau gar nichts. Verwendeter uC : ATMEGA 16 Verwendete Programmiersprache : C Geleistete Vorarbeiten: * Port B als Eingang definiert * External Interrupt Request 2 in GICR enabled * Interrupt reagiert auf falling edge * Global Interrupt is auch enabled Um sicherzustellen, dass eine Verbindung vom Taster zum Pin PB2 gegeben is, hab ich ein Voltmeter an den Pin gegeben und dort die Tasterfunktion überprüft die einwandfrei funktionierte. -> Spannung falls Taster nicht gedrückt keine Spannung falls Taster gedrückt Was mich etwas beunruhigt, ist die Tatsache, dass während der Simulation mittels AVR Studio alles wie gewünscht ablief, halt eben nur theoretisch... Es würde mich sehr freuen, wenn mir jemande einen guten Tip geben könnte, um diesem Spuk endlich ein Ende zu machen =). Vielen Dank Bernhard
Ich sehe nirgends eine Tasterentprellung. Könnte zumindest eine Erklärung sein... BTW: Die ganze Spielerei mit SREG usw. in den ISRs kannste Dir sparen. Kann auch zu Fehlern führen. Das deaktivieren der Interrupts am Anfang (I löschen) und das wieder-Aktivieren am Ende wird von der Hardware automatisch gemacht. Das Sichern von SREG übernimmt der Compiler.
INT0 und INT1 funktionieren in der Simulation als auch praktisch einwandfrei. Eben dieser INT2 beschert mir soviele Probleme. An eine Tasterentprellung hab ich auch schon gedacht. Da ich mir aber das Zeitverhalten der einzelnen Taster unter die Lupe genommen und keine Prellung feststellen konnte, hab ich drauf verzichtet.
Ich tippe mal darauf, daß dein Interrupt doch ausgelöst wird. Du hast lediglich versäumt, die Variable, die du dort änderst, als volatile zu definieren. Hier noch ein paar allgemeine Hinweise zum Code-Stil: Warum schreibst du bei der Initialisierung nach PINB? Das Register ist eigentlich nicht beschreibbar. Ich würde dir außerdem empfehlen, die Bitnamen zu verwenden statt irgendwelcher magischen Zahlen. Also statt TCCR1B = 0x05; besser: TCCR1B = _BV(CS12) | _BV(CS10); und bitte statt SET_BIT(SREG,7); einfach: sei(); Statt: int itest=0; do{ itest = bit_is_set(TIFR,4); }while(itest == 0); kannst du auch einfacher schreiben: loop_until_bit_is_set(TIFR, TOV1); Und warum definierst du die Namen der Interrupt-Vektoren selbst? Die sollten eigentlich schon vordefiniert sein.
Du hast Deine globalen Variablen (eben auch idirection) nicht 'volatile' deklariert. Dann ist es sehr wahrscheinlich, dass es da Probleme gibt.
> loop_until_bit_is_set(TIFR, TOV1);
Muß natürlich heißen:
loop_until_bit_is_set(TIFR, OCF1A);
> #define CLEAR_BIT(A,B) A&=(0xff-_BV(B))
So was hab ich auch noch nicht gesehen. Sinnvoller (u.a. weil
nachvollziehbarer) wäre
#define CLEAR_BIT(A,B) A &= ~(_BV(B))
Ähnliche Probleme hat ich auch mit dem INT2.. zugegeben hab ich nicht lang damit beschäftigt, da ein polling mir ausreichte, aber mich würde mal interessieren ob der bei anderen generell ersteinmal funktioniert hat (ich hatte ein volatile und zur Überprüfung in der ISR eine LED aktiviert lassen.. ging aber nichts)
So, jetzt hab ich einige konstruktive Änderungsvorschläge eingebaut, aber es is alles noch beim alten =(. Ich hoff, dass ihr noch mehr Begeisterung auffinden könnt wie ich um dieses Problem zu beheben, ansonsten werd ich dieses Programm ins Nirvana katapultieren...
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.