Hola amigos, recurro a ustedes para que me ayuden, tengo el enconder AS5304 con su respectiva cinta magnética modelo AS5000-MS-20-150
Encontré un código en Internet para trabajar con el PIC16F628A, yo estoy usando el 16F628.
El tema es que este código es capaz de reconocer en que dirección se está moviendo el encoder y prender unos led de acuerdo a eso.
Ahora mi problema, me gustaría que me ayudaran a modificarlo para poder asignarle una posición 0 y que sepa en que posición se encuentra, o sea, por ejemplo se desplazó 30° hacia la derecha y que prenda un Led, si se me movió 50° prenda dos Led y lo mismo hacia la izquierda, obviamente prendiendo otros led.
Ojala me pueda ayudar, abajo pego el código.
Saludos.
Encontré un código en Internet para trabajar con el PIC16F628A, yo estoy usando el 16F628.
El tema es que este código es capaz de reconocer en que dirección se está moviendo el encoder y prender unos led de acuerdo a eso.
Ahora mi problema, me gustaría que me ayudaran a modificarlo para poder asignarle una posición 0 y que sepa en que posición se encuentra, o sea, por ejemplo se desplazó 30° hacia la derecha y que prenda un Led, si se me movió 50° prenda dos Led y lo mismo hacia la izquierda, obviamente prendiendo otros led.
Ojala me pueda ayudar, abajo pego el código.
Saludos.
Código:
#include <16f628.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD
#use delay(clock=4000000)
#byte porta = 0x05 // Asignamos PortA.
#byte portb = 0x06 // Asignamos PortB.
// ---------- Programa Principial ----------
void main()
{
port_b_pullups(FALSE); // Sin resistencias pullups a las salidas del puerto B.
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // Al no usar el TIMER configuramos lo más básico.
setup_comparator(NC_NC_NC_NC); // Sin comparadores.
setup_vref(FALSE); // Al no usar comparadores no necesitamos Vref.
//---- Fin de la configuración del 16F628A ----
int8 x; // Declaramos el valor de X como byte, se corresponderá con los 8 LEDs de salida.
int8 enc; // Se almacenará el valor actual de RA0 y RA1, hasta la siguiente comparación.
int8 aux; // Se almacenará el valor anterior de RA0 y RA1, hasta la siguiente comparación.
set_tris_a(0b11111); // Puerto A como entradas. Sólo usamos RA0 y RA1.
set_tris_b(0b00000000); // Puerto B como salidas, para los 8 LEDs.
portb=0; // Inicialmente ponemos a cero el puerto B.
x=0; // Inicialmente ponemos a cero la variable que se usa para contar.
enc=0; // Inicialmente ponemos a cero la variable que tomará los valores de RA0 y RA1.
While (true)
{
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)&&(enc==3))// Si en la comparación hay flanco de subida,
{
x++; // entonces incrementar una unidad el valor de X.
}
If ((aux==3)&&(enc==2))// Si en la comparación hay flanco de bajada,
{
x--; // entonces decrementar una unidad el valor de X.
}
portb = x; // El valor de X sale por el puerto B, los 8 LED de salida.
}
}
Última edición por un moderador: