Forum: Mikrocontroller und Digitale Elektronik itoa in C18 Compiler will nicht so wie sie soll


von Paul K. (paul-cgn)


Lesenswert?

Hi zusammen,

ich scheitere gerade an einem scheinbar recht simplen Problem.
Für einen pic18F13K50 (ist aber auch unerheblich denke ich) schreibe ich 
ein Program welches schlichtweg den Wert eines Timers per USART ausgeben 
soll.

Dabei will ich den 16bit unsigned int wert des Timers1 also per 
putsUSART() ausgeben (ich nutze die standard usart.h die beim Compiler 
dabei ist: void putsUSART ( char *data); )
Damit das geht versuche ich also den Wert des int in ein char[] 
umzuwandeln mittels der itoa function aus der stdlib.h: char *itoa (auto 
int value, auto char *s);

Aktuell bin ich nu im Simulator von MPLAB X unterwegs und lese da auch 
die Werte beim debuggen aus und lasse mit den UART Output anzeigen, wenn 
ich nur einfach texte rüber schicke klappt das alles, man kann also 
davon ausgehen das es nicht am USART und dessen konfoguration liegt.

Hier nun der relvante code:
1
            unsigned int numberToPrint = 12345;
2
            char str[5];
3
            itoa(numberToPrint, (char*) str);
4
            putsUSART((char*) str);
Was jedoch ausgegeben wird ist in der Output console:
1
24880h
Ich habe beim debuggen gesehen das bereits der Wert von "str" auch eben 
dieses "24880h" ist, somit ist recht eingegrenzt das in dem itoa aufruf 
irgendwas schief läuft. Aber was. Ich habe nun stundenlang rumgegoogelt 
und bisher nur verweise auf "sprintf" gefunden, damit klappt es 
grundsätzlich auch....aber nur EINMAl. Die Zahl wird richtig ausgegeben 
per UART, jedoch hängt sich dabei der Simulator scheinbar immer ziemlich 
auf (er pausiert dann duaernd obwohl es keine breakpoints gibt und der 
PC scheint immer nur im Kreis zu laufen jedoch kann ich an die 
entsprechende Stelle im Code springen....kein plan) da ich aber eh 
gelesen habe das sprintf sehr ressourcenfressend sein soll würde ich 
gerne itoa nutzen das ja eigentlich genau da machen sollte was ich will.

Jemand eine Idee was ich falsch mache? Ich werd bekloppt.

Sofern es wichtig ist hier nur die includes:
1
#include <p18F13K50.h>
2
#include <stdio.h>
3
#include <stdlib.h>
4
#include <timers.h>
5
#include <capture.h>
6
#include <usart.h>
7
#include <delays.h>

von Peter II (Gast)


Lesenswert?

>  unsigned int numberToPrint = 12345;
>  char str[5];
passt ja auch nicht zusammen, ein string braucht am ende ein \0. Also 
brauchst du für 12345 mindestens 6 zeichen.

von Paul K. (paul-cgn)


Lesenswert?

Hoppala, danke dir für die schnelle Antwort, das war aber nicht das 
Problem, nur st der Wert der ausgebeben wird halt:

24880

Code also jetzt:
1
            unsigned int numberToPrint = 12345;
2
            char str[6];
3
            itoa(numberToPrint, (char*) str);
4
            putsUSART((char*) str);

von jibi (Gast)


Lesenswert?

C-Buch!

Langsam nervt ihr...

Gruß Jonas

von jibi (Gast)


Lesenswert?

Und weil eh gleich die Frage kommt, bin ich mal so nett:

http://openbook.galileocomputing.de/c_von_a_bis_z/

Gruß jibi

von Karl H. (kbuchegg)


Lesenswert?

Paul K. schrieb:
> Hoppala, danke dir für die schnelle Antwort, das war aber nicht das
> Problem, nur st der Wert der ausgebeben wird halt:
>
> 24880

Spätestens jetzt ist ein Blick ins Compiler-Handbuch angebracht bzw. in 
sonstige Doku.

Denn auch wenn itoa keine C-Standardfunktion ist, so sind doch die 
Paramter bei so gut wie allen Implementierungen gleich. Nämlich
1
char *  itoa ( int value, char * str, int base );
die dritte Angabe, die Zahlenbasis fehlt bei deinem itoa. Damit ist 
klar, dass das irgendeine compilerspezifische Spezialversion deines 
Compilers ist. Und da hilft dann nur noch ein Blick in die Doku.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Paul K. schrieb:
> unsigned int numberToPrint = 12345;
> char str[5];

Das ist zu wenig.

Wie lang ist ein String, in den 5 Zeichen passen?

Richtig: 6 Zeichen. Nie die abschließende \0 vergessen.

Also muss es (mindestens) heißen:

> char str[6];

itoa erwartet einen int, kein unsigned int. Also wird, sofern der Wert 
größer ist als 32767, der Wert als negativer Wert interpretiert und noch 
ein Minuszeichen davor ausgegeben. Damit muss Dein Puffer noch Platz für 
ein weiteres Zeichen bieten.

> char str[7];

Dieses Puffergrößenproblem wird die Ursache dafür sein, daß Dein 
printf-Versuch nur einmal glückt -- danach ist irgendwelcher Speicher 
überschrieben und es können merkwürdige Dinge geschehen.


Initialisiere Deinen Puffer, bevor Du itoa aufrufst, dann kannst Du 
überprüfen, ob diese Funktion überhaupt irgendwas macht.




> itoa(numberToPrint, (char*) str);
> putsUSART((char*) str);

Was soll hier der Typecast nach char*?

von Karl H. (kbuchegg)


Lesenswert?

Im übrigen ist itoa sowieso die falsche Funktion. itoa will einen int - 
also signed. Du hast keinen int. Du hast einen unsigned int. Die 
korrekte Funktion dafür ist utoa und nicht itoa. Das erklärt allerdings 
nicht die Diskrepanz bei diesem Zahlenwert.

: Bearbeitet durch User
von Paul K. (paul-cgn)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Paul K. schrieb:
>> Hoppala, danke dir für die schnelle Antwort, das war aber nicht das
>> Problem, nur st der Wert der ausgebeben wird halt:
>>
>> 24880
>
> Spätestens jetzt ist ein Blick ins Compiler-Handbuch angebracht bzw. in
> sonstige Doku.
>
> Denn auch wenn itoa keine C-Standardfunktion ist, so sind doch die
> Paramter bei so gut wie allen Implementierungen gleich. Nämlich
>
1
> char *  itoa ( int value, char * str, int base );
2
>
> die dritte Angabe, die Zahlenbasis fehlt bei deinem itoa. Damit ist
> klar, dass das irgendeine compilerspezifische Spezialversion deines
> Compilers ist. Und da hilft dann nur noch ein Blick in die Doku.

Das das keine C-Standardfunktion ist war mir bekannt, daher hilft mir 
der Galileo link nicht so recht weiter.

Bei dem C18 Compiler (v3.41) den ich verwende ist die Signatur jedoch 
abweichend zu deinem Beispiel nur mit zwei Parametern (wie ich oben 
bereits geschrieben habe, da war der Auszug aus der stdlib.h die zum 
Lieferumfang des C18 gehört). Ausserdem ware die Signatur abweichend 
würde das ganze ja nicht mal kompilieren, das tut es aber ohne murren.

Die Doku der Funktion selbst hilft mir nicht so recht weiter:
1
char *itoa (auto int value, auto char *s);
2
/** @name ltoa
3
 * The {\bf ltoa} function converts the {\bf long} value {\bf value} to 
4
 * a radix 10 string representation, storing the resultant string into
5
 * the location pointed to by {\bf s}.
6
 *
7
 * The {\bf ltoa} function is an MPLAB-Cxx extension to the ANSI required
8
 * libraries and may not be present in other implementations.
9
 * @param value value to convert
10
 * @param s pointer to destination string object
11
 * @return The {\bf ltoa} function returns the value of {\bf s}.
12
 */
Leider auch im Handbuch keine weiteren Hinweise oder Beispiele.

von Paul K. (paul-cgn)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Im übrigen ist itoa sowieso die falsche Funktion. itoa will einen int -
> also signed. Du hast keinen int. Du hast einen unsigned int. Die
> korrekte Funktion dafür ist utoa und nicht itoa. Das erklärt allerdings
> nicht die Diskrepanz bei diesem Zahlenwert.

Danke für deine Antwort Karl Heinz, das mit dem "unsigned int" vs "int" 
habe ich auch schon durch, leider absolut gleiches Ergebnis, es macht 
keinen unterschied in dem Fall.

