Forum: Compiler & IDEs Taster-Interrupt Problem


von Max T. (charmquark)


Lesenswert?

Hey zusammen,

ich habe hier ein Atmel Evaluationsboard 2.01 von Pollin 
(http://www.pollin.de/shop/downloads/D810038B.PDF) mit einem ATMega32 
16PU, welches ich per ISP mit AVR-Studio programmiere. Das Board hat an 
PD2(INT0), PD3(INT1) und PD4 je einen Taster, und an PD5 und PD6 je eine 
LED.
Ich habe vorher mit einem Timer-Interrupt die LEDs abwechselnd blinken 
lassen, was ohne Probleme funktionierte. Jetzt wollte ich das ganze auf 
einen externen Interrupt von dem Taster an PD2, also INT0 triggern. 
Leider funktioniert das nicht wie gewünscht. Hier erstmal der Code:
1
#define F_CPU 16000000UL     /* Ext. Quarz mit 16 Mhz */
2
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include <avr/iom32.h>
6
#include <avr/signal.h>
7
8
volatile uint8_t flag;
9
10
int main(void)
11
{
12
  DDRD = (1<<PIND5);
13
  GICR |= (1<<INT0);
14
  MCUCR |=(1<<ISC01) | (1<<ISC00);
15
  sei();
16
    
17
    PORTD = (1 << PD5);
18
  flag = 0;
19
  
20
  while(1) 
21
  {
22
    if (flag ==1)
23
    {
24
      flag = 0;
25
      PORTD ^= (1 << PD5);
26
    }      
27
  }
28
  return 0;
29
}  
30
 
31
 SIGNAL( INT0_vect)
32
 {
33
  flag=1;
34
 }

Nun ist es egal, welchen Taster ich betätige, der Interrupt wird bei 
jedem der drei Taster ausgeführt. Und das selbst wenn die Jumper JP3, 
JP4 und JP5 (siehe PDF von oben) nicht eingesetzt sind, also eigentlich 
keine physikalische Verbindung zwischen Taster und uC existieren sollte.
Des weiteren wird fast die hälfte aller Interrupts verschluckt.

Ist es ein Software-Problem, oder was könnte hier los sein?

Schöne Grüße,
Max

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Max TBA schrieb:

> Des weiteren wird fast die hälfte aller Interrupts verschluckt.

Liegt wohl an der fehlenden Entprellung.

> Ist es ein Software-Problem, oder was könnte hier los sein?

von Rolf Magnus (Gast)


Lesenswert?

Max TBA schrieb:
> #include <avr/iom32.h>

Diesen Header inkludiert man nie direkt.

Max TBA schrieb:
> Des weiteren wird fast die hälfte aller Interrupts verschluckt.

Sicher, daß sie "verschluckt" und nicht etwa mehrfach ausgelöst werden?
Siehe Entprellung. Außerdem hängen deine Pins quasi ohne irgendeinen 
festen Pegel in der Luft, wenn kein Taster gedürckt wird. Dann wirken 
sie wie Antennen, die sich irgendwas aus der  Umgebung einfangen. 
Schalte mal die internen Pull-up-Widestände ein.

von Max T. (charmquark)


Lesenswert?

Danke für die Antworten! Ich habe mal den Speicher gelöscht und es 
scheint an irgendwelchen Fusebits gelegen zu haben. Jetzt schaltet er 
wirklich nur bei dem einen Taster die LED um. Leider scheint er manchmal 
"abzustürzen", so dass ich einen Reset machen muss, bevor der Schalter 
wieder wirkung zeigt.

Rolf Magnus schrieb:
> Außerdem hängen deine Pins quasi ohne irgendeinen
> festen Pegel in der Luft, wenn kein Taster gedürckt wird. Dann wirken
> sie wie Antennen, die sich irgendwas aus der  Umgebung einfangen.
> Schalte mal die internen Pull-up-Widestände ein.

Die anderen beiden Taster-Pins haben doch schon einen externen 
Pull-Down. Ich dachte, sie wären durch die Kondensatoren und Widerstände 
schon entprellt, aber da muss ich mich scheinbar noch schlaumachen ;-)

von Peter D. (peda)


Lesenswert?

Max TBA schrieb:
> Nun ist es egal, welchen Taster ich betätige, der Interrupt wird bei
> jedem der drei Taster ausgeführt. Und das selbst wenn die Jumper JP3,
> JP4 und JP5 (siehe PDF von oben) nicht eingesetzt sind, also eigentlich
> keine physikalische Verbindung zwischen Taster und uC existieren sollte.

Ist ein HW-Problem, C17..C19 müssen ersatzlos entfernt werden!
Sie erzeugen Einbrüche auf der VCC und das mag ein MC nicht. Er reagiert 
unvorhersehbar.

Max TBA schrieb:
> Des weiteren wird fast die hälfte aller Interrupts verschluckt.

Ist ein SW-Problem, nimm einen Timerinterrupt zum Einlesen und 
Entprellen.


Peter

von Rolf Magnus (Gast)


Lesenswert?

Max TBA schrieb:
> Die anderen beiden Taster-Pins haben doch schon einen externen
> Pull-Down.

Ja, stimmt. Die schalten ja nach + und nicht wie eher üblich nach Masse.
Ich hatte übersehen, daß es oben nach 5V geht und nicht zum Pin.

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.