Problem bei Interrupt-Steuerung

OP #3342703
Lesenswert?

Hallo zusammen!

ich habe ein Problem bei meiner einfachen Interrupt-steuerung.
ich progrmmiere das erste mal mit Interrups d.h ich komme auch auf die 
einfachsten Fehler nicht drauf.
1
#include <avr/io.h>
2
#define F_CPU 36864000UL
3
#include <avr/interrupt.h>
4
#include <util//delay.h>
5
#include "lcd.h"
6

7
#define INT1_vect              _VECTOR(2)
8
#define SIG_INTERRUPT1         _VECTOR(2)
9

10

11

12
int main(void)
13
{  
14
    MCUCR |= (1<<ISC11); //  bei fallender Flanke 
15
    GIMSK |= (1<<INT1);
16
  
17
   sei();
18
  
19
  
20
  while(1)
21
    {
22
     PORTB = 0x02;
23
   
24
   if (PIND & (1<<PD3))
25
   {
26
    
27
     
28
    
29
   }
30
    }
31
}
32

33
ISR (INT1_vect)
34
{
35
  PORTB = 0x01;;
36
}
Wenn eine Taste am Pin INT1 gerdrückt wird soll ein Interrupt ausgelöst 
werden und den Ersten Pin vom PORTB einschalten.
Was mach ich nur falsch ????
#3342722
Lesenswert?

Tei versucht dich ja schon in die Richtung zu drängen, in der du 
kapierst, dass du eine Mykrosekunden lange eingeschaltete LED an einem 
Ausgang eher schlcht sehen wirst

Abgesehen davon:
Es könnte hilfreich sein, wenn man dann auch noch den Ausgangspin 
tatsächlich auch mittels DDRB Register auf Ausgang programmiert.
OP #3342755
Lesenswert?

hab bei dem Programm jetzt die Fehler ausgebessert aber wenn ich die 
Taste drücke Passiert genua nicht.
1
#include <avr/io.h>
2
#define F_CPU 3686400UL
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5
#include "lcd.h"
6

7

8

9

10
int main(void)
11
{ 
12
  MCUCR |= (1<<ISC11);
13
  GIMSK |= (1<<INT1);
14
  DDRD  &= (1<<PD3);
15
  DDRB  |= (1<<PB1) | (1<<PB0);
16
  
17
   sei();
18
  
19
  
20
  while(1)
21
    {
22
    PORTB |= (1<<PB1);
23
    if (PIND & (1<<PD3))
24
    {
25
    
26
    }
27
  
28
   
29
    } _delay_ms(30);
30
}
31

32
ISR (_VECTOR(1))
33
{
34
  PORTB = 0x01;;
35
}
#3342762
Lesenswert?

2 Problemkreise

* wie ist der Taster angeschlossen?
  Brauchst du einen Pullup?

* Nein
1
ISR (_VECTOR(1))
Atmel hat keine Kosten und Mühen gescheut, dir die Namen der Interrupt 
Vektoren durch die Header Files zur Verfügung zu stellen. Benutze sie 
auch!
1
ISR( INT1_vect )
2
{
3
  ...
4
}
ist doch nicht so schwer. Und ja, den Namen gibt es für dich zur 
Verwendung. Deshalb hast du ja einen
1
#include <avr/io.h>
gemacht!
Gast #3342792
Lesenswert?

>ich habe den taste einfach an der einen seite auf +5V hängen und die
>andre seite auf dem INT1 pin

Dann brauchst du einen Pulldown Widerstand.

Das _delay_ms(30);
hinter der while(1) bewirkt übrigends gar nichts.
#3342795
Lesenswert?

Daniel L. schrieb:
> ich habe den taste einfach an der einen seite auf +5V hängen und die
> andre seite auf dem INT1 pin


Aha.
Und wie stellst du dir da jetzt vor, dass du jemals eine fallende Flanke 
kriegen wirst.
Hinweis: Ein offener Pin, an dem nichts hängt, hat NICHT 
notwendigerweise einen 0 Pegel. Der hat irgendeinen Pegel. Kommt drauf 
an wieviele und welche elektrische Felder in der Nähe rumgammeln, die 
sich der Pin (der jetzt als Antenne wirkt) einfängt.

Ein Taster wird angehängt, indem man den Taster gegen GND schaltet und 
per Programm den Pullup dazuschaltet. Ein nicht gedrückter Taster 
liefert dann eine saubere 1, ein gedrückter Taster eine saubere 0. Und 
oh Wunder, da ist sie dann auch: die fallende Flanke (der Wechsel von 1 
auf 0) wenn man auf den Taster drückt.

Denkst du nicht, dass es vernünftig wäre, wenn du erst mal die einfachen 
Basics machst und die beherrscht, ehe du dich an Interrupts wagst? Einen 
Taster anhängen IST eine Grundtechnik.

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