einfache interrupt-schaltung

Gast #4639681
Hallo, kann mir bitte bitte jemand helfen bei diesem Code den Fehler zu 
finden. Ich will einfach nur mit einem Taster an PB3 (ext. 
Pullupwiderstand) eine LED an PB3 einschalten über einen Interrupt. 
(Atmega32). Taster und LED funktionieren einwandfrei aber sobald ich mit 
Interrupts hantieren möchte läuft Garnichts mehr. (INT2).

#define LED 3
#define Taster 2
#include <avr/interrupt.h>





void init_int2(void)
{

  MCUCSR |= (1<<ISC2);
  GICR  |= (1 << INT2);  //INT2 enable

}



int main(void)
{

 DDRB = 0b00001000;


 sei();

 Init_Timer();

 //InitDisplay();

 while(1)
  {

       PORTB &=~ (1<<LED);

  }
}

ISR (INT2_vect)

{
  while (1)
  {
  PORTB |= (1<<LED);
  }
}
Gast
Dann gilt noch,

Taster und INTx passen i.A. nicht zusammen !
Verwende eine Tastenentprellung per Timerpoll alle z.B. 10ms.

So etwas ist nicht wartbar und bringt Fehler mit sich.
1
DDRB = 0b00001000;

Generell müssen digitale Eingang auch als solche in einen Programm 
sichtbar sein und man muss auf korrekte Pegel low/ high achten.

Standard Taster schalten nur zwei Pins, d.h. an einem Eingang wird 
dieser mit Masse verbunden.
Sonst ist der digitale Wert des Eingangs unbestimmt.
Gast
Timo N. schrieb:
> Endlosschleife (while(1)) in ISR-Routine = böse

Ja ich weiß, ist ja nur zum testen ob der Interrupt überhaupt auslöst.

#include <avr/io.h> ist vorhanden. Habs beim rüberkopieren nur 
vergessen.

"Wo ist die init_timer?" --> in einer extra c-Datei.

Das mit dem entprellen werd ich gleich mal versuchen.
Gast
Karl M. schrieb:
> Generell müssen digitale Eingang auch als solche in einen Programm
> sichtbar sein und man muss auf korrekte Pegel low/ high achten.
>
> Standard Taster schalten nur zwei Pins, d.h. an einem Eingang wird
> dieser mit Masse verbunden.
> Sonst ist der digitale Wert des Eingangs unbestimmt.

Durch den Pullupwiderstand hab ich doch definierte Pegel. Taster offen 
--> 5V, Taster gedrückt --> 0V. Das müsste passen. Aber wird einfach 
kein Interrupt ausgelöst.
HansDampf schrieb:
> NurEinGast schrieb:
>> Kann es sein, dass init_int2 nicht augerufen wird.
>
> Ja irgendwie kommt es mir auch so vor. Beim Simulator springt er auch
> direkt in die while-schleife. Aber woran liegt das??

Du musst init_int2 in main() schon selber aufrufen. Von alleine denkt 
sich der Compiler das nicht dazu. Das ist nicht Arduino ;-(

Edit: jetzt bin ich der Dritte, aber sicher ist sicher ;-)
Gast
Leute ihr seit der hammer. Vielen Dank. init_int2();--> genau das wars. 
Musste nur noch einen kleinen delay einbauen damit der Taster nicht 
schon beim "hochfahren" abgefragt wird und schon läuft es. Deswegen auch 
Eigenbau-Platine und kein Arduino denn nur so lernt mans halt. Jetzt 
kann ich endlich weiter basteln da ich weiß dass mein int2 funktioniert. 
Danke noch mal an alle.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 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.