von Dirk (Gast)


Lesenswert?

Versuch mal
str = itoa(numberToPrint, (char*) str);

>  * @return The {\bf ltoa} function returns the value of {\bf s}.
>  */[/C]

von Karl H. (kbuchegg)


Lesenswert?

Wie oft hast du in deinem restlichen Programm diesen Array_zu_klein 
Fehler noch gemacht?

Auf Deutsch: So ist erst mal kein Problem mehr ersichtlich. Das es 
trotzdem nicht funktioniert kann natürlich auch daran liegen, dass im 
restlichen Programm noch so einiges nicht stimmt und du das System 
zerschossen hast.


----> minimales Beispielprogramm zusammenstellen und posten.
am besten ein Beispielprogramm, welches tatsächlich nur dieses utoa und 
die UART Ausgabe enthält und sonst nichts anderes.

von Peter II (Gast)


Lesenswert?

Dirk schrieb:
> Versuch mal
> str = itoa(numberToPrint, (char*) str);

das ist doch unsinn, wie soll man denn str ändern können, wenn es eine 
array auf dem Stack ist.

von Paul K. (paul-cgn)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Paul K. schrieb:

> itoa erwartet einen int, kein unsigned int. Also wird, sofern der Wert
> größer ist als 32767, der Wert als negativer Wert interpretiert und noch
> ein Minuszeichen davor ausgegeben. Damit muss Dein Puffer noch Platz für
> ein weiteres Zeichen bieten.
>
>> char str[7];
>
> Dieses Puffergrößenproblem wird die Ursache dafür sein, daß Dein
> printf-Versuch nur einmal glückt -- danach ist irgendwelcher Speicher
> überschrieben und es können merkwürdige Dinge geschehen.

Hallo Rufus, vielen Dank für deine Antwort. Ich habe auch mit einer 
Array-Größe von 7 das gleiche Problem.
Bei dem printf nutze ich übrgens den char[] garnicht, da übergebe ich 
schlicht die int variable und lasse printf die Formatierung machen (%i). 
Somit ist die Lange da vermultich nicht das Problem gewesen
>
>
> Initialisiere Deinen Puffer, bevor Du itoa aufrufst, dann kannst Du
> überprüfen, ob diese Funktion überhaupt irgendwas macht.
>
hab ich gemacht, initialisiert mit "000000" (im debugger verifziert, war 
"000000\u0x0") und dann nach dem itoa nochmal geprüft, steht dann auch 
der neue "24880\u0x0\u0x0"

>
>
>> itoa(numberToPrint, (char*) str);
>> putsUSART((char*) str);
>
> Was soll hier der Typecast nach char*?

Der Typecast ist nur für den Compiler damit er nicht meckert. Er macht 
sonst einen impliziten Cast aber gibt immer eine Warnung aus, mit dem 
cast kommt die halt nicht, hat also rein optische Gründe beim 
kompilieren. Macht keinen unterschied bezüglich der Konvertierung in der 
itoa

von Steel (Gast)


Lesenswert?

Versuch mal

static char str[7];

statt

char str[5];

von Paul K. (paul-cgn)


Lesenswert?

Steel schrieb:
> Versuch mal
>
> static char str[7];
>
> statt
>
> char str[5];

Leider kein Erfolg.
Hier nun der gesammte Code mit allem anderen Entfernt (naja fast, die 
Config bits sind sicherlich nicht alle nötig) was nicht nötig ist für 
das Beispiel, die Ausgabe ist noch immer die selbe in der Console 
(24880).
1
#include <p18F13K50.h>
2
#include <stdlib.h>
3
#include <usart.h>
4
#include <delays.h>
5
6
// PIC18F13K50 Configuration Bit Settings
7
// CONFIG1L
8
#pragma config CPUDIV = NOCLKDIV// CPU System Clock Selection bits (No CPU System Clock divide)
9
#pragma config USBDIV = OFF     // USB Clock Selection bit (USB clock comes directly from the OSC1/OSC2 oscillator block; no divide)
10
11
// CONFIG1H
12
#pragma config FOSC = IRC       // Oscillator Selection bits (Internal RC oscillator)
13
#pragma config PLLEN = OFF      // 4 X PLL Enable bit (PLL is under software control)
14
#pragma config PCLKEN = ON     // Primary Clock Enable bit (Primary clock is under software control)
15
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor disabled)
16
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
17
18
// CONFIG2L
19
#pragma config PWRTEN = ON      // Power-up Timer Enable bit (PWRT enabled)
20
#pragma config BOREN = OFF      // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
21
#pragma config BORV = 19        // Brown-out Reset Voltage bits (VBOR set to 1.9 V nominal)
22
23
// CONFIG2H
24
#pragma config WDTEN = OFF      // Watchdog Timer Enable bit (WDT is controlled by SWDTEN bit of the WDTCON register)
25
#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)
26
27
// CONFIG3H
28
#pragma config HFOFST = OFF      // HFINTOSC Fast Start-up bit (HFINTOSC starts clocking the CPU without waiting for the oscillator to stablize.)
29
#pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RA3 input pin disabled)
30
31
// CONFIG4L
32
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
33
#pragma config LVP = OFF        // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
34
#pragma config BBSIZ = OFF      // Boot Block Size Select bit (512W boot block size)
35
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
36
37
// CONFIG5L
38
#pragma config CP0 = OFF        // Code Protection bit (Block 0 not code-protected)
39
#pragma config CP1 = OFF        // Code Protection bit (Block 1 not code-protected)
40
41
// CONFIG5H
42
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block not code-protected)
43
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
44
45
// CONFIG6L
46
#pragma config WRT0 = OFF       // Table Write Protection bit (Block 0 not write-protected)
47
#pragma config WRT1 = OFF       // Table Write Protection bit (Block 1 not write-protected)
48
49
// CONFIG6H
50
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers not write-protected)
51
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot block not write-protected)
52
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
53
54
// CONFIG7L
55
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 not protected from table reads executed in other blocks)
56
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 not protected from table reads executed in other blocks)
57
58
// CONFIG7H
59
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot block not protected from table reads executed in other blocks)
60
61
//----------------------------------------------------------------------------
62
63
void main(void);
64
//----------------------------------------------------------------------------
65
// Main routine
66
void main() {
67
    OSCCONbits.IRCF = 0b101;
68
    OpenUSART(USART_TX_INT_OFF & // Trasnmit interrupt off
69
            USART_ASYNCH_MODE & // Use USART in asynchronous mode
70
            USART_EIGHT_BIT & // Eight bits for data
71
            USART_CONT_RX &// Enable continous receiving
72
            USART_BRGH_LOW, // Dont use baud rate multiplier
73
            12); // SPBRG value for a BR of 9600
74
75
    while (1) {
76
        int numberToPrint = 12345;
77
        static char str[7] = "000000";
78
        itoa(numberToPrint, str);
79
        putsUSART(str);
80
        Delay10KTCYx(10);
81
    }
82
}

: Bearbeitet durch User
von Steel (Gast)


Lesenswert?

Kommentier mal das itoa aus.

so:
        static char str[7] = "12345";
   //     itoa(numberToPrint, str);
        putsUSART(str);

btw: Du hattest schon wieder eine '0' zu viel in deinem String!!!

von Karl H. (kbuchegg)


Lesenswert?

> Der Typecast ist nur für den Compiler damit er nicht meckert. Er macht sonst 
einen impliziten Cast

Ein Cast von char* auf char*
Und dann verschwindet eine Warnung des Compilers?

Da steckt mehr dahinter, das muss dich stutzig machen.
Wie lautet die Warnung?

: Bearbeitet durch User
von Paul K. (paul-cgn)


Lesenswert?

Steel schrieb:
> Kommentier mal das itoa aus.
>
> so:
>         static char str[7] = "12345";
>    //     itoa(numberToPrint, str);
>         putsUSART(str);
>
> btw: Du hattest schon wieder eine '0' zu viel in deinem String!!!

Ausgabe ist korrekt via UART: 00000
wie gesagt text geht ja auch korrekt über UART, U(S)RAT selbst scheint 
also richtig konfiguriert.
(Null habe ich auch entfernt)

: Bearbeitet durch User
von Paul K. (paul-cgn)


Lesenswert?

Karl Heinz Buchegger schrieb:
>> Der Typecast ist nur für den Compiler damit er nicht meckert. Er macht sonst
> einen impliziten Cast
>
> Ein Cast von char* auf char*
> Und dann verschwindet eine Warnung des Compilers?
>
> Da steckt mehr dahinter, das muss dich stutzig machen.
> Wie lautet die Warnung?

