Hola ... tengo un ligero problemilla

Por motivos que no vienen al caso, he decidido usar la versión demo del MikroBasic ...
Es un poco derrochón y le faltan algunas cosillas, pero por lo demás está bien. Como lo que importa aquí son los algoritmos, pues si es necesario, ya lo pasaré a otra plataforma.
De todas formas, el problema no es con el compilador, es con mi sensor de inclinación Memsickit de Parallax.
No se si es un problema del chip Memsic o de la placa de prototipos, pero me hace una cosa un tanto puñetera. Manolo, me gustaría que me dijéras si a tí te pasa con el adxl, o es que esto del Memsic es una porquería, ya que electrónicamente lo he montado como en todos los sitios que he visto en la WEB.
Quizas me he pasado con la velocidad de proceso obsesionado por la precisión. El caso es que he utilizado el timer1 para medir la anchura del pulso, y para que no haya imprecisiónes en instrucciónes preprogramadas del compilador, tipo 'pulsin', le he incrustado el código en ensamblador. Si observáis en el código parece que sobran cosas, pero tanta historia es para asegurarme de que estoy leyendo un pulso positivo puro y entero.
El problema que tengo es que cuando el timer1 solo debería variar cuatro arriba o cuatro abajo, según haga o no el último bucle, en realidad el valor que me devuelve no para quieto, pegando saltos de 20 o 30 unidades. Puede ser que sea ruido en la alimentación, o que el mismo chisme no de para más. Evidentemente, dividiendo el valor entre 100 p.e. aquello no se mueve, pero disminuye mucho la precisión de la medida. Ahora mismo no recuerdo, pero a 40 Mhz, creo que el valor del Timer1 está entorno a 12000, con lo cual, en cuanto empezemos a dividir, la precisión deja bastante que desear.
También he hecho la prueba de los 30 pavos; como tengo dos Memsickit, pues he probado con los dos, y los dos se comportan igual.
Aquí teneis el código ... pero podéis obviar todo lo que tiene que ver con las variables i y j ... suelo poner este tipo de cosas en mis programas para verificar que el procesador está rulando.
'***************************************************************
' Microcontrolador PIC18F452
' Reloj a 40Mhz en modo HSPLL
' (la función WordToStrWithZeros solo funciona con 18Fxxx)
'***************************************************************
program prueba_lcd
dim j as word
dim i as word
dim pw as word
dim txt as string[6]
main:
delay_ms(100)
Lcd_Config(PORTC,1,0,2,7,6,5,4)
Lcd_cmd(LCD_CURSOR_OFF)
Lcd_cmd(LCD_CLEAR)
j=0
i=0
ADCON1 = 7
PORTA = 0
TRISA = %11111110
PORTB = 0
TRISB = %11111111
bucle:
asm
movlw $00
movwf T1CON
clrf TMR1H
clrf TMR1L
bucle1:
btfsc PORTB,7
goto bucle1
bucle2:
btfss PORTB,7
goto bucle2
movlw $21
movwf T1CON
bucle3:
btfsc PORTB,7
goto bucle3
movlw $00
movwf T1CON
end asm
pw = (TMR1L + (TMR1H * 256))/4
WordToStrWithZeros(i,txt)
Lcd_out(1,1,txt)
WordToStrWithZeros(j,txt)
Lcd_out(1,6,txt)
WordToStrWithZeros(pw,txt)
Lcd_out(2,1,txt)
j=j+1
if j = 0 then
i = i + 1
end if
delay_ms(100)
goto bucle
end.
Por cierto Manolo, aunque tu eres un tipo con coco

y es casi seguro que hayas llegado tambien a esta conclusión, te lo pongo por si acaso. Coge la escoba y piensa ... ¿que es lo que se tiene que mantener quieto? ... evidéntemente; el cepillo ... o sea, que el sensor de inclinación tiene que estár lo más cerca posible del peso superior y lejos de la base, que es la que se tiene que mover en sentido longitudinal para mantener el equilibrio. Aunque yo voy más retrasado y todavía no lo he montado en el BOT, creo que si el sensor está pegado a la batería (en el cepillo), de momento, solo te tienes que preocupar de mantenerlo horizontal. Cuando haya que andar, otro gallo nos cantará, pero para mantener el equilibrio, pues según he deducido, debería ser mejor.
un saludo
Mario