Forum: Mikrocontroller und Digitale Elektronik Externer Interrupt


von Gera (Gast)


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.
von Arduinoquäler (Gast)


Lesenswert?

Gera schrieb:
> Versuche einen Externen Interrupt zu nutzen, klappt aber nicht.

Gera schrieb:
> Wo mach eich einen Fehler?

Es fehlt die Beschreibung der Fehlersymptome.
"klappt aber nicht" gilt nicht.

von Dieter F. (Gast)


Lesenswert?

Init_ExternerInterrupt nicht aufgerufen, nur Fragmente des Programms 
gezeigt, Schaltung geheim ..., Fehlermeldungen / Warnungen des Compilers 
nicht beachtet, ...

von DraconiX (Gast)


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
}

von DraconiX (Gast)


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
}

von Oliver S. (oliverso)


Lesenswert?

Ich werfe mal ein volatile in die Runde. Dazu wird die LED, wenn test 
dann mal hochzählt, ziemlich schnell blinken.

Oliver

: Bearbeitet durch User
von DraconiX (Gast)


Lesenswert?

Oliver S. schrieb:
> Ich werfe mal ein volatile in die Runde.

Hatte ja, in seinem Snippet Sammelsurium ist das über der ISR vermerkt.

von Gera (Gast)


Lesenswert?

DraconiX schrieb:
> ISR (EXT_INT3_vect)
> {
>   test++;
>      if(test > 200)
>    {
>     test = 0;
>     PORTD ^= (1<<PD7);
>    }
>   }
> }

Das hab ich versucht, klappt aber leider auch nicht.

Mir ging es jetzt erstmal darum, ob jemand einen Fehler in der Interrupt 
Init findet.

von Dieter F. (Gast)


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.

von Dieter F. (Gast)


Lesenswert?

Gera schrieb:
> Mir ging es jetzt erstmal darum, ob jemand einen Fehler in der Interrupt
> Init findet.

Grundsätzlich nein - der PIN/INT3 reagiert selbst dann, wenn der Port 
als Ausgang definiert ist. Nochmal: Wie sieht denn die Schaltung aus?

von DraconiX (Gast)


Angehängte Dateien:

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?!

von Gera (Gast)


Angehängte Dateien:

Lesenswert?

Dieter F. schrieb:
> Grundsätzlich nein - der PIN/INT3 reagiert selbst dann, wenn der Port
> als Ausgang definiert ist. Nochmal: Wie sieht denn die Schaltung aus?

Ich habe einfach PIN 30 mit nem kabel an 5V gehalten.

von Dieter F. (Gast)


Lesenswert?

Gera schrieb:
> Ich habe einfach PIN 30 mit nem kabel an 5V gehalten.

Was genau hast Du an "Schaltung" und "komplettes Programm" nicht 
verstanden?

von Dietrich L. (dietrichl)


Lesenswert?

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

von Dieter F. (Gast)


Lesenswert?

Gera schrieb:
> Ich habe einfach PIN 30 mit nem kabel an 5V gehalten

Schön, wenn der PIN mittels Pullup auf high gehalten wird

Gera schrieb:
> PORTC |= (1 << PC0)

wird das nur wenig bewirken.

Schaltung, komplettes Program ...

von Dietrich L. (dietrichl)


Lesenswert?

Gera schrieb:
> Ich habe einfach PIN 30 mit nem kabel an 5V gehalten.

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!

von Gera (Gast)


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.

von Dieter F. (Gast)


Lesenswert?

Gera schrieb:
> Die Schaltung wofür?

Tust Du nur so? Hast ein Layout aber keine Schaltung?

Viel Spaß noch.

Gera schrieb:
> Da sieht man in der Schaltung eine Verbindung zu
> einem connector.

Den Unterschied zwischen Schaltung/Schaltplan und Layout kennst Du?

von DraconiX (Gast)


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.

von Gera (Gast)



Lesenswert?

Im Anhang.. auch der Schaltplan ... tut mir leid, habe beim routen etwas 
mehr umbauen müssen :)

Datenblatt auch im Anhang.

von Gera (Gast)


Angehängte Dateien:

Lesenswert?

Mit Anhang...

von S. Landolt (Gast)


Lesenswert?

Der Vektor heißt wirklich EXT_INT3_vect?

von Dieter F. (Gast)


Lesenswert?

S. Landolt schrieb:
> Der Vektor heißt wirklich EXT_INT3_vect?

Das checkt der Compiler - dessen Meldungen uns nicht bekannt sind ...

von Gera (Gast)


Lesenswert?

S. Landolt schrieb:
> Der Vektor heißt wirklich EXT_INT3_vect?

Perfekt. Das wars. Danke!

So habe ich mir das im übrigen vorgestellt...

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.