Forum: Mikrocontroller und Digitale Elektronik External Interrupt Request mit ATtiny26


von sixafeud (Gast)


Lesenswert?

Hallo zusammen,

Ich versuche erfolglos ein external interrupt request mit ATtiny26 zu 
programmieren, deswegen wende ich mich euch, damit ihr mir weiterhelfen 
könnten.

Das Programm soll einfach drei LEDs anschalten sobald eine Taste am Pin 
PB6 gedrückt wird. ( code siehe unten

Nachdem ich das Programm kompilieren kommt die Wahrnung: Warning  1 
'EXT_INT0' appears to be a misspelled signal handler

Könnte jemanden mir da helfen bitte!!
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
5
6
ISR(EXT_INT0)
7
{    
8
  PORTA = 0b00111000;   // LED on
9
  
10
}
11
12
#include <avr/io.h>
13
14
int main(void)
15
{   DDRA = 0b00111000;
16
  DDRB &= ~(1<<PB6);
17
  
18
  GIMSK |= (1<<INT0);  //external interrupt request enable
19
  MCUSR |= ((1<<ISC01)|(1<<ISC00)); // trigger an interrupt by rising edge on pin INT0
20
  sei();            // Timer/counter global interrupt enable
21
  
22
    while(1)
23
    {  
24
        
25
    }
26
}

Sixafeud

von Thomas E. (thomase)


Lesenswert?

sixafeud schrieb:
> Nachdem ich das Programm kompilieren kommt die Wahrnung: Warning  1
> 'EXT_INT0' appears to be a misspelled signal handler

Es heisst ISR(INT0_vect)

von sixafeud (Gast)


Lesenswert?

Danke Thomas für die schnell Antwort,

ISR(INT0_vect) habe ich ausprobiert funktioniert nicht richtig. Die LEDs 
sind sofort angeschaltet ohne, dass ich die Taste gedrückt habe. Das 
möchte ich aber nicht.
Danke im vorraus für weitere Vorschläge

sixafeud

von Michael U. (amiga)


Lesenswert?

Hallo,

ist die Fehlermeldung weg? Ja, also ist dieser Fehler behoben.
Deine LEDs gehen an, also scheint das Programm erstmal zu laufen.

Dein Taster ist wie angeschlossen?
Ich sehe kein Einschalten des PullUp für PB6 in Deinem Code.
Hast Du einen externen dran?
Wenn nicht, ist der offene Taster ein offener PIN PB6 wenn der Taster 
nicht gedrückt ist.
Dann kann jedes Störfeld in der Nähe eine steigende Flanke erugen und 
den Interrupt auslösen...

Gruß aus Berlin
Michael

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

> Die LEDs sind sofort angeschaltet
Und das, obwohl es MCUCR statt MCUSR heißen muss? Seltsam.

von Thomas E. (thomase)


Lesenswert?

S. Landolt schrieb:
> Und das, obwohl es MCUCR statt MCUSR heißen muss? Seltsam.

Gar nicht seltsam.

Dadurch steht der Interrupt Sense nach wie vor auf Low Level. Da kein 
Pullup geschaltet ist, wird der offene Eingang zufällig als 0 erkannt 
und der IRQ ausgelöst.

mfg.

von S. Landolt (Gast)


Lesenswert?

Klingt pausibel.
Zwischenzeitlich dachte ich, die LEDs seien an GND angeschlossen.

von Thomas E. (thomase)


Lesenswert?

S. Landolt schrieb:
> Zwischenzeitlich dachte ich, die LEDs seien an GND angeschlossen.

Das sind sie auch. Zumindest sollten sie das, damit sie mit den 3 Einsen 
eingeschaltet werden.

Was mir allerdings gerade noch auffällt:

sixafeud schrieb:
> MCUSR |= ((1<<ISC01)|(1<<ISC00)); // trigger an interrupt by rising
> edge on pin INT0

Das setzt voraus, dass der Taster an Vcc liegt oder beim Loslassen 
schaltet, wenn er, wie es sich gehört, an GND liegt. Und natürlich 
entsprechend über einen Pulldown bzw. Pullup verfügen muss.

Na, warten wir mal ab. Vielleicht kommt ja noch was vom TO.

mfg.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Auwei, da hatte ich schon wieder nicht zu Ende gedacht.
Okay, warten wir mal ab.

von sixafeud (Gast)


Angehängte Dateien:

Lesenswert?

Ersmal danke schön für die Vorschläge,

Michael U. schrieb:
>>Dein Taster ist wie angeschlossen?
>>Ich sehe kein Einschalten des PullUp für PB6 in Deinem Code.
>>Hast Du einen externen dran?

Der Pulldown Widerstand hatte nicht gebaut .Jetzt habe ich ihn in der 
Sofware implementiert (ein Bild des Tasters habe ich angehängt). Leider 
gehen die LEDs immer sofort an. Wenn ich sie aber mit dem Befehl 
PINB&(1<<PB6) steuere dann funktionniert das (dies ist aber nicht das 
Ziel).

Wo könnte das Problem wirklich liegen. Schon habe ich den ganzen Tag 
dabei verbracht.

Bitte Hilfe!!

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
5
6
ISR( INT0_vect)
7
{    
8
  PORTA = 0b00111000;   // LED on
9
  
10
}
11
12
13
14
int main(void)
15
{   DDRA = 0b00111000;
16
  DDRB &= ~(1<<PB6);
17
  PORTB &= ~(1<<PB6);
18
  
19
  GIMSK |= (1<<INT0);  //external interrupt request enable
20
  MCUSR |= ((1<<ISC01)|(1<<ISC00)); // trigger an interrupt by rising edge on pin INT0
21
  sei();            // Timer/counter global interrupt enable
22
  
23
    while(1)
24
    {  
25
        
26
    }
27
}

von Peter D. (peda)


Lesenswert?

sixafeud schrieb:
> Der Pulldown Widerstand hatte nicht gebaut .Jetzt habe ich ihn in der
> Sofware implementiert

Interessant, der AVR hat aber keine internen Pulldowns.

von Thomas E. (thomase)


Lesenswert?

sixafeud schrieb:
> Wo könnte das Problem wirklich liegen.

Da: MCUSR |= ((1<<ISC01)|(1<<ISC00));

Das Register heisst MCUCR.

Und da:

Schalte deinen Taster mit einer einer Seite an GND und aktiviere den 
Pullup im AVR. Einen Pulldown gibt es nicht. Den musst du extern 
dranlöten.

mfg.

: Bearbeitet durch User
von sixafeud (Gast)


Lesenswert?

Hi alle zusammen,

Erstmal vielen dank für alle Vorschläge, es hat funktionniert und das 
Problem lag genau da.

 Thomas Eckmann schrieb:
>> Da: MCUSR |= ((1<<ISC01)|(1<<ISC00));

>> Das Register heisst MCUCR.


 nochmal danke   Thomas Eckmann

MFG
Sixafeud

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.