externer Interrupt und Port-Eingänge

Gast #100451
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
Gast #100452
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
Gast #100453
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
Gast #100454
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
Gast #100455
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
Gast #100456
@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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.