Device=16F876A
REMINDERS = FALSE
Config XT_OSC, PWRTE_ON, CPD_OFF, WDT_OFF, BODEN_OFF, LVP_OFF
REMINDERS = TRUE
ALL_DIGITAL = TRUE
TRISA = %100011
TRISB = %11111111
TRISC = %11111111
PORTA.2 = 0 ' Motor parado.
PORTA.3 = 0
PORTA.4 = 0 ' Apaga el LED.
' ------------------------------------------------------------------------------------------------
Dim P As DWord ' Declaramos el valor de P como DWord (32 bits), posición final.
Dim X As DWord ' Declaramos el valor de X como DWord (32 bits), posición actual.
Dim Aux As Byte ' Se almacenará el valor anterior de RA0 y RA1, hasta la siguiente comparación.
Dim Enc As Byte ' Se almacenará el valor actual de RA0 y RA1, hasta la siguiente comparación.
P=0 ' Ponemos todas las variables a cero.
X=0
Aux=0
Enc=0
'------------------------------------------------------
Bucle: ' Bucle infinito.
' ---------------- Decodificación del encoder. ----------------
Aux = Enc ' Igualamos 'AUX' y 'ENC' para luego comparar cuando cambie 'ENC'.
Enc = PORTA & 3 ' Aislamos RA0 y RA1 como un número de 2 bits y se carga en la variable 'ENC'.
If Aux = 2 And Enc = 3 Then Inc X ' Si en la comparación hay flanco de subida, incrementamos X.
If Aux = 3 And Enc = 2 Then Dec X ' Si en la comparación hay flanco de bajada, decrementamos X.
' ---------------- Comparación para el control del Motor. ----------------
If X = P Then
PORTA.2 = 0 ' Motor Parado.
PORTA.3 = 0
P.BYTE0=PORTB ' Carga Posición de 16 bits.
P.BYTE1=PORTC
PORTA.4 = 0 ' Apaga el LED indicando que ya ha llegado.
GoTo Bucle
EndIf
PORTA.4 = 1 ' Enciende el LED indicando que se está posicionando.
If X > 70000 Then ' Si x<0, Motor hacia delante.
PORTA.2 = 1
PORTA.3 = 0
GoTo Bucle
EndIf
If X > P Then ' Si x>p, motor hacia atrás.
PORTA.2 = 0
PORTA.3 = 1
GoTo Bucle
EndIf
If X < P Then ' Si x<p, motor hacia delante.
PORTA.2 = 1
PORTA.3 = 0
GoTo Bucle
EndIf
GoTo Bucle
End
Cuando programaba en Proton IDE no se podía utilizar números negativos, al menos con el compilador que tenía. Por esta razón hago un truco. Hoy en día ya no lo uso, y el programa tiene muchos años, es recopilado de aquella época cuando controlaba motores con este lenguaje de programación.
El orden de las comparaciones para controlar el motor es jerárquico. Si alteras ese orden podría no funcionar correctamente, especialmente cuando le pides al PIC que el motor vaya a la posición cero. La primera comparación ha de ser siempre la de -igual-: "If X = P Then...". La comparación -menor de cero-: "If X > 70000 Then..." ha de estar antes de -mayor que- "If X > P Then..." y de -menor que- "If X < P Then...". Esto es importante.