dsPIC33F: Interrupts funktionieren nicht in Release-Version

Gast #1249804
Lesenswert?

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!
Gast #1249833
Lesenswert?

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.
Gast #1249840
Lesenswert?

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.
Gast #1249846
Lesenswert?

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.
Gast #1249893
Lesenswert?

>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)
Angehängte Dateien:
Gast #1250258
Lesenswert?

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.
Gast #1250285
Lesenswert?

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.
Gast #1250325
Lesenswert?

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!!!
Gast #1251213
Lesenswert?

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.
Gast #1251216
Lesenswert?

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.
#1251233
Lesenswert?

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.
Gast #1251329
Lesenswert?

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!
Gast #1251356
Lesenswert?

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!!!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren