Forum: Mikrocontroller und Digitale Elektronik Problem mit atol (Schrittmotorsteuerung)


von Christian (Gast)


Lesenswert?

Ich verwende ein ATMEGA32 für die ansteuerung einiger Schrittmotoren...
Hier ist es natürlich zweckmäßig... für größere Verfahrwege die aktuelle 
Position sowie die "Fahraufträge" mit dem Typ LONG zu speichern...
Bei der konvertierung der über die UART Schnittstelle reinkommenden 
Zahlen gibt es allerdings probleme:

anscheinend funktioniert die "atol" funktion nicht richtig. mit "atoi" 
wie im Beispiel angegeben funktioniert alles (natürlich nur bis die 
Anzahl der schritte größer als der int wird)... sobald ich das mit 
"atol" ersetze wird xdestination immer =0... für größere Zahlen ergibt 
sich allerdings ein wert: z.B. eingabe:1000000 -> xdestination=15...

hat jemand eine Idee??
Vielen Dank im Voraus
Christian

P.S.: Sorry für den grausamen code :-D

Code:
<-schnipp

unsigned char in_data[110];
unsigned char out_data[110];
int verbose;
long  x_actual=0;
long  x_destination=0;
long  temp_long;


  if (strncmp(in_data,"xsteptorel=",11) == 0)
  {
//    x_destination = x_actual + (2 * atoi((&in_data[11])));
     x_destination = x_actual + (2 * atol((&in_data[11])));
      if (verbose == 1)
    {
      temp_long = atol((&in_data[11]));
      UARTWrite("Fahre jetzt ");
      sprintf(out_data, "%d", temp_long);
      UARTWrite(out_data);
        UARTWrite(" Schritte!!!\n\r");
    }

<-schnapp

von Sven P. (Gast)


Lesenswert?

- atoi und atol sind tot, strtoXXX sind aktuell
- 'long' ist in diesem Fall ungünstig, guck lieber mal nach <stdint.h>
- in <inttypes.h> stehen auch Formate für 'sprintf' und Konsorten drin
- welches System benutzt denn \n\r als Zeilentrenner...? grins

von mizch (Gast)


Lesenswert?

1
#include <stdlib.h>
 vergessen?

(Abgesehen vom obligaten Hinweis auf strtol)

von Christian (Gast)


Lesenswert?

hmmm mit strtol hatte ich es auch schon versucht...

also folgende Zeile:
<-schnipp

    x_destination = x_actual + (2 * strtol (&in_data[11],NULL,10));

<- schnapp

war dann an stelle der atol funktion verwendet...
zeigt aber das gleiche Verhalten :-(...
-> das Ergebnis: 0

das long ersetze ich dann mal durch ein int32_t. Sollte aber keine 
verbesserung der Problems bringen oder?

sprintf bringt mir doch nur was für den "Rückweg", oder?... also das 
umwandeln des int in ein chararray... (das funktioniert ja auch schon so 
wies im code ist).

ups... ist \r\n nicht aktuell? Was macht man denn sonst? Sorry hab lange 
nichts mehr programmiert... Hier geht es übrigens um einen ATMEL32, der 
eine Schrittmotorsteuerung ansteuert... Gesetzt werden dir Werte über 
einen Windowsrechner mit LabView :-X...

Grüße
Christian

von Christian (Gast)


Lesenswert?

stdlib.h ist drin... hab ich nur vergessen hier mit reinzukopieren 
:-)...
Sorry...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

>       sprintf(out_data, "%d", temp_long);

Das ist der falsche Formatspezifizierer.

von Klaus W. (mfgkw)


Lesenswert?

... und die falsche Formatierung des Quelltextes; es geht nicht mit 
schnipp und schnapp sondern mit [-c-] am Anfang und [-/-c-] am Ende 
(ohne die Bindestriche.)

Dann sieht der Quelltext schon mal so aus, daß man sich nicht dafür 
entschuldigen muß.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> - welches System benutzt denn \n\r als Zeilentrenner...? grins
Und welches ... als Satzende?  ;-)

von Christian (Gast)


Lesenswert?

rotfl na ihr habt ja ne gute Stimmung hier...
das "..." ist ne ganz blöde Angewohnheit vom mir :-)
sorry...

von Christian (Gast)


Lesenswert?

jaaaa genau das wars...
verwende jetzt %ld und alles ist in Butter...
Hab den Fehler völlig woanders gesucht und erwartet...
Vielen Dank und macht weiter so :-)...

grüße
Christian

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.