Forum: Mikrocontroller und Digitale Elektronik sprintf beim MSP430


von Wolfgang Emmert (Gast)


Lesenswert?

Hi!!

In meinem Programm ist der folgende Code definiert:

;*********************************************************************** 
****************************************
#define      RXTXData R4
#define      bitcount R5
#define      pointer  R6
#include     <msp430x11x2.h>

NAME      PROTOTYP

EXTERN    ausgabestring  ; C-Funktion: berechnet Ausgabestring

PUBLIC    main
PUBLIC    dr_out
..................
..................

  ASEG  0x200
dr_out          DB              15

  ASEG  0x216                           ; Arbeitsvariablen ins RAM
laden
...................
...................
;**********************************************
;* Programmstart                              *
;**********************************************
  ORG    0xF000      ; Programm-Start
;**********************************************
main   MOV.W    #0x280,SP
...................
..................
  CALL  #ausgabestring
............
............

Die zugehörige C-Funktion lautet:

#include <stdio.h>
extern char dr_out[15];
void ausgabestring (unsigned int dr_ref,unsigned int dr_akt)
   {
      float druck;
      druck = (150.0*dr_akt)/dr_ref;
      sprintf(dr_out,"\n%f",druck);
      druck =0;
   }

Die Funktion soll beim Aufruf zwei Werte aus Assembler (R12,R14)
übernehmen, den Quotienten berechnen und das Ergebnis formatiert als
String in die Variable "dr_out" (Speicherplatz im RAM: 0x200 bis
0x214) schreiben. Die Berechnung der Variable "druck" funktioniert
einwandfrei, die Übergabe der beiden Werte ist also richtig erfolgt.
Bei dem Befehl "sprintf(dr_out,"\n%f",druck);" allerdings gibt es
einen Reset und der Wert der Variable "druck" wird nicht in das RAM
geschrieben, obwohl die Syntax des Befehls richtig ist . Wie muß ich
dies berichtigen?
Bei der Compilierung und Linkung des Programms ist keine Fehlermeldung
zu beobachten.
Wer kann mir da helfen? Ich habe die neueste Kickstart-Version von TI
runtergeladen, dürfte also nicht an der Version liegen....

Wolfgang

von Gast (Gast)


Lesenswert?

Welchen MSP430 setzt du ein?
sprintf ist extrem speicherhungrig - trotz fehlerfreier compilierung
hatte ich auch schon bei einigen controllern probleme mit dem code.

von Holger Menges (Gast)


Lesenswert?

Hallo Wolfgang,

probiere es mal mit:
sprintf(dr_out,"\n%f\0",druck);

Wenn ich noch recht weiß gibt es bei sprintf je nach speichermodell
Probleme mit dem Stringende.

Viele Grüße,
Holger

von Wolfgang Emmert (Gast)


Lesenswert?

Ich habe den MSP430 F 1122.

Hallo Holger,

Leider bringt das nichts...

W.E.

von OldBug (Gast)


Lesenswert?

Evtl. hast Du den WatchDog zu empfindlich eingestellt? [s]printf
benötigt viel Zeit...

von Wolfgang Emmert (Gast)


Lesenswert?

Nein, ich hab's probiert, weder wenn ich den WDT abschalte noch wenn
ich das GIE auf 0 setze, ändert sich was.
Gibt's evtl eine Ersatzlösung?

Wolfgang

von sebastian roll (Gast)


Lesenswert?

hi.

bei meiner entwicklungsumgebung von iar muss man die
comiler-option (oder linker?) von "small_write" auf "mid_write"
umstellen, um floating-point-unterstützung bei printf() zu erhalten.

mfg
sebastian

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.