Forum: Mikrocontroller und Digitale Elektronik Problem bei Interrupt-Steuerung


von Daniel L. (daniel_l49)


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

von falsch (Gast)


Lesenswert?

Daniel L. schrieb:
> Was mach ich nur falsch ????

was wird denn wohl direkt nacht deinem Interrupt-Return passieren?

von Daniel L. (daniel_l49)


Lesenswert?

es setzt bei der Unterbrochenen Stelle wieder ein

ich habe vorhin noch etwas wichtige vergessen.
es kommt eine Fehlermeldung

 attempt to use poisoned "SIG_INTERRUPT1"

von Teo D. (teoderix)


Lesenswert?

Daniel L. schrieb:
> #define F_CPU 36864000UL

Hat zwar nichts mit dem aktuellen Problem zu tun aber s da nich ne Null 
zu viel?

von Teo D. (teoderix)


Lesenswert?

Daniel L. schrieb:
> es setzt bei der Unterbrochenen Stelle wieder ein

Und wie oft mach "ER" das in einer Sekunde?

von falsch (Gast)


Lesenswert?

Daniel L. schrieb:
> es setzt bei der Unterbrochenen Stelle wieder ein

genau!
dies ist dann in der main-loop, in der der Pin dann mit
PORTB = 0x02;
wieder gelöscht wird.

von Daniel L. (daniel_l49)


Lesenswert?

soo ca 3000000 mal

von Karl H. (kbuchegg)


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.

von Daniel L. (daniel_l49)


Lesenswert?

ich kann das programm nicht einmal kompilieren weil eim fehler auftritt 
das ist mein Problem

attempt to use poisoned "SIG_INTERRUPT1"

von Karl H. (kbuchegg)


Lesenswert?

schmeiss diesen ganzen Dreck
1
#define INT1_vect              _VECTOR(2)
2
#define SIG_INTERRUPT1         _VECTOR(2)

raus.
Wozu soll das gut sein, dass du dir die selber definierst?

von Daniel L. (daniel_l49)


Lesenswert?

ahh oke danke ... ohne die Makros funktionierts auf einmal:)

von Karl H. (kbuchegg)


Lesenswert?

Daniel L. schrieb:
> ahh oke danke ... ohne die Makros funktionierts auf einmal:)

Nö, nicht 'ohne die Makros'.
Die Makros gibt es schon mal. Wenn du
#include <avr/io.h>
machst, ziehst du die komplette, für deinen µC passende Belegung rein. 
Und da gehören selbstverständlich entsprechende Makros für die Interrupt 
Vektoren mit dazu.

von Daniel L. (daniel_l49)


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
}

von Karl H. (kbuchegg)


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!

: Bearbeitet durch User
von Daniel L. (daniel_l49)


Lesenswert?

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

von holger (Gast)


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.

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Daniel L. (daniel_l49)


Lesenswert?

oke danke für die Antwort
ich habe schon viel mit Tastern gearbeitet
ich habe das mit der fallenden Flanke nur ein wenig falsch verstanden

von Karl H. (kbuchegg)


Lesenswert?

>
1
>      DDRD  &= (1<<PD3);
2
>

Glück gehabt.
Das ist zwar falsch, wirkt sich aber nicht aus.

von Daniel L. (daniel_l49)


Lesenswert?

was ist hier falsch

von Karl H. (kbuchegg)


Lesenswert?

Wie löscht man denn ein Bit?

(Fehlt da nicht ein klitzekleines ~ )

: Bearbeitet durch User
von Daniel L. (daniel_l49)


Lesenswert?

manchmal frage ich mich warum ich so ein idiot bin

von Teo D. (teoderix)


Lesenswert?

Mal wieder 'n paar Tage ausschlafen (früher ins Bett gehen) :D

von Daniel L. (daniel_l49)


Lesenswert?

Das geht sich bei mir meist nicht aus wenn man fast jeden Tag um halb 
sechs von der Schule heimkommt und dann noch ein bisschen programmieren 
will :/
und dan kommt noch das massenhafte lernen dazu :/

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.