Hallo Heinz, sorry, da hab ich tatsächlich einen Cast zu viel gemacht, 
wie du oben im Beispiel siehst, ist der Cast nun raus (uns es kommt 
keine Warnung).
Einen Cast musste ich nur bei einem putrsUSART(...) machen:
putrsUSART((const rom far char *)"\r\nNothing to do");
Aber das ist in dem Beispiel nicht mehr drinnen und soll nun auch nicht 
weiter Thema sein.

Das kommt dabei raus wenn man stundenlang nach jedem Zweig greift um das 
Problem zu beheben :-)

von Steel (Gast)


Lesenswert?

itoa mal mit anderen Zahlen gefütter? Was passiert bei ner Null? Den 
Wert mal als Konstante direkt beim itoa aufruf reingeschrieben?

von Jürgen S. (Firma: privat) (jschmied)


Lesenswert?

Hallo!

Probier doch mal das Minimum im Simulator aus:

void main() {
    int numberToPrint = 12345;
    char str[7] = "000000";
    itoa( numberToPrint, str );
}

Im Schrittmodus steht nach itoa bei mir tatsächlich "12345\\0\\0" im 
String.
Alles andere hätte mich auch gewundert ...

vg

Jürgen

von Karl H. (kbuchegg)


Lesenswert?

Paul K. schrieb:

> Das kommt dabei raus wenn man stundenlang nach jedem Zweig greift um das
> Problem zu beheben :-)

OK. mach mal folgendes.
Schreib eine eigene Version von itoa
1
void myUtoa( unsigned int num, char* str )
2
{
3
  unsigned char i;
4
5
  for( i = 0; i < 5; ++i )
6
  {
7
    str[4-i] = ( num % 10 ) + '0';
8
    num = num / 10;
9
  }
10
  str[5] = '\0';
11
}

damit man mal feststellen kann, ob es ein Problem mit dem utoa oder mit 
den UART Sachen im Zusammenhang mit char-Arrays gibt, die vom Optimizer 
(wegen dem ihm bekannten konstanten String) bereinigt hat.

: Bearbeitet durch User
von Paul K. (paul-cgn)


Lesenswert?

Jürgen Schmied schrieb:
> Hallo!
>
> Probier doch mal das Minimum im Simulator aus:
>
> void main() {
>     int numberToPrint = 12345;
>     char str[7] = "000000";
>     itoa( numberToPrint, str );
> }
>
> Im Schrittmodus steht nach itoa bei mir tatsächlich "12345\\0\\0" im
> String.
> Alles andere hätte mich auch gewundert ...
>
> vg
>
> Jürgen

Hab folgendes super minimal program probiert:
1
#include <stdlib.h>
2
#include <delays.h>
3
4
//----------------------------------------------------------------------------
5
6
void main(void);
7
//----------------------------------------------------------------------------
8
// Main routine
9
void main() {
10
11
        int numberToPrint = 12345;
12
        static char str[7] = "00000";
13
        itoa(numberToPrint, str);
14
        Nop();
15
}
Leider steht nach dem itoa
rommelwirbel
wieder "24880\u0x0\u0x0" als wert drin :-(

von Paul K. (paul-cgn)


Lesenswert?

Karl Heinz, danke dir! Mit deiner customer Funktin geht es :-))))))

Wobei mir absolut nicht klar ist warum die itoa vom c18 compiler nicht 
geht :-(

von Jürgen S. (Firma: privat) (jschmied)


Lesenswert?

Sehr komisch. Bei mir (MPLABX 1.85 & C18 3.46 & Debugger = Simulator) 
geht es !

: Bearbeitet durch User
von Paul K. (paul-cgn)


Lesenswert?

nutze noch MPLAB X v 1.30
Vielleicht sollte ich mal updaten :-)

von Jürgen S. (Firma: privat) (jschmied)


Lesenswert?

Prüfe mal den Bibliothekspfad vieleicht hast Du XC8 und C18 Bibliotheken 
gemeinsam auf Deinem Rechner ???
Oder zwei Versionen des C18? MPLAB alt??

: Bearbeitet durch User
von Paul K. (paul-cgn)


Lesenswert?

