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
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
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.
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
Welche Version der MSPGCC Toolchain hast du? Bei mir klappts nur mit der vom Mai 2006. Alle neueren sind kaputt.
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
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.
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
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.
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.
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
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.
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
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.
Ok, bin dran das zu ändern. Danke schon einmal! Werde allfälligen Erfolg oder Misserfolg posten! Grüsse reflection
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
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.
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?
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....
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
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
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
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.
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
Ressourcensparender halt ohne Kommarechnung....und Harware-Multiplizierer benutzen!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.