Forum: Mikrocontroller und Digitale Elektronik MSP430: Trouble Reading Memory Block at 0x24400 on Page 0 of Length 0x91: Invalid parameter(s)


von Stefan Zorn (Gast)


Lesenswert?

Hallo Leute!

Ich habe ein kleines Programm geschrieben um den ADC12 meines 
MSP430f5528 auszulesen. Hier der Kern des Codes:
1
ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_15;    // Turn on ADC12,setze sequenz, set sampling time, 15 ist langsamste
2
  ADC12CTL1 = ADC12SHP+ADC12CONSEQ_3;           // Use sampling timer, repeat sequence
3
  
4
  ADC12MCTL1 = ADC12INCH_8+ADC12EOS;            // channel = A8, end seq., sequenz enthealt nur A8
5
  ADC12IE = 0x02;                               // Enable ADC12IFG.1, end channel
6
  ADC12CTL0 |= ADC12ENC;                        // Enable conversions
7
  P5SEL |= 0x01;                                // P5.0 ADC option select
8
9
  while (1) {
10
    ADC12CTL0 |= ADC12SC;                   // Start sampling/conversion
11
    
12
    while (!ADC12IFG1);            // warte bis Wert vorhanden
13
14
   batterie_spannung = ADC12MEM1;
15
    if (batterie_spannung < 1830){
16
      led4_blink();
17
    }
18
    if (batterie_spannung >= 1830){                 // ADC12MEM = A8 > 0.5AVcc?
19
      led5_blink();
20
    }
21
  }

Das funktioniert auch alles einwandfrei. Wenn ich nun den code in mein 
Hauptprogramm einfuege erhalte ich beim Laden des Programms das Warning:
"MSP430: Trouble Reading Memory Block at 0x24400 on Page 0 of Length 
0x91: Invalid parameter(s)"
Wenn ich nun den code ausfuehren lasse heangt sich die CPU nach 
erreichen der Stelle
1
ADC12CTL0 |= ADC12SC;
einfach auf (also beim starten des ADC).
Hat soetwas schon einmal jemand gesehen oder habt ihr einen Tipp fuer 
mich?
Als Software verwende ich Code Composer Studio 4.

Vielen Dank im Voraus!
Stefan

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sieh Dir mal im Datenblatt an, wo der 'F5528 überhaupt Flash-ROM hat 
(Seite 20).

Die von Dir genutzte Speicheradresse 0x24400 liegt oberhalb des 
obersten 32-kiB-Flash-Blocks (Bank3), der geht von 0x1C400 bis 0x243FF.

Also: Da ist kein Flash mehr.

Flash voll? Kaputtes Linkerskript?

von Stefan Zorn (Gast)


Lesenswert?

Danke rufus fuer den Tipp! Stimmt, den Speicherbereich 0x24400 gibt es 
nicht. Bleibt die Frage warum er dann darauf zugreifen will. Wenn ich 
das Programm deutlich verkleinere (Codesize von 6000 byte auf 4600 byte) 
tritt der Fehler genauso auf. Lade ich NUR den Code fuer den ADC ist der 
Fehler weg.

Kann ich ihm irgendwie manuell beibringen, dass er keine Adressen 
oberhalb von 0x243FF benutzen darf?  Wobei dass der Linker ja wissen 
sollte...

Kann das ein Konflikt mit einem anderen Teil meines Codes sein?

Oder gibt es vielleicht eine andere Moeglichkeit das Problem zu loesen?

Viele Gruesse

Stefan

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Merkwürdig ist, daß überhaupt Code jenseits von 0x10000 (also der ersten 
64 kiB) abgelegt wird. Immerhin befindet sich mit Bank 0 ein kompletter 
32-kiB-Block Flash-ROM unterhalb dieser Grenze, und wenn Dein gesamter 
Code nur ein paar kiB groß ist, sollte das da doch problemlos 
reinpassen.

