Hallo! Ich verwende den dsPIC33FJ256GP710. Ich habe ein Programm geschrieben das bei einem Pegelwechsel an einem IO-Pin einen Interrupt auslösen soll. Wenn das Programm in der Debug-Version mit dem Debugger ICD2 auf dem µC laufen lasse, funktioniert alles perfekt. Als Release-Version reagiert der Controller nicht mehr auf Pegelwechsel bzw. die Interrupt-Routine wird nicht ausgeführt. Hat jemand vielleicht eine Idee woran es liegen könnte? Vielen Dank schon mal!
das verstehe ich leider nicht... oder ist das ein Hinweis den Code zu posten?
Matthias H. schrieb:
> oder ist das eine Hinweis den Code zu posten?
Bingo!
falsches linker-script für dir release Version?
Hier ist nun der Code. LCD un UART habe ich der Übersichtlichkeit wegen herausgenommen. Diese Funktionen arbeiten problemlos. Probleme bereitet mir _CNInterrupt(void).
1 | #include "p33FJ256GP710.h" |
2 | |
3 | _FOSCSEL(FNOSC_PRIPLL); |
4 | _FOSC(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_XT); |
5 | _FWDT(FWDTEN_OFF); |
6 | |
7 | void configure_CN(void); |
8 | void __attribute__ ((__interrupt__)) _CNInterrupt(void); |
9 | |
10 | int counter; |
11 | |
12 | int main ( void ) |
13 | {
|
14 | |
15 | |
16 | //Takt einstellen
|
17 | PLLFBD = 0x0026; |
18 | CLKDIV = 0x0000; |
19 | |
20 | // AN3/RB3/CN5 auf Digital
|
21 | AD1PCFGLbits.PCFG3 = 1; |
22 | |
23 | // RB3 als digitaler Output
|
24 | TRISBbits.TRISB3 = 1; |
25 | |
26 | configure_CN(); |
27 | |
28 | while(1); |
29 | |
30 | }
|
31 | |
32 | void configure_CN(void) |
33 | {
|
34 | CNEN1bits.CN5IE = 1; // Enable CN13 pin for interrupt detection |
35 | |
36 | IEC1bits.CNIE = 1; // Enable CN interrupts |
37 | IFS1bits.CNIF = 0; // Reset CN interrupt |
38 | }
|
39 | void __attribute__ ((__interrupt__)) _CNInterrupt(void) |
40 | {
|
41 | |
42 | // Clear CN interrupt
|
43 | IFS1bits.CNIF = 0; |
44 | |
45 | counter++; |
46 | }
|
Vielen Dank für eure Hilfe.
Keine Ahnung wo du counter wieder einliest, aber versuchs mal mit volatile int counter;
Welches Linker-Skript wäre denn das richtige für die Release-Version? Ich verwende für beide Versionen das gleiche Skript, das sich in MPLAB "C30\support\dsPIC33F\gld" befindet. Mit diesen Skripten kenne ich mich leider gar nicht aus und habe das auch einem Tutorial übernommen.
Irgendwie fehlt da doch die globale Interruptfreigabe. Für PIC18: INTCONbits.GIE=1; //Interrupts erlauben Wie das bei den dsPIC33 aussieht weiß ich leider nicht.
1 | volatile int counter; |
hat nichts gebracht. Ich bin mir auch ziemlich sicher das die ISR für den Pegelwechsel nicht ausgeführt wird in der Release-Version. Ich habe zu Testzwecken versucht eine LED in der ISR zum Leuchten zu bringen. In der Debug-Version funtktioniert das ohne Probleme, in der Release-Version nicht.
holger schrieb:
> Wie das bei den dsPIC33 aussieht weiß ich leider nicht.
Da braucht man sowas nicht.
>holger schrieb: >> Wie das bei den dsPIC33 aussieht weiß ich leider nicht. >Da braucht man sowas nicht. Naja, das IRQ System ist da sowieso etwas gewöhnungsbedürftig. Das mit dem IRQs auf Zeit sperren und der passenden Errata dazu... würg Aber um auf das Problem zurückzukommen: Bei den Konfigurationsbits hab ich folgendes:
1 | #ifdef DEBUG_MODE |
2 | _FBS( RBS_NO_BOOT_RAM & BSS_NO_BOOT_CODE & BWRP_WRPROTECT_OFF ) |
3 | _FSS( RSS_NO_SEC_RAM & SSS_NO_SEC_CODE & SWRP_WRPROTECT_OFF ) |
4 | _FGS( GCP_OFF ) |
5 | _FOSCSEL( FNOSC_PRI & IESO_OFF ) |
6 | //_FOSC( FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_HS ) // Clock Switch disabled! |
7 | _FOSC( FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_HS ) // Clock Switch enabled! |
8 | _FWDT( FWDTEN_OFF & WINDIS_OFF & WDTPRE_PR128 & WDTPOST_PS256 ) // WDT auf 1s (PS=256) |
9 | _FPOR( FPWRT_PWR2 ) |
10 | _FICD( BKBUG_ON & COE_ON & JTAGEN_OFF & ICS_PGD2 ) |
11 | #else |
12 | _FBS( RBS_NO_BOOT_RAM & BSS_NO_BOOT_CODE & BWRP_WRPROTECT_OFF ) |
13 | _FSS( RSS_NO_SEC_RAM & SSS_NO_SEC_CODE & SWRP_WRPROTECT_OFF ) |
14 | _FGS( GCP_ON ) |
15 | //_FOSC( FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_HS ) // Clock Switch disabled! |
16 | _FOSC( FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_HS ) // Clock Switch enabled! |
17 | _FWDT( FWDTEN_ON & WINDIS_OFF & WDTPRE_PR128 & WDTPOST_PS256 ) // WDT auf 1s (PS=256) |
18 | _FPOR( FPWRT_PWR2 ) |
19 | _FICD( BKBUG_OFF & COE_ON & JTAGEN_OFF & ICS_PGD2 ) |
20 | #endif |
Das mit dem DEBUG_MODE hab ich glaub eine Spur zu umständlich, da der bei Debug und Release Konfig so ein Symbol automatisch setzt bzw. nicht setzt. Aber ich hab hier im Projekt mehr als nur 1 IRQ am LAufen und das geht Problemlos. Wichtig! Schau Dir die Doku zu den Konfigurationsbits an, bevor Du das da oben in deinen Code übernimmst! (Die findet sich im p33Fxxxx.h irgendwo weit hinten) BEi der Konfiguration gibt es auch ein Konfigbit, dass verhindert, dass der Controller ohne ICD losläuft! Mein Linker Skript packe ich auch mal in den Anhang. Könnte aber das Default sein... (bin ich mir nicht mehr ganz sicher, da es schon ne Weile her ist)
Die geänderten Konfigurationsbits und auch das Linkerskript haben leider nicht geholfen. Noch ein paar weitere Infos. Vielleicht mache ich ja was grundlegendes falsch. Als Debugger und Programmer nutze ich ICD2. Als Compiler nutze ich die MPLAB C Compiler in der Trial Version, die inzwischen abgelaufen ist (dadurch sollte sich nur die Code Optimierung abschalten). Als Entwicklungsboard nutze ich das Explorer 16 Board.
Zur Ergänzung: Um den Release-Code auf den µC zu bekommen, schalte ich in der IDE den ICD2 auf Programmer um, ändere die Build Configuration von Debug auf Release und führe dann den Build aus. Am Ende wird dann programmiert und ein Reset des µC ausgeführt.
Ich habe nun mal ein Demo-Programm von Microchip, in dem Interrupts verwendet werden, abgeändert und meinen Code für die Pegelwechsel-Interrupts eingefügt. Im Debug-Mode funktionniert das, im Release-Modus leider wieder nicht. Nun sieht es ja so aus als sei mit den Interrupts für den Pegelwechsel etwas nicht richtig. Ich bin für jeden Tipp sehr dankbar!!!
Der GP710 hat doch 2 ADCs wenn ich das Datenblatt richtig überflogen habe. Daher müsste es neben AD1PCFGL auch AD2PCFGL geben, den man auch auf digital stellen muss.
So langsam verzweifle ich ein wenig..... nun der neuste Stand der Dinge. Das Entwicklungsboard, das ich verwende, hat einige Tasten mit denen ich verschiedene Pins von high auf low ziehen kann. Ich habe mein Program so geändert, dass es auf einen Pegelwechsel reagieren soll, wenn eine Taste gedrückt wird, bzw eine Interrupt für einen Pegelwechsel auslösen soll. Dieses funktioniert sowohl in der Debug- als auch im Release-Version einwandfrei. Mit den Interrupts und den weiteren Einstellungen scheint also alles okay zu sein. Ich habe daufhin verschiedene weitere Pins getestet, die laut Datenblatt des Entwicklungsboards "frei" sind. Leider tritt dann wieder das Problem auf, dass ein Pegelwechsel ohne Wirkung bleibt. Hat noch irgendwer eine Idee? Ich bin so langsam echt verzweifelt.
Benedikt K. schrieb: > Der GP710 hat doch 2 ADCs wenn ich das Datenblatt richtig überflogen > habe. Daher müsste es neben AD1PCFGL auch AD2PCFGL geben, den man auch > auf digital stellen muss. Mit diesen Registern stellt man für jeden Pin einzeln ein, ob dieser im "Analog-Modus" sein soll oder nicht. Mit:
1 | AD1PCFGLbits.PCFG3 = 1; |
stelle ich genau den Pin auf "digital", den ich benötige. Vielen Dank für den Hinweis.
Matthias H. schrieb: > Mit diesen Registern stellt man für jeden Pin einzeln ein, ob dieser im > "Analog-Modus" sein soll oder nicht. > > Mit: >
1 | > AD1PCFGLbits.PCFG3 = 1; |
2 | >
|
> stelle ich genau den Pin auf "digital", den ich benötige.
Aber stellst du auch AD2PCFGLbits.PCFG3 auf 1? Laut Datenblatt dominiert
nämlich analog wenn nur eines der Register umgestellt ist.
Jetzt verstehe ich was du meinst.... Tut mir leid mein Fehler. Bisher habe ich nur ein Register umgestellt. Ich werde das gleich mal testen. Mich würde es allerdings wundern, wenn das für Release und Debug einen Unterschied machen würde.... Aber mal sehen. Vielen Dank erstmal!
Es funtkioniert!!!!! Unfassbar! Ich denke es lag daran, dass ich bei nur einem ADC das Register auf "digital" geändert habe.... Gleichzeitig habe ich die IDE neuaufgesetzt und den Compiler neu installiert. Aber ich denke daran wird es nicht gelegen haben. Mich wundert es nur noch immer, dass meine Programm im Debug-Modus einwandfrei funktionierte..... Vielen Dank nochaml für eure Hilfe! alleine wäre ich nie darauf gekommen!!!
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.