Forum: Compiler & IDEs externer Interrupt und Port-Eingänge


von Thomas (Gast)


Lesenswert?

Halli hallo an Alle!

Habe mich heute mal an dem externen Interrupt INT0 versucht. Bin zwar
zu einem Ergebnis gekommen, aber so richtig verstanden habe ich das
noch nicht.

Verwende folgenden Code:

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#define F_CPU            3680000      /* 3,68Mhz */

/*
**  module global variables (note: global variables are automatically
initialized to zero)
*/
static volatile uint8_t led;     // use volatile when variable is
accessed from interrupts


/*
** functions
*/

SIGNAL(SIG_INTERRUPT0)
/* signal handler for external interrupt int0 */
{
    led++;
    PORTB = ~led;
}


int main(void)
{
    DDRB  = 0xff;                // use all pins on PortB for output
    PORTB = 0xff;                // and turn off all LEDs

    DDRD  = 0x00;                // use all pins on port D for input
    PORTD = 0xff;                // activate internal pull-up

    outp((1<<INT0), GIMSK);           // enable external int0
    outp((1<<ISC01)|(0<<ISC00) , MCUCR);      // falling egde: int0

    sei();                       // enable interrupts

    for (;;) {}                  // loop forever
}


Ich habe einen ATmega16 und ein STK500. Der Interrupt wird leider nur
ausgelößt, wenn ich den Taster2 drücke. Wieso wird der Interrupt nicht
bei den anderen ausgelöst?

Habe das auch mal mit einem anderen Programm getestet. Da war Port B
der Eingang...und gar nichts passierte.

Wie verhält sich das mit den Eingangsports und den Interrupts? Muss man
denn noch speziell angeben, auf welchem Port/Pin der Interrupt zu
erwarten ist? Oder geht es nicht mit jedem Port?

Bin sehr dankbar für jeden guten Hinweis,

Ciao Thomas

von Stefan Kleinwort (Gast)


Lesenswert?

Der Int0 wird nur mit einem Signal am entsprechenden Pin (mega16: PD.2)
ausgelöst. Du kannst diesen IR mit keinem anderen Pin auslösen.

Int1 gibt es auch noch, an PD.3.

Was Du (glaube ich) meinst, ist ein Pin-On-Change-Interrupt, den gibt
es bei manchen Controllern. Da wird ein ganzer Port (8 Pins) abgefragt.
Bei der mega-Serie gibt es das beim mega88, wenn der jemals fertig wird
...

Stefan

von Thomas (Gast)


Lesenswert?

Hi Stefan!

danke für die schnelle Info. Das reicht mir schon. Ich dachte nur an
meinem Programm hat was nicht hingehauen. Wieso findet man das nicht im
Datenblatt und Externer Interrupt??? Nun gut, dann werde ich mein
Eingangssignal einfach auf PD.2 legen und alles ist,okay.

Ciao Thomas

von Stefan Kleinwort (Gast)


Lesenswert?

Steht doch da:
"the external interrupts are triggered by the INT0, INT1, and INT2
pins"

Sprich: den INT2 habe ich Dir ganz unterschlagen. Der ist auf PB.2.

Stefan

von Thomas (Gast)


Lesenswert?

hm, das steht schon da. Da habe ich das immer falsch verstanden. ich
dachte immer int0,1,2 sind die interrupts die man anschalten kann. aber
habe gerade  nochmal bei der PINConfig. geschaut...da sieht man es ja
auch sehr deutlich...

also vielen Dank nochmal!

Ciao Thomas

von M. de Beyer (Gast)


Lesenswert?

@Thomas,

denk daran, daß der Interrupt auch ausgelöst wird, wenn du den PortPin
als Ausgang deklariert hast und du den Pin togglen läßt.

Michael

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.