Forum: Mikrocontroller und Digitale Elektronik MSP430 Probleme bei Download


von reflection (Gast)


Angehängte Dateien:

Lesenswert?

Salu zusammen

Ich habe endlich den mspgcc zum funktionieren bekommen. Er zeigt 
folgendes an (Anhang)
Was bedeutet dieser Error? Ich weiss selber das ich den MSP speise, 
speise ich ihn nicht, erkennt er ihn ja nicht...

Im zweiten Post seht ihr noch die Programmstruktur unter Debug. Gehe ich 
in Eclipse auf Debug, kommt die Fehlermeldung:

D:\reflection\msp430_Eclipse_Project\G-Sens\Debug\G-Sens not found
D:\reflection\msp430_Eclipse_Project\G-Sens\Debug\G-Sens not found
D:\reflection\msp430_Eclipse_Project\G-Sens\Debug\G-Sens not found

aber das File scheint ja da zu sein...?? (siehe Anhang im nächsten Post)

Ich will eigentlich nur das Prog auf den MSP laden, debuggen ist mir 
vorerst noch egal, bin schon froh wenn ich das Teil irgendwie rauf 
kriege. Hoffe es kann mir einer helfen, obschon, ob mir noch zu helfen 
ist...?? :o)

Greets und Danke schon einmal im Voraus

reflection

von reflection (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch die Dateistruktur

von reflection (Gast)


Lesenswert?

Sorry, natürlich umgekehrt %o)

von reflection (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch was ich im Debugger eingetragen habe (Anhang)

Wenn ich dann debugge bringt er folgenden Fehler:

Unable to set working directory: Target is not responsing
  Unable to set working directory: Target is not responsing
  Unable to set working directory: Target is not responsing

Was mache ich falsch?

Gruss

von Christian R. (supachris)


Lesenswert?

Trenn mal die Verbindung zwischen Vcc und dem USB-Debugger. BEi mir hat 
das auch nicht geklappt, als ich die Vcc an den Debugger angeschlossen 
hatte.

Achja, im gdb-target.ini musst du natürlich G-Sens.elf schreiben, Endung 
scheint nicht da zu sein.

von reflection (Gast)


Angehängte Dateien:

Lesenswert?

Salu zusammen

so, ich komme nun in den Debug Modus, er scheint einen Teil herunter zu 
laden, aber bei 85% steigt er immer mit folgender Fehlermeldung aus 
(Anhang).
Wenn ich den MSP dann kurz vom Strom nehme und wieder neu starte, ist 
ein Teil des Programms drauf. Ich kann alle Zeichen auf dem Display 
lesen, nur meine Umwandlungen mit sprintf hat er nicht geschluckt, da 
kommt nur Müll (hat in IAR so funktioniert der Code...) . Kann mir aber 
das aus dieser Fehlermeldung nicht erklären. Habe irgendwo mal was 
gelesen, dass es verschiedene Versionen von msp430-gdb.exe gibt. Stimmt 
das? Kennt jemand das Problem. Irgendwas hat er auch noch mit einem 
Reset Vector (hinten im Bild)

Greets

von Christian R. (supachris)


Lesenswert?

Welche Version der MSPGCC Toolchain hast du? Bei mir klappts nur mit der 
vom Mai 2006. Alle neueren sind kaputt.

von reflection (Gast)


Lesenswert?

Habe nun die Version von Mai 06 installiert. Kommt der selbe Fehler.

Hier noch der Log

No symbol "auto" in current context.
Warning:
Cannot insert breakpoint 4.
Error accessing memory address 0x149a: (undocumented errno -1).
Cannot insert breakpoint 5.
Error accessing memory address 0x12f4: (undocumented errno -1).
Cannot insert breakpoint 6.
Error accessing memory address 0x157c: (undocumented errno -1).

kill

Kann es sein das ich etwas nicht einbinde? Ich habe noch 16 Warnings in 
meinem Code die ich einfach nicht wegbekomme, so ala:

Warning: Implicit declaration of function ....

Es ist komisch, wenn ich nur Strings zum Display schicke klappt es, 
aber, die werden alle angezeigt. Kann es mit dem sprintf zusammenhängen? 
Nützt es was wenn ich meine main.c poste?

Gruss von einem dem die "Birne" raucht

von Christian R. (supachris)


Lesenswert?

Hmm...ich denke mal, du musst einen Teil der Funktion sprintf() selber 
schreiben. Muss man bei printf() auch.

Warning: Implicit declaration of function ....

Bedeutet, dass der Linker die Funktion nicht findet, die benötigt wird.

Guck mal in das Headerfile stdio.h:
1
int puts(const char *s);
2
int putchar(int c);      //has to be supplied by the user, but avoids useless warnings

Das ist ja eindeutig. Ich chätze mal, du musst puts() noch selbst 
schreiben.

von reflection (Gast)


Angehängte Dateien:

Lesenswert?

Manche dieser Funktionen befinden sich in anderen .c Files. Kann es 
daran liegen? (Implicit declaration...) Habe die verschiedenen .c Files 
im Main nicht speziell definiert, die scheint er selber einzubinden. 
Muss ich das stdio.h in jedes meiner .c Files einbinden? Sorry für die 
komischen Fragen, aber wie gesagt, der Code hat mit IAR bestens 
funktioniert.

Was meinst Du mit selber machen? Stehe da jetzt ehrlich gesagt gerade 
ziemlich auf dem Schlauch. Grundsätzlich sieht das Ganze bei mir etwa so 
aus. Gibt es da mit Standardverfahren nichts anderes das vielleicht 
funzt?

float acc_x = SCA3000_Read_16Bit(0x05); // X-Wert auslesen SCA3000
acc_x += 0.04;                          // Rudimentäre Offsetkorrektur 
:-)
sprintf(x_axis, "%s%+5.3f %c","x:",acc_x,'g');// X-Wert in String 
schreiben

