Externer Interrupt

Gast #4955934
Lesenswert?

Hallo,

nutze einen Atmega32M1 (Achtung, M1)

Versuche einen Externen Interrupt zu nutzen, klappt aber nicht.
Nutze den PIN PC0 (INT3) (Pin 30)

Folgende Funktion rufe ich in der main(..) auf:
1
void Init_ExternerInterrupt(void) {
2
    EICRA = (1 << ISC30);
3
    EIMSK = (1 << INT3);
4
    EIFR = (1 << INTF3);
5

6
    DDRC &= ~(1 << PC0);
7
    PORTC |= (1 << PC0);
8
}
Hier die ISR:
1
volatile unsigned int test = 0;
2

3
ISR (EXT_INT3_vect) {
4
test++;
5
}

Und in der main innerhalb der while(..) frage ich die Variable test ab:
1
sei();
2
while(..){
3

4
if(test > 0) {
5
PORTD ^= 1 << PORTD7;
6

7
if(test > 200)
8
    test = 0;
9
}
10
}

Wo mach eich einen Fehler?
Beitrag #4955943 wurde von einem Moderator gelöscht.
Gast #4955954
Lesenswert?

Deine LED ändert sich nicht, da Test immer > 0 ist... es sei denn Test 
ist 0. Es kommt darauf an "was" nicht geht und die Freq. der Interrupts, 
so - sowie PORTD7 noch auf Ausgang geben:
1
sei();
2
...
3
PORTD |= (1<<PD7);
4
...
5
while(..){
6

7
if(test > 0) {
8
PORTD ^= (1<<PD7);
9

10
if(test > 200)
11
    test = 0;
12
}
13
}
Gast #4955956
Lesenswert?

Nachtrag:

Und wenn Test = 0 über "längeren Zeitraum" (tm) ist, dann toggelt sie 
sich zu tote... besser wäre auf jeden Fall:
1
sei();
2
...
3
PORTD |= (1<<PD7);
4
...
5
  while(..)
6
  {
7

8
   if(test > 200)
9
   {
10
    test = 0;
11
    PORTD ^= (1<<PD7);
12
   } 
13
  }
14
}

So wird zummindest das Toggeln auf einmal per 200 Abfragen begrenzt. 
Desweiteren kann man es auch in der ISR direkt zurücksetzen:
1
ISR (EXT_INT3_vect) 
2
{
3
  test++;
4
     if(test > 200)
5
   {
6
    test = 0;
7
    PORTD ^= (1<<PD7);
8
   } 
9
  }
10
}
Gast #4955971
Lesenswert?

Gera schrieb:
> Das hab ich versucht, klappt aber leider auch nicht.

Keiner kennt Dein vollständiges Programm, keiner kennt Deine Schaltung. 
Wie soll Dir dann jemad helfen?

"...klappt leider auch nicht." sagt auch nicht unbedingt jedem, was denn 
nicht "klappt".

Werde präziser und Dir kann ggf. geholfen werden.
Gast #4955990
Lesenswert?

Ich drössel mal auf:
1
void Init_ExternerInterrupt(void) {
2

3
    // Any logical change on INT3 generates an interrupt request.
4
    EICRA = (1 << ISC30); 
5

6
    // External Interrupt Request 3 Enable, 
7
    // ?? ist im DB als "Read Only" deklariert ??
8
    EIMSK = (1 << INT3);
9

10
    // Brauchst du nicht, das dies das Flag Register ist.
11
    EIFR = (1 << INTF3);
12

13
    // PC0 (INT3) auf Eingang
14
    DDRC &= ~(1 << PC0);
15
}
16

17
// Global Int. enabled
18
sei();

Dürfte alles passen. Aber kann mir mal jemand erklären warum INT3:2 nur 
auf Read steht und INT1:0 auf Read/Write? Finde dazu keine Infos?!
Angehängte Dateien:
Gast #4956024
Lesenswert?

DraconiX schrieb:
> Dürfte alles passen. Aber kann mir mal jemand erklären warum INT3:2 nur
> auf Read steht und INT1:0 auf Read/Write? Finde dazu keine Infos?!

In meinem ists Read/Write, hast bestimmt ein älteres DB.

Dieter F. schrieb:
> Was genau hast Du an "Schaltung" und "komplettes Programm" nicht
> verstanden?

Die Schaltung wofür? Ich habe wie gesagt einfach den Pin wie im Layout 
zu sehen rausgeführt. Da sieht man in der Schaltung eine Verbindung zu 
einem connector.

Komplettes Programm ist recht unhandlich, da ich nicht nur das darin 
stehen habe. Daher nur Schnippsel.

Dietrich L. schrieb:
> @Gera:
> Ist PORTD7 für Dich das Kriterium, dass der Interrupt stattgefunden hat?
>
> Ich habe in den gezeigten Programm-Fragmenten noch nichts gefunden, wo
> PORTD7 auf "Ausgang" eingestellt wird....

Erstmal ja. Das toggeln des Pins klappt. Steht korrekt auf Ausgang.

Dieter F. schrieb:
> Schön, wenn der PIN mittels Pullup auf high gehalten wird

??

Dieter F. schrieb:
> wird das nur wenig bewirken.

Habe ich wie schon empfohlen raus genommen.

Dietrich L. schrieb:
> Gibt es dort auch einen Pulldown-Widerstand? Sonst ist das Verhalten
> undefiniert, denn ein offener Eingang ist sehr hochohmig und kann
> unbeschaltet jeden Zustand annehmen!

Nein, teste ich.
Gast #4956033
Lesenswert?

Gera schrieb:
> DraconiX schrieb:
>> Dürfte alles passen. Aber kann mir mal jemand erklären warum INT3:2 nur
>> auf Read steht und INT1:0 auf Read/Write? Finde dazu keine Infos?!
>
> In meinem ists Read/Write, hast bestimmt ein älteres DB.
>

Hmm... ist das aktuelle vom Atmel Server, die Version 7647O-AVR-01/15.

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