Forum: Mikrocontroller und Digitale Elektronik dsPIC33F: Interrupts funktionieren nicht in Release-Version


von Andreas T. (Gast)


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!

von (prx) A. K. (prx)


Lesenswert?

An Zeile 42.

von Andreas T. (Gast)


Lesenswert?

das verstehe ich leider nicht... oder ist das ein Hinweis den Code zu 
posten?

von Benedikt K. (benedikt)


Lesenswert?

Matthias H. schrieb:
> oder ist das eine Hinweis den Code zu posten?

Bingo!

von mp (Gast)


Lesenswert?

falsches linker-script für dir release Version?

von Andreas T. (Gast)


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.

von Benedikt K. (benedikt)


Lesenswert?

Keine Ahnung wo du counter wieder einliest, aber versuchs mal mit
volatile int counter;

von Andreas T. (Gast)


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.

von holger (Gast)


Lesenswert?

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.

von Andreas T. (Gast)


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.

von Benedikt K. (benedikt)


Lesenswert?

holger schrieb:
> Wie das bei den dsPIC33 aussieht weiß ich leider nicht.

Da braucht man sowas nicht.

von Matthias (Gast)


Angehängte Dateien:

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)

von Andreas T. (Gast)


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.

von Andreas T. (Gast)


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.

von Andreas T. (Gast)


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

von Benedikt K. (benedikt)


Lesenswert?

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.

von Andreas T. (Gast)


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.

von Andreas T. (Gast)


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.

von Benedikt K. (benedikt)


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.

von Andreas T. (Gast)


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!

von Andreas T. (Gast)


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

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
Noch kein Account? Hier anmelden.