|
Autore |
Messaggio |
opzioni |
sparide74
postato il: 05.03.2015, alle ore 22:10 |
Spiritosi che siete |
|
Jasson
postato il: 05.03.2015, alle ore 22:20 |
Per i video mi sa che devi appoggiarti su youtube
|
|
sparide74
postato il: 05.03.2015, alle ore 22:25 |
mannaggia....
senti ma se vorrei inserirci sulla sub interrupt un'altro encoder che gestisce un'altro asse?
ho provato ad inserirci sulla sub interrupt l'altro encoder ma mi fa sballare tutto LCD impazzisce |
|
Jasson
postato il: 05.03.2015, alle ore 22:42 |
Ma cosa utilizzi per scatenare l'interrupt?
|
|
picmicro675
postato il: 06.03.2015, alle ore 02:07 |
L' IOC sul nibble alto della porta B
Si dovrebbe usare lo shadowing della porta e poi leggere il dato.
Ovvero Dim Shadow as byte
Shadow = PORTB
If Shadow.4 then
do something
end if
Anno nuovo, forum nuovo.
Mi sa che lascio. |
|
picmicro675
postato il: 06.03.2015, alle ore 06:42 |
Visto che ho trovato un po di tempo libero ho sviluppato la routine di conversione.
'******************************************************************
' routine di conversione da LongInt a decimale
' con la posizione della virgola parametrizzato
sub procedure SDwordToStr(dim SDWord as longint, dim pos as byte, dim byref output as string[12])
dim count as byte
prefix as char
rest as byte
prefix = " "
for count = 0 to 12
output[count] = 32
next count
if SDword < 0 then
prefix = "-"
SDword = labs(SDword)
end if
if SDword = 0 then
output = "0.00"
goto leave
end if
output[0] = prefix
count = 11
output[12] = 0
while sdword > 0
rest = SDword mod 10
SDword = SDword / 10
output[count] = rest + 48
dec(count)
dec(pos)
if pos = 0 then
output[count] = "."
dec(count)
end if
wend
output[count] = prefix
ltrim(output)
leave:
end sub
'******************************************************************
Poi nella main abbiamo
While true
if Refresh then
SDwordToStr(UpDown, 2, txt1)
Lcd_Out(1,7,txt1)
Refresh = 0
end if
Wend
Ovviamente il secondo parametro (il "2") è dove mettere il punto decimale.
Per i numeri negativi si usa "labs" per avere la parte intera.
Qui ho messo un flag "Refresh" nella routine di interrupt e nel loop della main si interroga se c'è stata una variazione di dato quindi procedere al rinfresco del display.
Almeno si stressa meno il display. E si potrebbe anche magari spegnerlo. Ma questo aumenta il programma e si sfora la versione free.
Non ho provato la visualizzazione col display, non avendo gli strumenti adatti per farlo. Oppure non sono in grado di attuare tale simulazione.
Anno nuovo, forum nuovo.
Mi sa che lascio. |
|
picmicro675
postato il: 06.03.2015, alle ore 06:46 |
Dimenticavo col 2 qui si rappresenta 2 decimali.
Visto che con 500 impulsi su 5 mm si ha un impulso ogni 10 micron e non serve ulteriore calcolo o conversione.
Anno nuovo, forum nuovo.
Mi sa che lascio. |
|
sparide74
postato il: 06.03.2015, alle ore 07:32 |
buongiorno, la parte di programma di visualizzazione quota con segno l'ho sistemata..ora devo gestire un altro encoder, jasson mi chiedeva come avevo gestito il 1° encoder:
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
come dicevo in precedenza se scrivo il secondo canale dell'encoder 2 lcd impazzisce |
|
Jasson
postato il: 06.03.2015, alle ore 09:47 |
Sinceramente non mi sono mai posto il problema di gestire 2 encoder, ma temo che sia difficile gestirli tutti e due con lo stesso interrupt, perchè quando viene scatenato l'interrupt, come fai a sapere da quale dei due encoder è stato scatenato?
Quale dei 2 encoder vai a leggere?
Forse si dovrebbe utilizzare 2 interrupt separati uno per ogni encoder?
|
|
picmicro675
postato il: 06.03.2015, alle ore 16:19 |
sparide74: buongiorno, la parte di programma di visualizzazione quota con segno l'ho sistemata
Io no, ma trovo scomodo se lo si vuole mettere il segno a sinistra e visualizzare le cifre a lunghezza variabile.
Sarei del parere di mettere il segno dopo le cifre e mantenere allineato a destra.
Rimango del parere che la routine che ho abbozzato è alquanto flessibile ed ammette anche misure più ampie. (21`474`836,48 mm, 21 Km !!) oppure anche risoluzioni più fini spostando la virgola.
Poi in fondo se va bene quello che hai in uso, rimane solo una mia fisima.
Per leggere due encoders con IOC credo che sia difficile.
Farò qualche prova.
Anno nuovo, forum nuovo.
Mi sa che lascio. |
|
|