Forum: Mikrocontroller und Digitale Elektronik ATMega644 extern INT0


von Andreas (Gast)


Lesenswert?

Guten Tag,
ich schalte am INT0 des Mega644 einen Taster. Der INT0 ist so 
konfiguriert, dass er bei einer steigenden Flanke ausgelöst werden soll. 
Jedoch löst der Interrupt ständig aus, wenn low Pegel herrscht, also 
wenn ich den Tester fest halte. (Habe gelesen das dies die 
Standardeinstellung ist)
Das Ganze habe ich am Oszi überprüft, dort sind die Pegel eindeutig zu 
erkennen.
Das delay in der ISR ist unschön, hilft aber versuchsweise bei der 
Entprellung...

Als Ausgabe lasse ich LEDs toggeln. Momentan ist es jedoch so, dass bei 
halten des Tasters (also low Pegel am Pin) die LED an PC2 im 200ms Takt 
blinkt. Die andere LED macht gar nichts.

Ich hoffe ihr könnt mir helfen!
Vielen Dank schon mal!!!

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
5
ISR(INT0_vect)
6
{  
7
  if (PIND & (1<<PD2))
8
  {//logisch 1
9
    PORTC ^= (1<<PC2);
10
  }
11
  else
12
  {//logisch 0
13
    PORTC ^= (1<<PC3);
14
  }
15
  _delay_ms(200);
16
17
}
18
19
int main(void)
20
{
21
  //LED's
22
  DDRC |= (1<<PC2) | (1<<PC3);  //PC3 as output
23
  PORTC |= (1<<PC2) | (1<<PC3);  //Enable internal pull ups
24
25
  //Extern INT
26
  DDRD &= ~(1<<PD2);        //INT0 as input
27
  PORTD |= (1<<PD2);        //Enable internal pull ups
28
  
29
  //Init extern INT0
30
  MCUCR |= (1<<ISC00) | (1<<ISC01);
31
  EIMSK |= (1<<INT0);
32
  EIFR |= (1<<INTF0);
33
  
34
  sei();
35
    
36
    while(1)
37
    {
38
39
    }
40
}

von Willi (Gast)


Lesenswert?

Viele, viel Fragen meinerseits; aber was schreibst Du denn da in MCUCR?

von Andreas (Gast)


Lesenswert?

Ohh, das sollte dort eigentlich nicht mehr stehen. Das war noch ein 
Überbleibsel von der Suche nach der Lösung, bitte einfach wegdenken...

von Andreas (Gast)


Lesenswert?

Nein sorry jetzt bin ich verwirrt ;-)
MCUCR ist so konfiguriert das die steigende Flanke detektiert werden 
soll.

EIFR bitte weg denken...

von Höni (Gast)


Lesenswert?

Andreas schrieb:
> DDRD &= ~(1<<PD2);        //INT0 as input

Wird das wirklich zum input ???

von Andreas (Gast)


Lesenswert?

Noch mehr verwirrt....
Muss natürlich nicht MCUCR sein sonder EICRA.

von Höni (Gast)


Lesenswert?

Höni schrieb:
> Andreas schrieb:
>> DDRD &= ~(1<<PD2);        //INT0 as input
>
> Wird das wirklich zum input ???

Tschuldigung. Streichen!

von Willi (Gast)


Lesenswert?

Andreas schrieb:
> MCUCR ist so konfiguriert das die steigende Flanke detektiert werden
> soll.

Ich nehme dafür aber EICRA.

Letztlich ist es auch Wurscht. Nimm eine anständige Entprellroutine; 
eine banale Lösung mit Taster an INTx-Pin scheitert immer und immer 
wieder. 1000 x hier schon beschrieben, dass das absolter Müll ist.
Wenn außer mir keiner antwortet, dann liegt das an dem _delay_ms(200) in 
der Interrupt-Routine. Die meisten müssen beim Lesen erst einmal zum 
Arzt, um sich Schmerzmittel verschreiben zu lassen.

von Andreas (Gast)


Lesenswert?

Sorry, vergesst es einfach, es wird Zeit für Koffein...

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.