Tu hai una variabile che mi pare sia UpDown che conta gli impulsi.
Quando tu visualizzi 0, questa variabile è a quota 0.
Se tu dai un impulso indietro, e quindi un decremento, teoricamente questa variabile dovrebbe diventare negativa.
Però non diventa negativa, perchè è una variabile di soli numeri positivi, quindi al posto di andare a -1 ricomincia da capo ovvero 4294967295
Per visualizzare uno, teoricamente basta fare la differenza 4294967295-conteggio.
Ma è sbagliato il concetto.
L'azzeramento lo devi fare a finecorsa.
Ovvero quando la tua variabile di conteggio è uguale a zero, devi essere a finecorsa, ovvero l'encoder non può andare più indietro di così, quindi la tua variabile non potrà mai diventare minore di zero.
picmicro675
postato il: 04.03.2015, alle ore 20:08
program Lcd 'Pic16f628A
' Lcd module connections
dim LCD_RS as sbit at RB0_bit
LCD_EN as sbit at RB1_bit
LCD_D4 as sbit at RB2_bit
LCD_D5 as sbit at RB3_bit
LCD_D6 as sbit at RA0_bit
LCD_D7 as sbit at RA1_bit
LCD_RS_Direction as sbit at TRISB0_bit
LCD_EN_Direction as sbit at TRISB1_bit
LCD_D4_Direction as sbit at TRISB2_bit
LCD_D5_Direction as sbit at TRISB3_bit
LCD_D6_Direction as sbit at TRISA0_bit
LCD_D7_Direction as sbit at TRISA1_bit
' End Lcd module connections
dim CH_A as bit 'Lettura canale A Encoder
CH_B as bit 'Lettura canale B Encoder
CH_A1 as bit 'Lettura precedente canale A Encoder
CH_B1 as bit 'Lettura precedente canale B Encoder
UpDown as longword
milli as word
cents as byte
txtlen as byte
While true
milli = UpDown / 100
cents = UpDown mod 100
Wordtostr(milli,txt1)
bytetostr(cents,txt2)
ltrim(txt1)
ltrim(txt2)
if strlen(txt2) < 2 then
strappendpre("0",txt2)
end if
strappendsuf(txt1,".")
strcat(txt1,txt2)
Lcd_Out(1,7,Txt1)
Wend
end.
Con il simulatore di MikroBasic la variabile txt1 appare corretta. Non potendo simulare perfettamente il display o l'encoder, resta che caricarlo nel micro e provare a girare l' encoder.
Questo è la procedura con le funzioni disponibili di mikrobasic.
Si potrebbe usare strcat2(txt1,txt2,txt5) ma non mi risulta corretta.
PS è bello avere una discussione su questo basic
Anno nuovo, forum nuovo.
Mi sa che lascio.
picmicro675
postato il: 04.03.2015, alle ore 20:10
Ah! ma allora ci vuole un Signed Long.
Poi ancora manca anche la fase di azzeramento e impostazioni quote.
Anno nuovo, forum nuovo.
Mi sa che lascio.
sparide74
postato il: 04.03.2015, alle ore 20:18
le lavorazioni cn visualizzano anche in n° negativi ad esempio asse Z+ valore pos. se azzero la Z sul pezzo, e devo scendere a forare un pezzo deve anche conteggiare il valore neg.......non so se mi sono spiegato
allora provo il tuo codice modif. ho un software simulatore che ha anche il diplay LCD
sparide74
postato il: 04.03.2015, alle ore 20:36
non va , la misura parte da 0 poi subito dopo --> 23592.95 continuando a girare l'encoder in Up --->0.012.95 continuando a girare l'encoder --->10.06.95 -->1000.34.95 e cosi via...
picmicro675
postato il: 04.03.2015, alle ore 20:37
Capisco, anche il fatto di poter usare la parametrizzazione piuttosto di troncare sulla stringa.
Ora ho cambiato
While true
milli = UpDown / 100
cents = UpDown mod 100
longinttostr(milli,txt1)
bytetostr(cents,txt2)
ltrim(txt1)
ltrim(txt2)
if strlen(txt2) < 2 then
strappendpre("0",txt2)
end if
strappendsuf(txt1,".")
strcat(txt1,txt2)
Lcd_Out(1,7,Txt1)
Ma mi fa difetto che la divisione di un numero negativo non risulta corretta.
Anno nuovo, forum nuovo.
Mi sa che lascio.
Jasson
postato il: 04.03.2015, alle ore 21:41
picmicro675: Capisco, anche il fatto di poter usare la parametrizzazione piuttosto di troncare sulla stringa.
Ora ho cambiato
While true
milli = UpDown / 100
cents = UpDown mod 100
longinttostr(milli,txt1)
bytetostr(cents,txt2)
ltrim(txt1)
ltrim(txt2)
if strlen(txt2) < 2 then
strappendpre("0",txt2)
end if
strappendsuf(txt1,".")
strcat(txt1,txt2)
Lcd_Out(1,7,Txt1)
Ma mi fa difetto che la divisione di un numero negativo non risulta corretta.
Prova ad utilizzare variabili integer, che possono assumere anche valori negativi, e vedrai che si dovrebbe risolvere, anche se poi c'è da lavorare un po sulla formattazione della stringa dovuta a segni meno.
sparide74
postato il: 04.03.2015, alle ore 21:54
comunque quando dichiari una stringa es. dim pippo as string[5] in realta' ne sono 6....come da manuale te lo allego:
Alternately, you can handle strings element–by–element. For example:
dim s as string[5]
' ...
s = "mik"
' s[0] is char literal "m"
' s[1] is char literal "i"
' s[2] is char literal "k"
' s[3] is zero
' s[4] is undefined
' s[5] is undefined
Jasson
postato il: 04.03.2015, alle ore 21:58
sparide74: le lavorazioni cn visualizzano anche in n° negativi ad esempio asse Z+ valore pos. se azzero la Z sul pezzo, e devo scendere a forare un pezzo deve anche conteggiare il valore neg.......non so se mi sono spiegato
allora provo il tuo codice modif. ho un software simulatore che ha anche il diplay LCD
A mio avviso anzi che andare a complicarsi la vita con numeri negativi all'interno del codice, è più semplice lavorare solo sui numeri positivi, facendo poi una semplice sottrazione.
Esempio ho un asse che si può spostare al massimo di 500mm.
Ho un encoder che fornisce 100 impulsi ogni 5mm, quindi 10.000 impulsi per l'intera corsa di 500mm.
A questo punto quando vado a fare l'azzeramento pezzo, la variabile di conteggio, non la imposto a zero, ma la imposto a 10.000.
Ora se vado indietro di 500mm, e quindi vado indietro di 10.000 impulsi, la mia variabile di conteggio viene decrementata, ma al massimo può arrivare a zero, non potrà mai essere negativa.
Se viceversa vado avanti di 500mm, ovvero vado avanti di 10.000 impulsi, la mia variabile di conteggio arriva a 20.000, e non può andare oltre.
Fatto questo basta fare una semplice sottrazione per avere lo spostamento corretto.
Se la mia variabile è a quota 10.000 allora sono nel punto zero.
Se la mia variabile è inferiore a 10.000 allora sono sul negativo, faccio la sottrazione 10.000-variabile e vedo di quanti impulsi sono negativo, e aggiungo il segno meno.
Se la mia variabile invece è maggiore di 10.000 allora sono sul positivo, faccio la sottrazione variabile-10.000 e vedo di quanti impulsi sono positivo, aggiungo il segno +
Esempio:
La mia variabile è a quota 7500, sono sotto a 10.000 quindi sono negativo.
Faccio al differenza 10.000-7500=2500 impulsi.
2500 impulsi sono 125mm quindi significa che sono a -125mm
Oppure la mia variabile è a quota 14000, è maggiore di 10.000 quindi sono positivo.
Faccio la differenza 14.000-10.000=4.000 impulsi
4000 impulsi sono 200mm quindi significa che sono a +200mm
Senza andare a complicarmi la vita con numeri negativi, semplicemente con una sottrazione ho risolto il problema.
sparide74
postato il: 04.03.2015, alle ore 22:00
poi ho provato a scrivere questo esempio:
dim pippo as string[5]
dim topo as string[5]
dim pluto as word
pluto=65535
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