Hallo, ich habe schon viele Projekte erfolgreich auf dem PIC16 und PIC18 hinter mir. Sowohl in Assembler, als auch in C (XC8) bin ich gut damit klar gekommen. Nun möchte ich auf PIC32 umsteigen und gehe mein erstes Projekt mir einem PIC32MX130F256B an (XC32 V1.42) Jetzt verzweifel ich an einer im Grunde primitiven Sache, wo ich schon seit vielen Stunden am Suchen und Forschen bin und einfach nicht mehr weiter weiss: Timer1 läuft und soll beim Erreichen eines bestimmten Wertes einen Interrupt auslösen. In der ISR soll dann eine LED getoggelt werden. Das mit dem Timer funktioniert auch, aber er will einfach nicht die ISR aufrufen. Das ist sowohl im Simulator, als auch auf der Zielhardware so. Auffällig ist, dass, wenn ich in die Datei list.lst auch zu sehen ist, dass die ISR nicht compiliert wurde also in Assembler-Code umgesetzt wurde. Hier mein Source-Code: #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <xc.h> #include "config32MX130F256B.h" #include "PIC32MX130_Test_V101.h" #include <sys/attribs.h> void __ISR_AT_VECTOR(_TIMER_1_VECTOR, IPL7AUTO) Timer1Handler(void); void main(void) { // init PIC init(); LED=0; TMR1 = 0; PR1 = 0x0008; T1CONbits.TCKPS = 1; // Prescaler auf 1:64 T1CONbits.ON = 1; // Timer1 ON INTCON = 0; INTCONbits.MVEC = 1; //Multivector mode: 1 = multi, 0 = single vector IFS0bits.T1IF = 0; //Flag auf 0 setzen IPC1bits.T1IP = 7; //Priority setzen IPC1bits.T1IS = 0; //Subpriority auf 0 IEC0bits.T1IE = 1; // enable timer 1 IRQ __builtin_enable_interrupts(); while(1) { ////////// Timer Test //////// if ( IFS0bits.T1IF==1) //////// { //////// LED = !LED; //////// IFS0bits.T1IF=0; //////// } } void __ISR_AT_VECTOR(_TIMER_1_VECTOR, IPL7AUTO) Timer1Handler(void) CoreTimerHandler(void) { LED = !LED; //LED in ISR toggeln IFS0bits.T1IF = 0; } } Es kann doch nicht so schwer sein. Irgendeiner eine Idee was ich da falsch mache? Mir wäre auch schon geholfen, wenn mir jemand mal seine Sources eines funktionierenden Iinterupts schickt, was ich mir im Simulator anschauen kann.
Michael S. schrieb: > Es kann doch nicht so schwer sein. > Irgendeiner eine Idee was ich da falsch mache? Beim geposteten Code ist die Timer Fuktion innerhalb von main(){} - versuche das besser außerhalb. Da sehe ich auch 2 Funktionsnamen hintereinander. Dürfte der Compiler so auch nicht verstehen.
Vielen, vielen Dank für die schnelle Antwort! Oh man, wie blöd kann man sein (nicht falsch verstehen, bezieht sich auf mich!!!)! Du hast natürlich vollkommen recht die ISR hat in main nichts verloren! Aber was meinst Du mit 2 Funktionsnamen hintereinander?
Hallo Jim, ich habe mal weiter probiert. Jetzt statt __ISR_AT_VECTOR __ISR verwendet und damit läuft es. Der Hauptfehler war also das die ISR in der main-Routine. Echt peinlich, vor allem wenn man bedenkt, wie viele Stunden ich mit der Suche verbracht habe.... Auf jeden Fall noch mal vielen Dank. Jetzt kann ich endlich mit der eigentlichen Programmierung anfangen... Schönen Sonntag Abend!
Jim M. schrieb: > Da sehe ich auch 2 Funktionsnamen hintereinander. Dürfte der Compiler so > auch nicht verstehen. Das sind nicht 2 Funktionsnamen. `__ISR_AT_VECTOR(v,...)` bzw. `__ISR(v,...)` sind Makros, die zu grob zu `__attribute__((interrupt,vector(v),nomips16))` expandieren. Sprich: Sie machen deine Funktion zu einem interrupt handler.
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.