Device=16F876AREMINDERS = FALSE Config XT_OSC, PWRTE_ON, CPD_OFF, WDT_OFF, BODEN_OFF, LVP_OFFREMINDERS = TRUEALL_DIGITAL = TRUE TRISA = %100011TRISB = %11111111TRISC = %11111111PORTA.2 = 0 ' Motor parado.PORTA.3 = 0PORTA.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=0Aux=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 EndIfGoTo BucleEndCuando 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.