INTERRUPT 0 MEGA 2561

Gast #2521840
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
Gast #2521850
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
Gast #2521860
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
Gast #2521864
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren