Witam!!
Tak, to kolejne pytnie pod tytułem "coś nie działa", ale tym razem będzie chyba trochę prościej - bo przerwanie DZIAŁA, jeśli wykorzystuję je jako szybkie (FIQ), a w wersji normalnej (IRQ) nie działa - procesor się resetuje.... Pomijając zbędne fragmenty wkleiłem kod poniżej... jeśli w komentarzach są jakiś instrukcje, to znaczy, że są one dla trybu FIQ... po zastąpieniu instrukcji tymi z komentarza program zaczyna działać ;)...
PINSEL4 &= ~(3<<26); PINSEL4 |= (1<<26); EXTMODE |= 0x08; EXTPOLAR &= ~0x08; EXTINT = 0x08; VICIntSelect = 0; // VICIntSelect = 1<<EINT3_INT; VICVectAddr17 = (unsigned int) FIQ_Routine; VICVectCntl17 = LOWEST_PRIORITY; VICIntEnable = 1<<EINT3_INT;
enable_irq(); // enable_fiq();
// endless loop to toggle the red LED P0.1 while (1) { FIO0SET = 1; Waitms (250); FIO0CLR = 1; Waitms (250); } }
void IRQ_Routine (void) { short k; for (k=0;k<5;k++) { FIO0SET = 1; Waitms (75); FIO0CLR = 1; Waitms (75); } EXTINT = 0x08; VICVectAddr = 0; }
void FIQ_Routine (void) { short i; for (i=0;i<5;i++) { FIO0SET = 1; Waitms (75); FIO0CLR = 1; Waitms (75); } EXTINT = 0x08; }
Pewnie robię jakiś głupi błąd albo coś... bo zarówno program jak i procedura obsługi przerwania muszą być poprawne (skoro w trybie FIQ działa). Stos dla IRQ i FIQ oczywiście zdeklarowany, w obu przypadkach na 128 bajtów... Nie wiem, co jeszcze może być źle... uczę się tego dopiero i coś kiepsko mi to idzie :(... Mam książkę do LPCków, ale tam są te starsze modele, w których jest 16 kanałów przerwania i 32 źródła przerwania, tam się przypisuje danemu kanałowi numer przerwania itp... sprawdzałem - taką metodą też nie działa ;)....
Pozdrawiam Konoppo