Habe auch schon im Netz gesucht und was gefunden, das msp430-gdb wohl 
ein Prob hat mehr als 3 Breakpoints einzufügen. Kann mir einer sagen wie 
ich das abschalte, dass er mir die Breakpoints selber setzt? Habe 
nämlich manuell nichts gemacht. Denke zwar, das der Fehler wirklich an 
meinem Prog liegt. Hänge mal noch das main.c an, viellicht kann mir dann 
einer weiterhelfen. Sorry schonmal für den Code, ist mein erstes uP 
Prog. :o)

Greets

von Christian R. (supachris)


Lesenswert?

Naja, wenn du externe Funktionen benutzt, musst du das zugehörige 
Header-File, in dem die Funktionsdeklarationen stehen, in jede Datei 
einbinden, in der du diese Funktionen nutzen willst.

Oder aber mit extern in jedem File alle benutzten Funktionen 
deklarieren.

Wegen der Brakpoints: Das ist kein Problem des GDB. Die MSP430X14x haben 
nun mal nur 3 Hardware-Breakpoints, von daher ist es völlig korrekt, 
wenn du nicht mehr als 3 setzen kannst.

Ich arbeite mit den 16x, die haben 8 BP, und die funktionieren alle mit 
gdb.

Achja, mit selber machen meine ich: Es gibts ja auch die printf() 
Funktion. Auf einem µC weiß allerdings die Lib nicht, wo denn jetzt das 
einzelne Zeichen wie hin muss. Wenn du printf() verwendest, musst du 
noch definieren, was die putch() machen soll. Beispielsweise auf der 
seriellen Ausgeben. Oder auf einem Display...oder oder oder. Da das nur 
der Benutzer weiß, musst du das selbst schreiben. Könnte mir vorstellen, 
dass das bei puts() auch so ist.

Übrigens musst du dem linker noch die option m mitgeben, wenn du die 
math-lib benutzen willst.

von Christian R. (supachris)


Lesenswert?

Hab gerade mal selber probiert. Sprintf() klappt ohne selber was zu 
machen. Muss also an deinen anderen Funktionen liegen. Erstelle mal 
Header-Files und includiere die.

von reflection (Gast)


Lesenswert?

