Forum: Mikrocontroller und Digitale Elektronik INT2 reagiert nicht (ATMEGA16)


von Bernhard F. (austrofox)


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

von JPR (Gast)


Lesenswert?

Post doch mal den Quellcode, dann sehn wir weiter...
Gruß,
JPR

von Bernhard F. (austrofox)


Angehängte Dateien:

Lesenswert?

Ich hoffe das hilft Dir weiter!

von johnny.m (Gast)


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.

von Bernhard F. (austrofox)


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.

von Rolf Magnus (Gast)


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.

von johnny.m (Gast)


Lesenswert?

Du hast Deine globalen Variablen (eben auch idirection) nicht
'volatile' deklariert. Dann ist es sehr wahrscheinlich, dass es da
Probleme gibt.

von Rolf Magnus (Gast)


Lesenswert?

>  loop_until_bit_is_set(TIFR, TOV1);

Muß natürlich heißen:

  loop_until_bit_is_set(TIFR, OCF1A);

von johnny.m (Gast)


Lesenswert?

Upps, Rolf war schneller...

von johnny.m (Gast)


Lesenswert?

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

von Hans (Gast)


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)

von Bernhard F. (austrofox)


Angehängte Dateien:

Lesenswert?

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...

von Simon K. (simon) Benutzerseite


Lesenswert?

Pullup am Pin ?

von Bernhard F. (austrofox)


Lesenswert?

Keine Chance!

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.