hola
Metido en tarea, ya tengo las primeras crisis existenciales

Me propongo hacer un GigaServo. La base es la caja de engranajes de tornillo sin fin de Tamiya. Como decía el otro día, al ser una caja de engranajes que se queda fijada y ninguna fuerza externa (salvo una rotura) puede cambiar su posición, para poder convertirla en un servo solo hace falta contar los pulsos generados por un solo sensor. Como nuestro circuito es el que hace girar al motor, y por lo tanto, la polea de salida, sabemos en que dirección gira, de tal forma que en función del sentido de giro, aumentamos o disminuimos un contador maestro según la pauta que marca el generador de pulsos. Para posicionar el servo, basta con medir el pulso que genera el canal del receptor, y llevar el contador girando el motor y contando los pulsos a donde nos diga su longitud, que será proporcional a la posición de la palanca.
Como sistema generador de pulsos voy a utilizar un sensor HALL, un UGN3113. Se podrían usar optointerruptores, pero si al final la cosa llega a buen puerto, nunca mejor dicho

, las condiciones en la que trabajará este chisme serán bastante adversas, y un sistema óptico, puede tener problemas de suciedad, por lo que se hace más que recomendable el sistema magnético.


El otro día hurgando por Ebay encontré unos imanes que me vienen al pelo...
Imanes Ebay. Son imanes de Neodimio y tienen bastante fuerza, y por ende, activan el sensor Hall, alto y claro.
He puesto dos para aumentar la resolución y para equilibrar el engranaje. Los he puesto en ese engranaje también para aumentar la resolución. No lo he mirado exactamente, pero creo que por cada vuelta del eje de salida, el sensor detecta unos 10 pasos de imán.
Juan Luis, un sensor hall es un semiconductor, el negrito de tres patas que está delante del engranaje rojo en la segunda foto, que actúa como un interruptor en presencia de un campo magnético.
Bueno, pues una vez puestos en antecedentes, os cuento el problema:
Por cuestión personal uso Proton+. Aunque es un compilador poco usado, creo que el código se autoexplica, y por lo tanto, se puede trasladar a cualquier otro compilador y no dudo que cualquier picmaniaco será capaz de interpretarlo.
Device 16F88
REMINDERS 0
Config HS_OSC, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF
XTAL = 20
HSERIAL_BAUD = 19200
HSERIAL_TXSTA = %00100100
Symbol INT0IF = INTCON.1 ' RB0 External Interrupt Flag
Symbol INT0IE = INTCON.4 ' RB0 External Interrupt Enable
Symbol PEIE = INTCON.6 ' Peripheral Interrupt Enable
Symbol GIE = INTCON.7 ' Global Interrupt Enable
Symbol INTEDG = OPTION_REG.6 ' Interrupt Edge Select
Symbol NOT_RBPU = OPTION_REG.7 ' PORTB Pull-up Enable
Dim c As Word
Dim i As Word
Dim pw As Word
ON_hardware_INTERRUPT GoTo Myint
GoTo main
Myint:
i = i + 1
INT0IF = 0
Context Restore
main:
GIE = 0: While GIE = 1 : GIE = 0 : Wend
ALL_DIGITAL true
DelayMS 300 ' Wait for LCD to start
HRSOut 131
HRSOut 12
HRSOut 134 'Backlight_ON
HRSOut $8A,1,1,"MVC 2008"
DelayMS 2000
HRSOut 12
c = 0
i = 0
pw = 0
INTEDG = 1
NOT_RBPU = 1
PEIE = 1
INT0IE = 1
GIE = 1 : While GIE = 0 : GIE = 1 : Wend
bucle:
HRSOut $8A,1,1, Dec i, " "
GoSub pulsop
HRSOut $8A,1,8, Dec pw, " "
HRSOut $8A,2,1, Dec c, " "
DelayMS 200
c = c + 1
GoTo bucle
pulsop:
ASM
movlw 00h
movwf T1CON
clrf TMR1H
clrf TMR1L
buclep1:
btfsc PORTB,1
GoTo buclep1
buclep2:
btfss PORTB,1
GoTo buclep2
movlw 21h
movwf T1CON
buclep3:
btfsc PORTB,1
GoTo buclep3
movlw 00h
movwf T1CON
ENDASM
pw = (TMR1L + (TMR1H * 256))
Return
Este código es solo una prueba, y lo único que hace es medir el pulso en RB1 y al mismo tiempo contar los flancos ascendentes en RB0 con la interrupción. Aunque si que es funcional, la lógica no es válida puesto que si se produce una Int RB0 en plena medida del pulso, esos microsegundos se reflejan en el valor final. Esto es bastante frecuente y por eso, no vale. Tengo que pensar otra forma, pero tengo unas dudas. Son de novato, y seguro que vienen en los Datasheets, pero no me acabo de aclarar.
Si yo desactivo las interrupciones durante la rutina
pulsop con GIE y en ese espacio de tiempo hay un flanco de subida en RB0 ¿se acuerda y hace la rutina de interrupción en el momento en el que vuelvo a activar la GIE?
Otra pregunta obvia pero de la que no estoy seguro: Si utilizo el módulo CCP y su interrupción para medir el pulso, el PIC sigue trabajando independientemente ¿No?. Quizás esta sea la solución, o sea, hacerlo al revés, dedicar el bucle principal a controlar el contador maestro, y mientra tanto, que el CCP se ocupe de medir el pulso del receptor.
Diego, he visto que en tu página haces un estupendo estudio de este módulo, mañana me lo empollo. Añado que he cambiado del 628 al 88, porque quería ir más deprisa, 20 Mhz, y no tenia un 628 de esta velocidad.
Mañana más, que ahora hay que planchar la oreja

...
Por cierto, dentro de siete horas hace 45 años que vine a este mundo... Vaya tela!!!!

SOY UN VIEJO!!!!
un saludete...
Mario
PS1: Juan Luis... eres un artista...
PS2: Los comandos HRSOut son para manejar este chip