home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


MickroBasic pro,gestione " . " per asse lineare
     
Autore Messaggio opzioni
Jasson





postato il:
04.03.2015, alle ore 20:02

E' normalissimo quello che succede.

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




una ogni 10 livelli


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

' ****************************************************

dim txt1 as char[10]
txt2 as char[7]
txt3 as char[2]
txt4 as char[2]

'********************Gestione Interrupt*****************

sub procedure Interrupt

if TestBit(INTCON, RBIF) = 1 then
CH_A=portB.4
CH_B=portB.5

' Confronta il vecchio valore della linea A con il nuovo della linea B
if CH_A1 = CH_B Then
inc(UpDown) 'Se Incremento UP
else


dec(UpDown) 'Se Decremento DOWN
end if

' Copio i valori letti in quelli precedenti
CH_A1 = CH_A
CH_B1 = CH_B
ClearBit(INTCON,RBIF) ' Riabilita interrupt
end if
end sub

'******************************************************************
main:

TRISB.4 = 1 ' Encoder A su Pin R4
TRISB.5 = 1 ' Encoder B su pin R5

SetBit(INTCON,RBIE) ' Abilita Interrupt on-change
ClearBit(INTCON,RBIF)
SetBit(INTCON,GIE) ' Abilita Interrupt
txt1 = "SPARIDE"
txt2 = "Ver.1.0"
txt3 = "X:"
txt4 = "Y:"



'********************Inizializzo il Display LCD ******************

Lcd_Init() ' Initialize Lcd
Lcd_Cmd(_LCD_CLEAR) ' Clear display
Lcd_Cmd(_LCD_CURSOR_OFF) ' Cursor off
Delay_ms(500)
Lcd_Out(1,4,txt1) ' "SPARIDE"
Lcd_Out(2,6,txt2) ' "Ver.1.0"
Delay_ms(1000)
Lcd_Cmd(_LCD_CLEAR) ' Clear display
Delay_ms(800)
Lcd_Out(1,1,txt3) ' "X:"



'*****************Salvataggio valori delle porte****************

CH_A1=PORTA.4
CH_B1=PORTA.5

'***********************Programm********************************

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




una ogni 10 livelli


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




una ogni 10 livelli


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
        
wordtostr(pluto,topo)
Lcd_out(1,3,topo)  

e normalmente compare sul display 65535

poi

facendo quello che fai tu in questo modo:

 
  topo[0] =pippo[0]
  topo[1] =pippo[2]
  topo[2] =pippo[4]


dim pippo as string[5]
dim topo as string[5]
dim pluto as word

pluto=65535
        
wordtostr(pluto,topo)
Lcd_out(1,3,pippo)  

sul diplay non compare niente , dovrebbe comparire 6 5 5


segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

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




 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale