Forse si poteva usare una indicizzazione ed un loop. Poi per inviarlo al LCD, potrebbe passare l' indirizzo della stringa direttamente.
Anno nuovo, forum nuovo.
Mi sa che lascio.
picmicro675
postato il: 04.03.2015, alle ore 07:15
@ Jasson
Io dubito che vai a pescare la posizione esatta di dove la conversione della stringa ha inizio. Potrebbe anche essere che la conversione lascia degli spazi per l MSD ed allinei a destra il risultato della conversione.
Per esempio una LongWordToStr prende 11 bytes di memoria e viene riempita di di spazi a sinistra mentre il penultimo è uno "0" e l' ultimo è uno NULL (byte 0).
Quello che mi indendo io sarebbe di usare le librerie di concatenazione di stringhe e formare la stringa finale. Visto che la concatenazione con il "+" non è compresa dall' interprete.
Anno nuovo, forum nuovo.
Mi sa che lascio.
Jasson
postato il: 04.03.2015, alle ore 10:52
Ho un attimo sperimentato la cosa, e forse ho trovato il problema.
Quando si utilizza la conversione da variabile a stringa, succede che la stringa deve essere almeno lunga quanto la lunghezza massima della variabile.
Esempio, la variabile word è una 16 bit e può contenere i numeri da 0 fino a 65535.
Questo significa che la sua lunghezza massima è di 5 cifre.
Allora per convertire questa variabile in una stringa, io devo creare una stringa lunga almeno 5 caratteri
Dim stringa as string[5]
A questo punto posso convertire la variabile word in una stringa
wordtostr(variabile,stringa)
Però devo sapere che l'allineamento caratteri va da destra verso sinistra, quindi se la variabile contiene ad esempio il numero 67, nella stringa avrò l'ultimo carattere verso destra 7, il penultimo 6, e i primi 3 caratteri sono degli spazi vuoti.
Una volta capito questo, e sapendo il valore della variabile, posso andare a prendere i singoli caratteri e formarmi una stringa da visualizzare.
Quindi creo le mie 3 variabili word, una che contiene il conteggio dell'encoder, una che contiene i millimetri, e l'altra che contiene i centesimi.
Dim cont as word
Dim mm as word
dim cen as word
Poi creo le mie stringhe, 2 per la conversione e la terza per creare il testo da stampare su lcd
Dim str_mm as string[5]
Dim str_cen as string[5]
Dim testo as string[6]
Sapendo che il ogni 100 impulsi dell'encoder mi si sposta l'asse di 5 millimetri, posso calcolare che l'encoder si sposta di 1 millimetri ogni 20 impulsi, quindi dividendo il conteggio per 20 ottengo i millimetri di spostamento
mm=cont/20
Adesso calcolo il resto della divisone
cen=cont mod 20
Sapendo che ogni 100 impulsi dell'encoder mi si sposta l'asse di 5 millimetri, posso anche calcolare che ogni impulso dell'encoder corrisponde ad uno spostamento di 5 centesimi, quindi per ottenere il valore dei centesimi, devo moltiplicare gli impulsi rimasti dalla divisone per 5.
cen=cen*5
Adesso ho i valori di millimetri e centesimi, e li devo convertire in stringhe
wordtostr(mm,str_mm)
wordtostr(cen,str_cen)
Ora sapendo che il massimo numero che dovrò visualizzare in millimetri è 500, prendo soli gli ultimi 3 caratteri della stringa mm e li posiziono in testa alla mia stringa testo
e poi sapendo che i centesimi massimo possono essere 99, prendo gli ultimi due caratteri della stringa cen e li posiziono in fondo alla mia stringa testo
testo[4]=str_cen[3]
testo[5]=str_cen[4]
Ora posso stampare la mia stringa testo sul lcd nella posizione che desidero
lcd_out(1,1,testo)
Jasson
postato il: 04.03.2015, alle ore 11:10
Dato che poi quando i centesimi sono inferiori a 10, il primo carattere della stringa cen è uno spazio vuoto, risulta che pure il quarto carattere della stringa testo sia uno spazio vuoto, allora prima di stampare il testo su lcd posso fare la verifica ed eventuale sostituire lo spazio vuoto con uno zero.
if testo[4]=" " then
testo[4]="0"
end if
La stessa cosa la posso pure fare sui primi 2 caratteri della stringa, se ad esempio invece di visualizzare 4.55 volessi visualizzare 004.55
picmicro675
postato il: 04.03.2015, alle ore 15:37
Non so se conosci il linguaggio, che nemmeno io so. Ho visto nel manuale che si può fare
WordToStrWithZeros(word, str) ed il risultato comporta che ci saranno degli zeri iniziali se la word è piccola. Pag 276.
Che invece WordToStr(word,txt) crea un testo di 5 caratteri con spazi a sinistra se è di valore inferiore alle 5 cifre.
Poi a mio parere trovo il MikroBasic e Proton Basic non son ben strutturati e poco ottimizzati.
Se si vede che anche le routines delle librerie sono delle interpretazioni di Basic si fa presto a consumarsi le 2 Kwords della versione free
Poi basta vedere il listato in assembly.
Anno nuovo, forum nuovo.
Mi sa che lascio.
Jasson
postato il: 04.03.2015, alle ore 16:03
Conosco un pochino Mikrobasic, non sono grande esperto, ma lo conosco.
Esistono decine di istruzioni e quindi modi, per lavorare con le stringhe.
Quello che ho scritto sopra, è uno dei tanti modi per ottenere il risultato voluto.
La differenza tra WordToStr e WordToStrWithZeros è appunto che la prima aggiunge degli spazi vuoti, mentre la seconda mette degli zeri al posto degli spazi vuoti.
Comunque il risultato non cambia, perchè io devo sempre prendere gli ultimi caratteri utili, non mi interessano ne gli zeri ne gli spazi vuoti.
Anzi utilizzando WordToStr, e quindi facendo inserire degli spazi vuoti, potrei volendo con l'istruzione ltrim(stringa) eliminare gli spazi vuoti, e quindi accorciare la mia stringa ai soli caratteri utili.
Potrei utilizzare altri metodi, per arrivare al risultato voluto, tieni conto che esistono almeno una decina di istruzioni, per tagliare, spezzare, incollare, confrontare, diverse stringhe tra di loro, e quindi una stringa me la riesco a gestire come voglio.
sparide74
postato il: 04.03.2015, alle ore 18:12
ciao,jasson, ho provato a scrivere l'ultimo pezzetto del tuo codice, ma non mi visualizza niente sul display....mi sta scoppiando la testa
Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito