www.mikrocontroller.net

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


Autor: Stefan Zorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Ich habe ein kleines Programm geschrieben um den ADC12 meines 
MSP430f5528 auszulesen. Hier der Kern des Codes:
ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_15;    // Turn on ADC12,setze sequenz, set sampling time, 15 ist langsamste
  ADC12CTL1 = ADC12SHP+ADC12CONSEQ_3;           // Use sampling timer, repeat sequence
  
  ADC12MCTL1 = ADC12INCH_8+ADC12EOS;            // channel = A8, end seq., sequenz enthealt nur A8
  ADC12IE = 0x02;                               // Enable ADC12IFG.1, end channel
  ADC12CTL0 |= ADC12ENC;                        // Enable conversions
  P5SEL |= 0x01;                                // P5.0 ADC option select

  while (1) {
    ADC12CTL0 |= ADC12SC;                   // Start sampling/conversion
    
    while (!ADC12IFG1);            // warte bis Wert vorhanden

   batterie_spannung = ADC12MEM1;
    if (batterie_spannung < 1830){
      led4_blink();
    }
    if (batterie_spannung >= 1830){                 // ADC12MEM = A8 > 0.5AVcc?
      led5_blink();
    }
  }


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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Stefan Zorn (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Rolf (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Rolf (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Erik (Gast)
Datum:

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

Autor: Stefan Zorn (Gast)
Datum:

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

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

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.