Aha, das ist doch interessant das er nur 3 Breakpoints kann der 
MSP430x149. Wieso probiert mein Prog dann einen 4. Breakpoint 
einzufügen? Ich habe absolut keine Breakpoints deklariert, die macht er 
einfach selber! Denke das es in demfall daran liegen wird denn er stürzt 
ja mit der Fehlermeldung ab er könne Breakpoint 4 nicht setzten was ja 
anscheinend auch korrekt ist. Wie bekomme ich diese Breakpoints raus?

Greets

von Christian R. (supachris)


Lesenswert?

In der Debug-Perspektive hast du doch das kleine Fenster mit den 
Breakpoints, Expressions, Variables usw. Da kannst du alle Breakpoints 
ausschalten. Aber einen beim Start von Main() brauchst du immer. Aber 
den kannst du dann auch deaktivieren, wenn der da angekommen ist.

Übrigens steht die Anzahl der Breakpoints für jeden MSP430 im Manual des 
USB-FET-Debuggers. SLAA138 oder so...

Edit: Nochmal mit Bild.

von Christian R. (supachris)


Angehängte Dateien:

Lesenswert?

Neuer Versuch für das Bild.

von reflection (Gast)


Lesenswert?

Also bei Breakpoints stehen zwei drin

D:\Gruenenwald\msp430_Eclipse_Projects\G-Sens\main.c[line: 65]
D:\Gruenenwald\msp430_Eclipse_Projects\G-Sens\main.c[line: 107]

Wieso möchte er dann einen 4. setzen wenn es gar keinen 3. gibt?

Sorry, aber ich hänge mich an jeden noch so dünnen Strohhalm in der 
Hoffnung es doch noch zum laufen zu bekommen. Das mit den Breakpoints 
ausschalten muss ich am Abend mal probieren, aber irgendwie glaube ich 
noch nicht dran, dass es das dann auch wirklich ist...

Greets

von Christian R. (supachris)


Lesenswert?

Einer steht immer an Anfang von main(), der steht aber nicht in der 
Liste da oben drinne.

Es wird nicht funktionieren, solange du deine Funktionen nicht 
ordentlich deklarierst. Der Linker kann nicht hellsehen.

von reflection (Gast)


Lesenswert?

Ok, bin dran das zu ändern. Danke schon einmal! Werde allfälligen Erfolg 
oder Misserfolg posten!

Grüsse reflection

von reflection (Gast)


Angehängte Dateien:

Lesenswert?

Also ich habe die Header Files erstellt. Etliche Fehler sind schon weg, 
aber es hat immer noch, hat da noch jemand eine Tipp? Versuche das mit 
dem Debugger erst wieder wenn ich keine Warnings mehr habe. Scheint aber 
doch am sprintf zu liegen. Wenn ich den als Kommentar deklariere gibt es 
nur noch die Fehler von unbenutzten Varabeln.
Was hat das mit dem Rückgabewert von main auf sich? Main hat ja keinen 
Rückgabewert :o) Fehler sind im Anhang aufgeführt

Gruss

von Christian R. (supachris)


Lesenswert?

Wahrscheinlich erwartet sprintf() bei eine Double variable, du gibts 
aber float. Das macht ja aber nix, da Double größer ist. Du kannst ja 
mit (double) casten.

Beim GCC muss Main() als int sein, und einen Rückgabewert haben. Ist da 
nun mal so.

Und wieso deklarierst du in jeder schleife die char Variablen neu, sind 
doch immer die gleichen.

von reflection (Gast)


Lesenswert?

Wenn ich das richtig verstehe würdest Du die Variabeln vor dem while(1) 
deklarieren da sie ja immer gleich bleiben? Wie gesagt, es ist mein 
erstes C Programm und das erste uP Prog auch welches ich versuche zu 
schreiben, bin für solche Tipps immer dankbar. Irgendwie muss man ja mal 
anfangen und das das nicht das Gelbe vom Ei ist was ich da schreibe kann 
ich mir nur zu gut vorstellen :o) In der Schule hatte ich nur zwei 
Semester Java, das ist sozusagen mein Stand :o)

Greets Serge

PS: Ich werde mal versuchen den float in einen double zu casten. Mal 
schauen mit welchem Befehl das in C funktioniert. Oder soll ich lieber 
gleich alles mit double machen? Wäre dann ja wohl mit Kanonen auf 
Spatzen geschossen, oder?

von Christian R. (supachris)


