Buenas tardes, he estado trabajando en un proyecto de un pendulo invertido y estoy atorado en la parte del encoder; solo quiero que me visualice la direccion de movimiento del encoder (derecha o izquierda) en una pantalla lcd.
Estoy empleando programacion en CCS pero solo me detecta un sentido y en la otra direccion no me muestra nada. El encoder se encuentra acoplado a un motor y conectado tambien a un pic18f4550. ...
Les dejo el programa hecho en CCS.
Estoy empleando programacion en CCS pero solo me detecta un sentido y en la otra direccion no me muestra nada. El encoder se encuentra acoplado a un motor y conectado tambien a un pic18f4550. ...
Les dejo el programa hecho en CCS.
Código:
#Include <18F4550.h> //Declaracion para utilizar el PIC
#device HIGH_INTS=TRUE// CONFIGURACIÓN PARA LAS INTERRUPCIONES
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV1,VREGEN,NOPBADEN
#use Delay(Clock =4000000 )
#include <usb_bootloader.h> // Para activar la programación del microcontrolador
#include <lcd.c>//libreria para utilizar el LCD,
#Byte PortA = 0xF80 //Dirección del puerto A
#Byte PortB = 0xF81 //Dirección del puerto B
#Byte PortC = 0xF82 //Dirección del puerto C
#Byte PortD = 0xF83 //Dirección del puerto D
#Byte PortE = 0xF84 // Dirección del puerto E
#INT_EXT //Interrupcion externa por RB0
Void IntRB0()
{
//disable_Interrupts(Int_Ext);
If (Bit_Test(PortB, 0)) //si RB0 se ha puesto a 1 (flanco de subida)
{
Ext_Int_Edge(H_TO_L); //entonces activar la siguiente interrupcion por
//flanco de bajada
If (Bit_Test(PortB, 1)) //si RB1 esta a 1
//Aca quiere decir que va en sentido de las agujas del reloj
{
printf(lcd_putc,"\fDerecha");
}
}
Else //si RB0 se ha puesto a 0 (Flanco de bajada)
{
//en este caso indica que el sentido es en contra de las agujas
Ext_Int_Edge(L_TO_H); //entonces activar la siguiente interrupcion por
//flanco de subida
If (Bit_Test(PortB, 1)) //si RB1 esta a 1
{
printf(lcd_putc,"\fizquierda");
}
}
//Al finalizar la interrupción CCS se encarga de volver a poner automáticamente
//la badera INTF = 0 ---> borra la interrupción para poder permitir la siguiente;
}
Void Main() // Inicio y configuración.
{
Port_B_Pullups(FALSE); // Configuración para el PIC 18F4550.
Setup_ADC_Ports(NO_ANALOGS); // Sin comparadores ni ADCs, todo digital
Setup_adc(ADC_CLOCK_DIV_2);
Setup_spi(SPI_SS_DISABLED);
Setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
Setup_timer_1(T1_DISABLED);
Setup_timer_2(T2_DISABLED,0,1);
Setup_comparator(NC_NC_NC_NC);
Setup_vref(FALSE);
Enable_Interrupts(Int_Ext); //Activar Interrupción Externa a través de RB0
Ext_Int_Edge(L_TO_H); //Inicialmente detectar interrupción por flanco
//de subida.
Enable_Interrupts(GLOBAL); // Interrupciones Generales Activadas
lcd_init(); //inicializar el lcd
printf(lcd_putc,"Giro Encoder");
delay_ms(3000);
printf(lcd_putc,"\f");
//Propgrama principal
While (TRUE)
{
}
}
Última edición por un moderador: