mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 Error: Placement fails for object


Autor: Nico B. (nicoholic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ich versuche gerade unten stehendes Beispielprogramm von TI auf meinen 
MSP430F5438 zum Laufen zu bekommen.

Zum Compilieren verwende ich Code Composer Studio Core Edition, Version: 
4.1.0.02006.

Beim Linken erhalte ich immer folgenden Fehler:
"../lnk_msp430f5438.cmd", line 186: error: placement fails for object ".int55",
   size 0x4 (page 0).  Available ranges:
   INT55        size: 0x2          unused: 0x2          max hole: 0x2

Programm:
#include "msp430x54x.h"

#define   Num_of_Results   8

volatile unsigned int A0results[Num_of_Results];
volatile unsigned int A1results[Num_of_Results];
volatile unsigned int A2results[Num_of_Results];
volatile unsigned int A3results[Num_of_Results];

void main(void)
{
  WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer
  P6SEL = 0x0F;                             // Enable A/D channel inputs
  ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_8; // Turn on ADC12, extend sampling time
                                            // to avoid overflow of results
  ADC12CTL1 = ADC12SHP+ADC12CONSEQ_3;       // Use sampling timer, repeated sequence
  ADC12MCTL0 = ADC12INCH_0;                 // ref+=AVcc, channel = A0
  ADC12MCTL1 = ADC12INCH_1;                 // ref+=AVcc, channel = A1
  ADC12MCTL2 = ADC12INCH_2;                 // ref+=AVcc, channel = A2
  ADC12MCTL3 = ADC12INCH_3+ADC12EOS;        // ref+=AVcc, channel = A3, end seq.
  ADC12IE = 0x08;                           // Enable ADC12IFG.3
  ADC12CTL0 |= ADC12ENC;                    // Enable conversions
  ADC12CTL0 |= ADC12SC;                     // Start convn - software trigger
  
  __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, Enable interrupts
  __no_operation();                         // For debugger
  
}

#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
  static unsigned int index = 0;

  switch(__even_in_range(ADC12IV,34))
  {
  case  0: break;                           // Vector  0:  No interrupt
  case  2: break;                           // Vector  2:  ADC overflow
  case  4: break;                           // Vector  4:  ADC timing overflow
  case  6: break;                           // Vector  6:  ADC12IFG0
  case  8: break;                           // Vector  8:  ADC12IFG1
  case 10: break;                           // Vector 10:  ADC12IFG2
  case 12:                                  // Vector 12:  ADC12IFG3
    A0results[index] = ADC12MEM0;           // Move A0 results, IFG is cleared
    A1results[index] = ADC12MEM1;           // Move A1 results, IFG is cleared
    A2results[index] = ADC12MEM2;           // Move A2 results, IFG is cleared
    A3results[index] = ADC12MEM3;           // Move A3 results, IFG is cleared
    index++;                                // Increment results index, modulo; Set Breakpoint1 here
    
    if (index == 8)
    {
      (index = 0);
    }
  case 14: break;                           // Vector 14:  ADC12IFG4
  case 16: break;                           // Vector 16:  ADC12IFG5
  case 18: break;                           // Vector 18:  ADC12IFG6
  case 20: break;                           // Vector 20:  ADC12IFG7
  case 22: break;                           // Vector 22:  ADC12IFG8
  case 24: break;                           // Vector 24:  ADC12IFG9
  case 26: break;                           // Vector 26:  ADC12IFG10
  case 28: break;                           // Vector 28:  ADC12IFG11
  case 30: break;                           // Vector 30:  ADC12IFG12
  case 32: break;                           // Vector 32:  ADC12IFG13
  case 34: break;                           // Vector 34:  ADC12IFG14
  default: break; 
  }  
}

Scheinbar gibt es Probleme mit dem Interrupt. Ich verstehe nicht, wie 
ich das Problem beheben kann. Hat jemand eine Idee?

Besten Dank
Nico

Autor: Yagan Ζ. Dongobar (yagan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nico,

wäre vielleicht interessant in das Linker-Script "lnk_msp430f5438.cmd" 
hineinzuschauen, was da in Zeile 186 steht. An deinem Programm-Code kann 
ich nichts Ungewöhnliches entdecken.

Ciao, Yagan

Autor: Pothead (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht fast so aus als wenn er die Interrupt Routine im oberen Speicher 
(>64k) platzieren will und dafür eine >16Bit Adresse braucht bzw. 
verwenden will. Das Linker Script wäre aufschlussreich.

Autor: Nico B. (nicoholic)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal vielen Dank für die Antworten.

Das Linker-File habe ich angehängt. Hier ein paar Ausschnitte, die sich 
auf den Fehler beziehen:

Zeile 97 :
INT55: origin = 0xFFFE, length = 0x0002

Zeile 186:
.int55   : {} > INT55

Übrigens habe ich vergessen zu erwähnen, dass ich den MSP auf einem 
Experimentierboard verwende (MSP-EXP430F548).

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

Bewertung
0 lesenswert
nicht lesenswert
Mhhh, also das sieht soweit gut aus. Ein Versuch ist es wert: Versuche 
mal das Script im Anhang. Viel Hoffnung habe ich aber nicht...

Kann man beim Composter ein Data-Model einstellen (16Bit vs 20Bit 
Adressen)?

Autor: Yagan Ζ. Dongobar (yagan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nico,

zum Test habe ich gerade deinen Quellcode in die Datei eines 
Beispielprojekts kopiert, auf MSP430F5438 eingestellt und übersetzen 
lassen. Es funktioniert alles fehlerfrei. Ich benutze allerdings die 
aktuelle Version: 4.1.2.00027.

Wie hast du denn dein Projekt erstellt?

Vielleicht ist irgendeine Option unpassend eingestellt, oder dein 
benutzter Code Composer hat ein Problem.

Versuche doch mal eines der mitgelieferten Beispielprojekte als 
Grundlage zu benutzen. Wenn das nicht hilft, würde ich den aktuellen 
Code Composer bei TI herunterladen und installieren.

Ciao, Yagan

Autor: Nico B. (nicoholic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Modifizierte cmd und CCS Update haben leider nichts geholfen, aber 
inzwischen konnte ich den Fehler finden.

Es handelt sich offenbar um einen Konflikt mit den Headerfiles, die das 
Board verwendet, auf dem ich meinen MSP betreibe. Ohne die Header läuft 
die A/D Wandlung.

Danke für eure Mühe :-)

Autor: Achim B. (achimb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Koennte es sein das in deinen Header Dateien der ADC12 Interrupt schon 
definiert ist.
Das selbe Problem hatte ich bei der Benutzung von den RF2500 und dem 
Simpliciti Protokoll. Dort war in den Simpliciti Code schon der Port 2 
Interrupt definiert, den ich dann in meinen Source code nochmal neu 
definiert habe. Nach der Auskommentierung der eine Interruptfunktion und 
Uebernahme des Codes. Funktioniert wieder alles wie gewuenscht.


Gruss

Achim

Autor: Nico B. (nicoholic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achim, du hast Recht. Nach intensiver Recherche in den zig Board-Dateien 
habe ich nun endlich die doppelte Interruptbelegung gefunden. Nach der 
entsprechenden Anpassung funktioniert nun alles so wie gewünscht :-)

Besten Dank für eure Unterstützung!

Viele Grüße
Nico

Autor: WA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
" ../lnk_msp430f5438.cmd ", line 176: error: for object placement fails 
. " int45 "
   size 0x4 (page 0). Available ranges:
   INT45 size: 0x2 unused : 0x2 max hole: 0x2
error: errors encountered during linking; " TrackBocs.out "built not

.....

Hi all,
I have a very similar problem as explained above Nico ..

Can some one help me to get rid of it ..
Please reply in english ....

Regards, WA

Autor: Nico B. (nicoholic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Have you already looked for double-defined interrupts in your code?

Are you using the MC stand-alone or integrated in an experimenter board?

Autor: WA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
I am not sure what you exectly mean by "double -defined interrupts". Can 
you give some more clues?

The MC is integrated on Experimenter board..

Autor: Geist in der Maschine (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde dir ja gerne Helfen aber das in Englisch schreiben kann ich 
nicht, auch wenn ich deine Frage gerade so verstehe.

Autor: Nico B. (nicoholic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@WA:

If you use headers from Texas Instrument for the experimenter board, 
some of the interrupt vectors will already be in use. If you use the 
same vector in your code (which is what i meant by saying 
"double-defined") you will get the error message.

In this case: try to find out which vectors are in use and use another 
interrupt vector in your code which is not used by the experimenter 
board

Autor: WA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
after clearing the double definition of the interrupt vector the error 
is gone..

thanks

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.