Lesenswert?

Auf so einem kleinen 16-Bit Controller ist jede Fließkomma-Sache eine 
kanone auf den armen Spatzen. Lieber mehr Gehirnschmalz reinstecken, um 
mit Ganzzahlen auszukommen, meist lässt sich das durch ein paar 
geschickte Multiplikationen und/oder Summationen alles erschlagen.

Die Deklaration gehört vor die while Schleife, oder noch besser ganz 
oben ins File, also außerhalb von main().

Casten geht so:
1
float wert = 2.45;
2
sprintf(buffer, "Wert: %1.2f", (double)wert);

Allerdings linkt der dann die gesamte FP-Lib dazu, und langsam wirds 
auch wie sau. Aber kommt halt auf die Anwendung an....

von reflection (Gast)


Lesenswert?

Habe hier beim Compilieren noch einen Fehler gefunden den ich mir nicht 
erklären kann, vielleicht weiss ja jemand etwas darüber:

Severity and Description  Path  Resource  Location  Creation Time  Id
Error launching external scanner info generator (gcc -E -P -v -dD 
D:/Gruenenwald/MSP430_Eclipse_Projects/.metadata/.plugins/org.eclipse.cd 
t.make.core/specs.c)     G-Sens  Unknown  1184741400416  3193

von Christian R. (supachris)


Angehängte Dateien:

Lesenswert?

Das is kein schlimmer Fehler, sondern nur eine Warnung. Der Build läuft 
ja trotzdem durch. Kann man leicht abstellen:

Window -> Preferences und dann nach Bild

von reflection (Gast)


Lesenswert?

Danke, das hat funktioniert! Langsam aber sicher komme ich dem Ziel 
näher :o) Eine Frage noch: Wie finde ich raus wie gross mein Code ist? 
Ist das das .elf File???? Hoffe ja nicht, das hat jetzt schon 80kb und 
mein MSP hat ja nur 60k...

Greets

von Christian R. (supachris)


Angehängte Dateien:

Lesenswert?

Neenee, im .elf sind noch die ganzen Debug-Infos usw drinne. es gibt ein 
Konsolenprogramm, das man als Build Step nach dem Kompilieren ausführen 
kann, siehe Bild. Musst natürlich den Filenamen ersetzen.

von reflection (Gast)


Lesenswert?

Salu zusammen

Es funktioniert freu! Habe es endlich zum laufen gebracht. An was es 
schlussendlich genau lag weiss ich aber nicht. Auf einmal ging es und 
seit da läuft es ohne Probleme :o)

Zum sprintf: Die funktion existiert zwar, hat aber keine Floatingpoint 
Unterstützung. Habe nun meinen Float folgendermassen aufbereitet:

float acc_x = SCA3000_Read_16Bit(0x05);     // X-Wert auslesen SCA3000
    acc_x -= 0.04;                      // Rudimentäre Offsetkorrektur 
:-)
    if (acc_x < 0)
    {
       sign = -1;
    }
    else
    {
      sign = 1;
    }
    sprintf(x_axis, "x:%c%i.%03ig", (sign == 1) ? '+' : 
'-',(int)acc_x*sign,(int)(modf(acc_x,&tempf)*1000.0)*sign);           // 
X-Wert in String schreiben

Was meint ihr dazu? Geht das einfacher (und Resourcen sparender)?
Funktionieren tut es, das habe ich getestet, aber ich denke es ist halt 
nicht "so schön"

Greets reflection

von Christian R. (supachris)


Lesenswert?

Ressourcensparender halt ohne Kommarechnung....und 
Harware-Multiplizierer benutzen!

von reflection (Gast)


Lesenswert?

Da ich echt noch nicht der Superprogrammierer bein muss ich leider 
fragen wie man das mit dem Hardware Multiplier macht. Habe in dem MSP 
Buch das ich gekauft habe zwar was finden können, aber das wird alles in 
ASM erklärt und ich verstehe wenn überhaupt dann nur C...

Wie meinst Du das mit Kommarechnung? Ich bekomme ja einen Binärwert aus 
dem Sensor und das ist ja eigentlich schon ein Float, sobald ich ihn mit 
den Steps umrechne...

Greets

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.