Hi, wenn einer Zeit hat kann er sich bitte mal den Code ankucken. Bin beim lernen wie man mit Interrupts umgeht am LPC2148 und dem hier angebotenen Olimex board. Problem: beim setzen eines Breakpoints in der ISR wird nie da hingesprungen. Hab irgendwas von startupfiles gelesen das man darauf achten soll was da eingetragen ist. Versteh diese aber nur geringfügig. hab auch versucht wie in einigesn example- codes mit void fnEXT2_ISR(void) __isr; zu arbeiten. Meine Entwicklungsumgebung ist Crossworks for ARM und das kennt dies anscheinend nicht :-(. Arbeite mit keinen vorgegebenen Headern da ich keine kenne. Kann mit einer weiterhelfen??? danke <CODE> #define VIC_EINT2 16 void fnInterruptInit(void) { VICIntEnClr = 0xFFFFFFFF; //alle Interrupts löschen VICIntSelect = 0x00000000; //Bestimmt ob IRQ = 0 oder FIQ = 1 //hier alle IRQ //---------------------------------------------------------------------- ---- //VICVectAddrX = .... speichert die Sprungstelle für die entsprechende ISR (code/ram adresse) //VICVectCntX = ..... bestimmt die Priorität der ausgewählten ISR //---------------------------------------------------------------------- ---- VICVectCntl0 = (1<<5) | VIC_EINT2; // Slot enablen /IRQ's VICVectAddr0 = (unsigned int) fnEXT2_ISR; EXTMODE = 0x04; //EINT2 = Flankengesteuert EXTPOLAR = 0x00; //fallende Flanke PINSEL0 = 0x80000000; //PIN 0.15 ist //Eingangspin für EINT2 EXTINT = (0 << 2); //Flag zurücksetzen VICIntEnable = (1 << VIC_EINT2); //Enabeln der benötigten //Interrupts //hier EINT2 enable //(Button1) } //--------------------------------------------------------------- //ISR //--------------------------------------------------------------- void _attribute_ ((interrupt("IRQ"))) fnEXT2_ISR(void) { u8Modus = ~u8Modus; if (u8Modus == 0x00) { fnLED1ON(); fnLED2OFF(); } else { fnLED1OFF(); fnLED2ON(); } EXTINT = (0 << 2); //Flag zurücksetzen } </CODE>
Hallo Franjo, ich fang ebenfalls gerade mit dem LPC 2148 an. Ein paar Punkte fallen mir dazu auf: EXTINT = (0 << 2); //Flag zurücksetzen -> 0<<2 ist immer noch 0 ich nehme an du meinst: EXTINT = (1 << 2); //Flag zurücksetzen u8Modus = ~u8Modus; if (u8Modus == 0x00) ... Wird u8Modus im Hauptprogramm mit "0" initialisiert ? Sonst wirds Probleme beim Vergleich ==0x00 geben. Vielleicht hilfts ja ein bisschen. Gruß Thomas
Ausserdem muss man am Ende der Interrupt-Routine dem VIC einen Tritt geben, indem man in ein Register 0 reinschreibt (ich habe grad nicht parat in welches).
Erstmal danke für die Antworten. Probier dies noch heut abend nach der Schule zuhause aus und poste dann obs Erfolg hatte. Cya
Hallo Franjo, ich mach das Rücksetzten mit: VICVectAddr = 0; /* Acknowledge Interrupt */ und das tut (zumindest beim Timer0) viel SPaß und die besten Grüße Thomas
Hi, hab den Versuch nun mit 2 Timern probiert und festgestellt das es bei mir verdammt wichtig ist das VICVectAddr = 0; /* Acknowledge Interrupt */ auch nach der Initialisierung (vor dem start) der Interrupts durchzuführen. Komisch ist für mich die Syntax beim Rücksetzen des externen Interrupts bsp. EXIT &= ~(0x04);
sorry bin zufällig auf posten gegangen also (1)EXTINT &= ~(0x04); //Flag zurücksetzen aber das tut er nicht sondern nur bei (2)EXTINT = 0x04; //Disassembly----------------- mov r3,#0x00000FC0 add r3, r3, #0x001FC000 add r3, r3, #0x00000140 mov r2,#0x00000004 strb r2,[r3] aber beim betrachten des Registers wird er nach der routine (2) EXTINT rückgesetzt ^^ naja es klappt trotzdem bloß ne erklärung währe nicht schlecht.
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.