mikrocontroller.net

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


Autor: Andreas T. (megagad)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An Zeile 42.

Autor: Andreas T. (megagad)
Datum:

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Bingo!

Autor: mp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
falsches linker-script für dir release Version?

Autor: Andreas T. (megagad)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist nun der Code. LCD un UART habe ich der Übersichtlichkeit wegen 
herausgenommen. Diese Funktionen arbeiten problemlos.

Probleme bereitet mir  _CNInterrupt(void).
#include "p33FJ256GP710.h"

_FOSCSEL(FNOSC_PRIPLL);
_FOSC(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_XT);
_FWDT(FWDTEN_OFF);

void configure_CN(void);
void __attribute__ ((__interrupt__)) _CNInterrupt(void);

int counter;

int main ( void )
{


//Takt einstellen 
   PLLFBD = 0x0026;
   CLKDIV = 0x0000;

// AN3/RB3/CN5 auf Digital
  AD1PCFGLbits.PCFG3 = 1;

 // RB3 als digitaler Output
  TRISBbits.TRISB3 = 1;

  configure_CN();

  while(1);
  
}

void configure_CN(void)
{
  CNEN1bits.CN5IE = 1; // Enable CN13 pin for interrupt detection

  IEC1bits.CNIE = 1; // Enable CN interrupts
  IFS1bits.CNIF = 0; // Reset CN interrupt
}
void __attribute__ ((__interrupt__)) _CNInterrupt(void)
{
    
  // Clear CN interrupt
  IFS1bits.CNIF = 0; 
  
  counter++;
}

Vielen Dank für eure Hilfe.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine Ahnung wo du counter wieder einliest, aber versuchs mal mit
volatile int counter;

Autor: Andreas T. (megagad)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas T. (megagad)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Da braucht man sowas nicht.

Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
#ifdef DEBUG_MODE
  _FBS( RBS_NO_BOOT_RAM & BSS_NO_BOOT_CODE & BWRP_WRPROTECT_OFF )
  _FSS( RSS_NO_SEC_RAM & SSS_NO_SEC_CODE & SWRP_WRPROTECT_OFF )
  _FGS( GCP_OFF )
  _FOSCSEL( FNOSC_PRI & IESO_OFF )
  //_FOSC( FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_HS )                // Clock Switch disabled!
  _FOSC( FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_HS )                // Clock Switch enabled!  
  _FWDT( FWDTEN_OFF & WINDIS_OFF & WDTPRE_PR128 & WDTPOST_PS256 )  // WDT auf 1s (PS=256)
  _FPOR( FPWRT_PWR2 )
  _FICD( BKBUG_ON & COE_ON & JTAGEN_OFF & ICS_PGD2 )
#else
  _FBS( RBS_NO_BOOT_RAM & BSS_NO_BOOT_CODE & BWRP_WRPROTECT_OFF )
  _FSS( RSS_NO_SEC_RAM & SSS_NO_SEC_CODE & SWRP_WRPROTECT_OFF )
  _FGS( GCP_ON )
  //_FOSC( FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_HS )                // Clock Switch disabled!
  _FOSC( FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_HS )                // Clock Switch enabled!
  _FWDT( FWDTEN_ON & WINDIS_OFF & WDTPRE_PR128 & WDTPOST_PS256 )  // WDT auf 1s (PS=256)
  _FPOR( FPWRT_PWR2 )
  _FICD( BKBUG_OFF & COE_ON & JTAGEN_OFF & ICS_PGD2 )
#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)

Autor: Andreas T. (megagad)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas T. (megagad)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas T. (megagad)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas T. (megagad)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas T. (megagad)
Datum:

Bewertung
0 lesenswert
nicht 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:
 AD1PCFGLbits.PCFG3 = 1;
stelle ich genau den Pin auf "digital", den ich benötige.

Vielen Dank für den Hinweis.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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:
>
>  AD1PCFGLbits.PCFG3 = 1;
> 
> 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.

Autor: Andreas T. (megagad)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Andreas T. (megagad)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.