Externer Interrupt

Gast #4955934
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 #4955951
Init_ExternerInterrupt nicht aufgerufen, nur Fragmente des Programms 
gezeigt, Schaltung geheim ..., Fehlermeldungen / Warnungen des Compilers 
nicht beachtet, ...
Gast #4955954
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
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 #4955966
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.
Gast #4955971
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 #4955975
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?
Gast #4955990
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
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.