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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.