Forum: Mikrocontroller und Digitale Elektronik einfache interrupt-schaltung


von HansDampf (Gast)


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);
  }
}

von HansDampf (Gast)


Lesenswert?

Taster ist natürlich an PB2, sorry.

von Timo N. (tnn85)


Lesenswert?

Endlosschleife (while(1)) in ISR-Routine = böse

von Karl M. (Gast)


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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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

und bitte noch
1
#include <avr/io.h>

von A. D. (egsler)


Lesenswert?

Wo ist die init_timer?

von HansDampf (Gast)


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.

von HansDampf (Gast)


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.

von NurEinGast (Gast)


Lesenswert?

Kann es sein, dass init_int2 nicht augerufen wird.

von Dominik B. (odysseus1710)


Lesenswert?

HansDampf schrieb:
> PORTB |= (1<<LED);

Damit änderst du den Zustand der LED höchstens einmal.

Wenn du toggeln möchstest:

PORTB ^= (1<<LED);

Vermutlich wird deine ISR aufgerufen, aber du bekommst es nie mit ;)

von HansDampf (Gast)


Lesenswert?

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

von NurEinGast (Gast)


Lesenswert?

>  Aber woran liegt das??

Na ja - daran, dass Du sie nicht aufrufst.

von NurEinGast (Gast)


Lesenswert?

int main(void)
{

    DDRB = 0b00001000;
    init_int2();
    sei();
....

von Dietrich L. (dietrichl)


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 ;-)

: Bearbeitet durch User
von HansDampf (Gast)


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.

von NurEinGast (Gast)


Lesenswert?

Viel Spaß noch .....

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.