Jürgen Schmied schrieb:
> Prüfe mal den Bibliothekspfad vieleicht hast Du XC8 und C18 Bibliotheken
> gemeinsam auf Deinem Rechner ???
> Oder zwei Versionen des C18? MPLAB alt??

XC8 hab ich nicht drauf, hab noch einen C30 Compiler drauf, aber C18 ist 
auf default und auch nur der ist in dem Projekt angewählt.
Pfade sind alle Standard, da hab ich nix angepast.

Ich werde mal mplab x neu installieren, wollte das eh in eine virtuelle 
Maschine umziehen. Dann ist alles Frisch und dann versuche ich es 
nochmal.

Vielen Dank an alle die konstruktiv geantwortet haben!

von Jürgen S. (Firma: privat) (jschmied)


Lesenswert?

>Karl Heinz, danke dir! Mit deiner customer Funktin geht es :-))))))

Ich würde dem Frieden nicht trauen. itoa läuft nicht erst seit der 
letzten Version des Compilers. Wenn Du die jetzt selbst realisierst 
wette ich, dass es bei einer der nächsten Bibliotheksfunktionen 
knallt...
Das ist irgendetwas Grundlegendes falsch.
Schau mal ins Disassembly-listing, welche itoa überhaupt reingelinkt 
wird - da stehen Dateinamen der Quellen drin.

vg

Jürgen

von Paul K. (paul-cgn)


Lesenswert?

Jürgen Schmied schrieb:
>>Karl Heinz, danke dir! Mit deiner customer Funktin geht es :-))))))
>
> Ich würde dem Frieden nicht trauen. itoa läuft nicht erst seit der
> letzten Version des Compilers. Wenn Du die jetzt selbst realisierst
> wette ich, dass es bei einer der nächsten Bibliotheksfunktionen
> knallt...
> Das ist irgendetwas Grundlegendes falsch.
> Schau mal ins Disassembly-listing, welche itoa überhaupt reingelinkt
> wird - da stehen Dateinamen der Quellen drin.
>
> vg
>
> Jürgen

Danke dir Jürgen das du der Sache noch auf den Grund gehen willst.
Im Disassembly-Listing steht tatsächlich ein Pfad drin 
"C:/MCC18/src/traditional/stdclib/itoa.asm" den es garnicht gibt(!). [Da 
ist auch kein unsichtbarer Systemordner oder sowas] Aber woher kommt 
dann der assembler code dazu her? Wie dem auch sei, ich habe eingesehen 
das mit meiner Installation wohl was im Eimer ist. Ich werde euch 
nochmal berichten wenn es Frisch aufgesetzt ist.

von Karl H. (kbuchegg)


Lesenswert?

Paul K. schrieb:

> Im Disassembly-Listing steht tatsächlich ein Pfad drin
> "C:/MCC18/src/traditional/stdclib/itoa.asm" den es garnicht gibt(!). [Da
> ist auch kein unsichtbarer Systemordner oder sowas] Aber woher kommt
> dann der assembler code dazu her?

langsam.
Der Originalcode stand mal auf diesem Verzeichnis.
Irgendwer hat dann mal alle Einzelteile, die zusammen die 
Standard-Library bilden hergenommen und eine echte Library gebaut, die 
vom Linker dann als Ganzes mit dazugelinkt wird.

Jetzt erhebt sich die Frage, ob jemand anderer, der dasselbe System hat, 
dasselbe ausprobiert und dort die gleichen Pfade sieht oder nicht.

von Jürgen S. (Firma: privat) (jschmied)


Lesenswert?

Habe im Angebot:

E:/c18v3.46/pic18-lt/cxx-framework/src/traditional/stdclib/itoa.asm

Die Verzeichnisnamen sehen nach einer Umorganisation aus. Hole Dir doch 
mal den neusten C18 Compiler.

vg

Jürgen

: Bearbeitet durch User
von Paul K. (paul-cgn)


Lesenswert?

So, kurzes update: Nach Neuinstallation von MPLAB X (v1.90) und C18 
Compiler klappt nun alles. Naja, zumindest mit dem itoa.
Beim Versuch den pic zu programmieren hat mir MPLAB X dann beim Download 
einer neuen Firmware mit neuem 'AP' und 'RS' den Pickit3 gebricked, 
jetzt steht ich erst mal wieder ohne da und er wird nicht mehr erkannt 
unter windows :-(
Aber das andere Problem ist gelöst.

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.