Pagina 1 di 2

Conversione da intero a stringa con PIC 18f452

MessaggioInviato: 26 apr 2013, 10:20
da alukard990
Salve a tutti,
ho scritto questo semplice codice di conversione da intero a stringa :
Codice: Seleziona tutto
#include <stdio.h>
#include <string.h>

void intTostring(int number, char* output)
{
char buffer[3]; // 3 digit buffer
sprintf(buffer,"%d", number);
strcpy(output, buffer);
}


per visualizzare il risultato ho collegato il PIC ad un hitachi 44780. La conversione funziona ma il compilatore mi indica il seguente warning "type qualifier mismatch in assignment" alla riga 7, potreste indicarmi dove sbaglio? Grazie mille :-)

Re: Conversione da intero a stringa con PIC 18f452

MessaggioInviato: 26 apr 2013, 10:53
da DirtyDeeds
Leggi questa discussione sul forum della microchip.

Però lasciati dire che quella funzione, per come è fatta, è abbastanza uno spreco ;-) Piuttosto definisci una macro:

Codice: Seleziona tutto
#define INTTOSTRING(number,output) sprintf((output), "%d", (number))


o se proprio vuoi definire una funzione, elimina il buffer, tanto c'è già output (purché tu l'abbia dimensionato correttamente nel codice chiamante):

Codice: Seleziona tutto
void inttostring(int number, char* output)
{
  sprintf(output,"%d", number);
}

Re: Conversione da intero a stringa con PIC 18f452

MessaggioInviato: 26 apr 2013, 11:12
da alukard990
mi scuso per la mia "nabbaggine" ma da poco mi sto approcciando a questo mondo, comunque grazie per il consiglio lo terrò a mente

Re: Conversione da intero a stringa con PIC 18f452

MessaggioInviato: 26 apr 2013, 12:10
da alukard990
Ho letto il manuale utente del compilatore C18, se ho capito bene la sprintf i float non li converte giusto?

Re: Conversione da intero a stringa con PIC 18f452

MessaggioInviato: 26 apr 2013, 19:46
da DirtyDeeds
Non conosco il C18, i microcontrollisti ti sapranno dire qualcosa di più, ma mi sembra ragionevole che la printf per un microcontrollore non abbia implementate tutte le specifiche di formato: è una funzione complessa e implementarla completamente porterebbe via parecchia memoria al micro. Meglio allora se ti fai tu una funzione di conversione da floating point a stringa, tenendo conto dei limiti dei numeri che devi trattare.

Re: Conversione da intero a stringa con PIC 18f452

MessaggioInviato: 27 apr 2013, 11:03
da alukard990
Volendo fare una funzione di conversione come dovrei ragionare? Non so da dove cominciare (non voglio alcun codice,altrimenti come imparo :-) )

Re: Conversione da intero a stringa con PIC 18f452

MessaggioInviato: 27 apr 2013, 11:35
da posta10100
alukard990 ha scritto:Non so da dove cominciare

Potresti cominciare da qui.

Descrive come un numero a virgola mobile è implementato in memoria.
Da li poi puoi scrivere la funzione per convertirlo in stringa.

O_/

Re: Conversione da intero a stringa con PIC 18f452

MessaggioInviato: 28 apr 2013, 14:10
da alukard990
Per quanto riguarda la conversione da intero a stringa poiché lo schermo LCD accetta in input solo stringhe di caratteri, ho convertito un intero secondo questo codice (senza usare la sprintf):
Codice: Seleziona tutto
#include "myfunction.h"

void intTostring(int number,char* output)
{
int i=0;
unsigned int divisore=1000;
for(i=0;i<4;i++)
{
  output[i]=(number/divisore)+0x30;
  number=number%divisore;
  divisore=divisore/10;
}
}

Ho usato un vettore di char con 4 locazioni poiché il mio progetto riguarda acquisizione di un segnale analogico su 10 bit. Per la conversione dei float vi farò sapere al più presto

Re: Conversione da intero a stringa con PIC 18f452

MessaggioInviato: 28 apr 2013, 19:02
da IvanSB
alukard990 ha scritto:Salve a tutti,
ho scritto questo semplice codice di conversione da intero a stringa :
Codice: Seleziona tutto
#include <stdio.h>
#include <string.h>

void intTostring(int number, char* output)
{
char buffer[3]; // 3 digit buffer
sprintf(buffer,"%d", number);
strcpy(output, buffer);
}


per visualizzare il risultato ho collegato il PIC ad un hitachi 44780. La conversione funziona ma il compilatore mi indica il seguente warning "type qualifier mismatch in assignment" alla riga 7, potreste indicarmi dove sbaglio? Grazie mille :-)


Starei attento a quel char[3].
la famiglia printf opera su C string che quindi includono lo \0 a fine stringa. Da cui 3 cifre -> 4 char.
Il sistema è contorto, non si capisce perché il giro con strcpy, la extra chiamata a funzione e il buffer supplementare specialmente in ambito embedded.

Per una roba del genere anche se in ambito embedded per questioni di memoria/risorse si può essere più tolleranti nell'uso delle macro io eviterei.

Guarda come è definita la sprintf, potrebbe essere che stai usando un char mentre è definita su unsigned char o whatever.

Prova a fare cast sia sul format che cambiare tipo al buffer.

Su embedded visto che la famiglia printf è un bel malloppone e può consumare parecchio stack può essere che manchi di qualche cosa o sia implementata diversamente dallo std. Vale la pena farsi una cultura.

Giacchè stai usando un display magari ti avrai bisogno di diverse funzionalità della famiglia delle funzioni printf e quindi potrebbe non essere il tuo caso ma appunto considerando il precedente paragrafo potrebbe essere conveniente che tu ti scriva un set di funzioni per conversioni. Occhio però ai buffer overflow per esempio.

Va beh mi darei un 4 in italiano ma non ho voglia di sistemare.

Re: Conversione da intero a stringa con PIC 18f452

MessaggioInviato: 29 apr 2013, 0:00
da TardoFreak
In questo articolo puoi trovare alcune funzioni utili.