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
Hi
>Leider bootet der mega mit dieser einstellung immer neu.
Hast du auch eine Interruptroutine?
MfG spess
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.