mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430F1611 Rev B: Programmier - Problem mit Interrupts


Autor: Armin Motakef (orginalperser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an Alle,

ich programmiere momentan einen MSP430F1611 mit dem Compiler "Code 
Composer Essentials (Eclipse)". Ich möchte mit Interrupts arbeiten, was 
auch schonmal geklappt hatte, aber momentan bekomme ich immer einen 
_reset_vector(), wenn ich das Programm starten will.

Ich habe versucht, den Fehler einzugrenzen und habe festgestellt, dass 
das Programm am Ende der Initialisation hängen bleibt bzw. den 
Reset-Vektor auslöst.

Ich gebe euch erst mal ein Ausschnitt meines Codes:
//*************** Main - Teil **************************

int main(void) { 
  
  init();  // general clock configure (s.Initialisation.c)
  

//now we have finished the configuration, initialisation and can go
//into the main loop which runs forever and takes from time to time
//control over our application to supply menu navigation, lcd output and so on

//Main-Loop for ever:
////////////////////////MAIN LOOP://///////////////////////

P2DIR |= 0x82;  
P2OUT &= ~(0x02+0x80);  // Zu- unf Abluft aus ( P2.1 und P2.7 sind Magnetventile )

while(1) {  //Main program loop....

...





Die Funktion
init()
 sieht folgendermaßen aus:

void init(void) {  
  
long j=0;  
    
_BIC_SR(GIE);     // general interrupt disable to avoid strange errors
  
init_clock();     // Initialisation of general clock system
  
init_statusled();  // Initialisation of status led (An P1.0 angeschlossen)
  
ADCinit();     // AD-Wandler initialisieren

//enable interrupt for pacemaker pulses
 P1DIR &=  0xBF;   // Set P1.6 to input direction (10111111)
 P1IFG  =  0x00;   // P1.0 IFG cleared &=0x3F
 P1IE  |=  0x40;   // interrupt enabled 01000000
 P1IES |=  0x40;   // Interrupt bei fallender Flanke

initrs232();       // Initialisation of the USART port
  
// initialisation of speedcontrol
  speedcontrol[0] = 10;
  speedcontrol[1] = 1;
  speedcontrol[2] = 10;
  speedcontrol[3] = 1;
  
init_mstimer();    // Initialisation des TimerA0  

// Bis hier läuft das Programm !!!
    
_BIS_SR(GIE);      // Enable Interrupts  <-- Nach diesem Befehl kommt der 
                   // _reset_vector()
  
//Show by LED flashing, that initialisation has finished
  P1OUT = 0x01;
  for(j=0; j<1000000; j++);
  P1OUT = 0x00;
  for(j=0; j<1000000; j++);
}

...bis zum Blinken kommt es garnicht erst. Jedoch habe ich den MSP nach
init_mstimer();
 mal blinken lassen und das hat er auch gemacht. Demnach gehe ich davon 
aus, dass es an "General Interrupt Enable" liegt.

Nun bin ich nicht grad ein Experte in diesen Dingen. Ich möchte einfach 
nur wissen, warum dieser _reset_vector() auftritt und was er überhaupt 
zu bedeuten hat. In der Hilfe zum CodeComposer steht nichts darüber 
drin.

Könnte es evtl. daran liegen, dass ich die Interrupts der einzelnen 
Komponenten falsch aktiviere (z.B. ADC, Timer, ...)

Hier ein Beispiel, wie ich das mache:
ADC12IFG = 0x0000;        // Flagregistier löschen
ADC12IE = 0x0001;    // Interrupt, wenn ADC-Wert im Speicher... 

// Benutze hier ADC12MEM0, deshalb ADC12IE = 0x0001 ...


Vielen Dank schonmal im Vorraus
Armin

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich denke, dass du den Watchdog nicht deaktiviert hast, kann das sein?!

Autor: Armin Motakef (orginalperser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael wrote:
> Hallo,
>
> ich denke, dass du den Watchdog nicht deaktiviert hast, kann das sein?!


Den Watchdog-Timer habe ich in der Funktion "init_clock()" deaktiviert:
void init_clock() {
//This function is used to initialise the system

    WDTCTL  = WDTPW | WDTHOLD;              // Disable watchdog timer

    // Initialize basic clock system

...

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schieb den Watchdog mal ganz Anfang der main(). Eventuell kommt der gar 
nicht bis in die Funktion, bevor der Hund zubeißt.

Autor: Armin Motakef (orginalperser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal Hallo,

wirklich kein Experte unter euch, der mal mit einem "_reset_vector()" zu 
kämpfen hatte?

Vielleicht ist noch die folgende Info nützlich für euch:
Der Compiler basiert auf Eclipse und ist um einige TI-spezifische 
Plug-In's erweitert worden, speziell für den MSP430.
So wie ich das verstanden habe, ist Eclipse eine OpenSource-Geschichte.

Wenn man ein Programm compiliert und startet, so werden - je nach dem - 
ein oder mehrere Threads auf dem Prozessor gestartet. Einer dieser 
Threads endet bzw. bricht mit dem _reset_vector() ab.

Über den Threads steht etwas von Cygwin GDE und noch ein spezieller 
Fehler. Den hab ich leider momentan nicht im Kopf, weil ich nicht auf 
der Arbeit bin. Kann ich euch erst frühestens Dienstag sagen... Auf 
jeden Fall irgendwas mit STR...

Kann es sein, dass dieser Fehler was mit Cygwin zu tun hat, d.h. eine 
Fehlerausgabe von Cygwin?

Wie ihr seht, habe ich nicht wirklich viel Ahnung von den Dingen und 
würde mich über jede Hilfe sehr freuen...

Schönes Wochenende noch,
Armin

Autor: Armin Motakef (orginalperser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Chris,

das werd ich mal ausprobieren, wobei das Programm bis zum Befehl
init_mstimer();
 normal ausgeführt wird.
Ich habe das so herausgefunden, indem ich den MSP nach jeder Funktion 
einmal blinken lassen hab.
Nach o.g. Funktion hat er noch geblinkt, aber nach der Funktion
_BIS_SR(GIE);
 blinkt er nicht mehr und der _reset_vector() erscheint bei den Threads.

Ich werde es dennoch mal ausprobieren. Vielen Dank für den Tipp!!!

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wenn der Reset-Vektor erscheint, ist ein nicht difinierter Interrupt 
aufgerufen worden. Bist du sicher, dass du die Interrupt-Service-Routine 
richtig deklariert hast? Wenn auf dem Interrupt-Vektor keien gültige 
Adresse steht, schmiert der Prozessor beim Eintreffen des Interrupts ab.
Hast du denn die signal.h includiert?

Autor: Armin Motakef (orginalperser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Chris,

die signal.h habe ich nicht includiert. Ich werde es mal ausprobieren.

Wie ich die ISR deklariert habe, kann ich dir leider nicht aus dem Kopf 
sagen. Wie gesagt, am Dienstag kann ich mehr dazu sagen. Ist gut 
möglich, dass ich dort einen Fehler gemacht habe, da ich nicht genau 
weiß, wie sowas gemacht wird.

Kann es sein, dass der Prozessor abschmiert, weil ich beim AD-Wandler 
unter ADC12CTL0 die Timer-Overflow-Flags nicht aktiviert habe, dieser 
aber trotzdem überläuft und somit dieser Fehler eintritt? Hab mal grad 
drüber nachgedacht. Das wäre doch ein nicht definierter Interrupt, oder?

Viele Grüße
Armin

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wenn du mit dem GCC arbeitest, musst du die Signal.h reinmachen. 
Ich kann mir schon vorstellen, was passiert. Du hast den Code für IAR 
Compiler genommen, und die ISR -Deklaration nicht geändert. Der GCC 
kompiliert dann zwar fast alles, aber eben nicht die ISR, weil er die 
pragma Anweisung nicht versteht. Da kommt glaube nicht mal ein Fehler 
sondern nur eine Warnung. Der entsprechende Interrupt-Vektor ist dann 
leer, und der Prozzi sringt irgendwohin, eigenlich müsste er dann auf 
dem unexpected Vector landen, weiß aber nicht, wie gut das implementiert 
ist.

ISRs beim GCC: http://mspgcc.sourceforge.net/manual/x918.html

Autor: Armin Motakef (orginalperser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Chris,

der Link, den du in deinem Beitrag angegeben hast, ist schon mal sehr 
nützlich! Vielen Dank nochmals!

Ich werde mich am Dienstag hinsetzten und alle deine Tipps mal 
ausprobieren. Werde dir das Ergebniss natürlich mitteilen.

Vielen Dank nochmals für deine Hilfe!
Melde mich dann am Dienstag wieder...

Autor: Tilo S. (thesurfer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

im ersten Post hast geschrieben, dass du mit dem CCE arbeitest, Chris 
arbeitet immer mit dem GCC und Eclipse. Der CCE hat zwar auch als GUI 
Eclipse benutzt aber den TI Compiler. Beim CCE ist es nicht notwendig 
die Signal.h zu includieren.

die Interruptroutinen werden beim CCE auch nicht wie in den 
Beispielcodes mit den #pragma definiert.

sondern z.B. wie folgt :

__interrupt void SD16ISR(void)
{
  if (SD16MEM0 < 0x7FFF)                 // SD16MEM0 > 0.3V?, clears IFG
    P1OUT &= ~0x20;
  else
    P1OUT |= 0x20;
}
SD16_ISR(SD16ISR)

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahso, stimmt...ich hatte nur Eclipse gelesen und angenommen er hat GCC. 
Beim CCE ist das wieder anders.
Aber da müsste doch mal eine Warnung oder Fehlermeldung kommen? Naja, 
die list ja immer keiner.

Autor: Armin Motakef (orginalperser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,

da ich grad im Umzugsstress stecke, wird das morgen mit arbeiten nichts 
(so ein Mist ;-). Werde euch dann Mittwoch Meldung geben.

Wenn ich mir jedoch den Beitrag von Tilo anschaue, dann fällt es mir 
ungefähr wieder ein, wie ich die ISR deklariert & definiert hab, nämlich 
nahezu identisch:
__interrupt void ADC(void);
ADC12_ISR(ADC)
__interrupt void ADC(void){

// ... Routine

}

Der Code sollte in dieser Form korrekt sein.

Beim Compilieren gibt es übrigens keine Fehlermeldungen und auch keine 
Warnungen. Habe nämlich sehr genau auf die Console geachtet.

Autor: Armin Motakef (orginalperser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

seit 12:30Uhr sitze ich nun an diesem Problem und habe es endlich 
geschafft, es zu lösen...

Kurz gesagt: An PortPin 1.6 ist ein Gerät angeschlossen, welches in 
regelmäßigen Abständen ein Signal ausgibt. Dieses Signal löst einen 
Interrupt aus und es wird eine "254" an den PC geschickt, der dann damit 
weiterarbeitet.

Jedesmal, wenn ich die 254 via U0TXBUF an den PC schickte, trat ein 
_reset_vector() auf. Seitdem ich im Register IE1 den Interrupt für 
UTXIE0 deaktiviert habe, funktioniert die Sache einwandfrei.

Komisch ist nur: Warum tritt dieser Fehler jetzt plötzlich auf? Warum 
nicht schon vorher, denn es hatte ja schonmal geklappt.

Und warum erscheint ein _reset_vector(), obwohl dieser Interrupt 
garnicht bearbeitet wird? Man muss doch nicht mit jedem Interruptflag 
arbeiten, oder sehe ich das Falsch?

Ich bin jedenfalls froh, dass es endlich bei mir klappt.

Wenn jemand von euch eine Erklärung hierfür hat, würde ich die gern 
wissen.

Ansonsten nochmals vielen Dank für eure Hilfe! Ihr habt mir echt 
weitergeholfen!

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist der Interrupt aktiviert, aber keine ISR Sprungadresse auf dem 
Interrupt-Vektor, stürzt der µC ab, so einfach ist das.

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.