www.mikrocontroller.net

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


Autor: Christian (Gast)
Datum:

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

Autor: Sven P. (haku) Benutzerseite
Datum:

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

Autor: mizch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <stdlib.h>
 vergessen?

(Abgesehen vom obligaten Hinweis auf strtol)

Autor: Christian (Gast)
Datum:

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

Autor: Christian (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht lesenswert
>       sprintf(out_data, "%d", temp_long);

Das ist der falsche Formatspezifizierer.

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Christian (Gast)
Datum:

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

Autor: Christian (Gast)
Datum:

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

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.