Du wirst Dich eingehender mit Deinem Compiler beschäftigen müssen; ich 
kenne den nicht weiter. Als ich mein Projekt mit dem 'F5438 erstellt 
habe, hat der von mir genutzte Compiler (IAR) den Code zunächst 
unterhalb der 64 kiB-Grenze angelegt, erst als ich größere Tabellen im 
Code unterbrachte, wurde diese Schwelle überhaupt überschritten.

von Rolf (Gast)


Lesenswert?

Die beiden "Variablen"
ADC12CTL0 und
ADC12CTL1
sind offensichtlich falsch deklariert,
ändern - dann gehts

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Rolf schrieb:
> Die beiden "Variablen"
> ADC12CTL0 und
> ADC12CTL1
> sind offensichtlich falsch deklariert,

Nein, das ist hier ganz sicher nicht das Problem. Das sind 
Registerdefinitionen für den ADC, die sind in der zum jeweiligen 
MSP430-Derivat gehörenden Headerdatei definiert.

Das Problem scheint zu sein, daß der Compiler aus welchen Gründen auch 
immer Code in falsche Adressbereiche im FlashROM packen will.

von Rolf (Gast)


Lesenswert?

Überprüfe es trotzdem,

viele deiner Zeilen sehenn mehr nach Adressberechnungen aus
und weniger nach Wertzuweisungen

bei Code im falschen Adressbereich hätte längst der Linker gemotzt
und du kommst erst gar nicht zur Ausführung

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Rolf schrieb:
> viele deiner Zeilen sehenn mehr nach Adressberechnungen aus
> und weniger nach Wertzuweisungen

Nein, das ist vollkommen korrekt, so sieht bei einem MSP430 die 
Initialisierung von Peripherieelementen immer aus.

Allenfalls sollte man sich den Gebrauch von "+" anstelle von "|" 
abgewöhnen, wenn es darum geht, mehrere Bitkonstanten zu "addieren".

von Erik (Gast)


Lesenswert?

Hallo Stefan,

wenn der Schnipsel ein Teil deines Hauptprogrammes ist ,
würde ich mit "Single Conversion Mode "arbeiten und den
Schleifenkonstruct weglassen .

Ich tippe auf test der Versorgungsspannung ?

mfg Erik

von Stefan Zorn (Gast)


Lesenswert?

Hallo Erik! Richtig, ich will die Versorgungspannung testen um ein 
tiefentladen des LiPo-Akkus zu verhindern. :)

Du hast recht, single conversion habe ich mittlerweile auch eingestellt. 
Da waren noch mehr "Halbwissen"-Probleme drin. Mittlerweile ist das 
Problem geloest. Hier die Antwort die mir sehr geholfen hat aus dem 
TI-Forum:

In very short:

when you enable particular interrupt, enable global interrupts (GIE bit 
in SR) and interrupt happens the MCU does not know that you forgot about 
vector definition.
MCU continues regular INTR processing: stores PC and SR on the stack and 
loads interrupt vector from vector table (0xFF80-0xFFFF), dissables 
interrupts (GIE:=0).

If you did not define vector it contains 0xFFFF, so PC:=0xFFFE (not 
0xFFFF because of required alignment to 2 bytes).

If you need to write your own interrupt handler (under CCS) you should 
write something like this:

#pragma vector= ..here you should write name of the vector - depends on 
interruot type...
__interrupt void your_handler(void)
{
     ...here you can write your code, that will be executed on 
interrupt...

}

For details and template please refer to examples:

http://focus.ti.com/mcu/docs/mcuflashtools.tsp?sectionId=95&tabId=1538&familyId=342

Regards,
Piotr Romaniuk, Ph.D.
ELESOFTROM

PS
I think that the main difference between your embedded and stand alone 
code were that in this larger one you enabled interrupts,
so it allows for manifestation of the error.




Vielen Dank an alle die geholfen haben!

Viele Gruesse

Stefan

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.