mikrocontroller.net

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


Autor: Bernhard Fuchs (austrofox)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: JPR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Post doch mal den Quellcode, dann sehn wir weiter...
Gruß,
JPR

Autor: Bernhard Fuchs (austrofox)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich hoffe das hilft Dir weiter!

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernhard Fuchs (austrofox)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnny.m (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  loop_until_bit_is_set(TIFR, TOV1);

Muß natürlich heißen:

  loop_until_bit_is_set(TIFR, OCF1A);

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Upps, Rolf war schneller...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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))

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Bernhard Fuchs (austrofox)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pullup am Pin ?

Autor: Bernhard Fuchs (austrofox)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine Chance!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.