INT2 reagiert nicht (ATMEGA16)

OP #353139
Lesenswert?

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
Gast #353142
Lesenswert?

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.
OP #353143
Lesenswert?

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.
Gast #353144
Lesenswert?

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.
Gast #353149
Lesenswert?

Ä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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren