Forum: Mikrocontroller und Digitale Elektronik INTERRUPT 0 MEGA 2561


von Paul (Gast)


Lesenswert?

Hallo

Ich habe hier mal einen Code geschrieben für den INT0

void init_int0(void)
{

EICRA=0x00;
EIMSK=(1<<INT0);
}

EICRA=0; //alle INTERRUPT bei low(von heigh zu low);
EIMSK=INT0; Interrupt für int0

Leider bootet der mega mit dieser einstellung immer neu.

Ist die Initialisierung richtig???

Danke

von spess53 (Gast)


Lesenswert?

Hi

>Leider bootet der mega mit dieser einstellung immer neu.

Hast du auch eine Interruptroutine?

MfG spess

von Paul (Gast)


Lesenswert?

Hallo

Ja.

ISR(INT0_vect)
{
  tCAN message;
  cli();

  set_LED(1);
  spi_init();

  if (can_get_message(&message))
    {
      can_message_values(&message);
    }
    else
    {
    }


  clear_LED(1);



sei();
}


der Fehler muß bei EIMSK=(1<<INT0);
liegen.

Der MCP CAN Controller hat einen Interrupt ausgang (wenn Daten im Buffer 
dann zieht er den ausgang auf low)
Der Mega 2561 ist an INT0 (Port D0) mit dem MCP INT Ausgang verbunden.
Ich hatte vorher in der main die abfrage des Pins nur sind mir etliche 
CAN Frames dadurch verschwunden (Prozessor zu langsam) daher will ich es 
mit Int0 probieren er soll auslösen wenn Pegel von 1 auf 0.

Danke

von spess53 (Gast)


Lesenswert?

Hi

>der Fehler muß bei EIMSK=(1<<INT0);
>liegen.

Nein, das passt schon.

Allerdings ist hier der Kommentar (und wahrscheinlich auch deine 
Vorstellung) falsch:

>EICRA=0; //alle INTERRUPT bei low(von heigh zu low);

ISCn1:ISCn0= 00 erzeugt Interrupts solange Low Level anliegt.

MfG spess

von Paul (Gast)


Lesenswert?

Hallo

Ja ich habe das register geändert:

EICRA=(1<<ISC01);//Falling edge
EIMSK=(1<<INT0);

Der Mega bootet jetzt nicht mehr habe auch noch den PIN D0(INT0) als 
eingang und Pullup.

#define SET_CAN_INT()  DDRD&=~(1<<0);
#define SET_CAN_INT_PULL()  PORTD |= (1<<0);

und dann initialisiert.

Nur löst kein Interrupt aus.
obwohl die Pegel wechseln high low heigh low.

Danke

von Thomas B. (nichtessbar)


Lesenswert?

sei();

aufgerufen bevor du den ersten Interrupt erwartest? Evtl. direkt in der 
init-Funktion machen

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.