einfache interrupt-schaltung

Gast #4639681
Lesenswert?

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 #4639728
Lesenswert?

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 #4640218
Lesenswert?

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 #4640223
Lesenswert?

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.
#4640265
Lesenswert?

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 #4640273
Lesenswert?

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

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