#include <18F4550.h>
#device adc=10
#FUSES NOPROTECT
#FUSES PUT
#FUSES NOLVP
#FUSES NOBROWNOUT
#FUSES NOWDT
#FUSES HSPLL
#FUSES NODEBUG
#FUSES PLL3
#FUSES USBDIV
#FUSES CPUDIV1
#FUSES VREGEN
#use delay
(clock=
48000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#priority RB,TIMER3,TIMER1
#include <LCD.C>
#include <string.h>
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(E)
#byte PUERTOB = 0xF81
#bit BEEP = 0xF83.3
#bit BOTON1 = 0xF84.0
#opt 11
byte LSB=0b11111110;
byte tecla,tecla1,tecla2;
int8 i,No_Caracter,Array_length,Offset,Prescaler=
20,text_array
[80]; //Corrimiento
long value=0,contB=0;
float Acomulado=0,Velocidad=500,VelocidadMedida,Voltaje, Calibracion = 1.45 ;
float Kp=0,Ki=0,Kd=0;
float a0,a1,a2;
byte BanderaB;
Corrimiento(){
PUERTOB=LSB;
rotate_left( &LSB, 1);
if(LSB==0b11101111)
LSB=0b11111110;
}
#int_TIMER1
TIMER1_isr(){
Corrimiento();
}
#int_TIMER3
TIMER3_isr(){
Prescaler++;
}
Revote(){
if (tecla!=16){
while(tecla1==PUERTOB)
while(tecla==tecla2);
BEEP=1;
delay_ms(100);
BEEP=0;
}
}
int Entero(){
tecla=PUERTOB;
tecla1=PUERTOB;
switch (tecla) {
case 0xEE : tecla=15; break;
case 0xED : tecla=9 ; break;
case 0xEB : tecla=8 ; break;
case 0xE7 : tecla=7 ; break;
case 0xDE : tecla=14; break;
case 0xDD : tecla=6 ; break;
case 0xDB : tecla=5 ; break;
case 0xD7 : tecla=4 ; break;
case 0xBE : tecla=13; break;
case 0xBD : tecla=3 ; break;
case 0xBB : tecla=2 ; break;
case 0xB7 : tecla=1 ; break;
case 0x7E : tecla=12; break;
case 0x7D : tecla=11; break;
case 0x7B : tecla=10; break;
case 0x77 : tecla=0 ; break;
default : tecla=16; break; }
return tecla;
}
float Get_Numero( float Actual){
float Decimal=1;
int Bandera=0;
int Decimas=1;
Proporcion=1;
Acomulado=0;
lcd_gotoxy(1,2);
if(Actual==0)
printf(lcd_putc,"Actual: %.0f ",Actual);
else
printf(lcd_putc,"Actual: %f ",Actual);
Revote();
Do{
Corrimiento();
Entero();
delay_ms(40);
if(tecla==15)
goto FIN1;
} while(tecla2!=PUERTOB);
lcd_gotoxy(1,2);
printf(lcd_putc,"Nuevo: %.0f ",Acomulado);
Revote();
Do{
Corrimiento();
Entero();
delay_ms(30);
if(tecla==10 && Bandera==0){
lcd_gotoxy(1,2);
printf(lcd_putc,"Nuevo: %.0f. ",Acomulado);
Bandera=1;
Revote();
}
if(tecla==14){
Acomulado=0;
lcd_gotoxy(1,2);
printf(lcd_putc,"Nuevo: %.0f ",Acomulado);
Bandera=0;
Revote();
}
if(tecla<10 && Bandera==0){
Acomulado = Acomulado*10+tecla;
lcd_gotoxy(1,2);
printf(lcd_putc,"Nuevo: %.0f ",Acomulado);
Revote();
}
if(tecla<10 && Bandera==1 && Decimas<=4){
decimal=decimal*0.1;
Acomulado = Acomulado+tecla*decimal;
lcd_gotoxy(1,2);
switch (Decimas) {
case 1 : printf(lcd_putc,"Nuevo: %.1f ",Acomulado);break;
case 2 : printf(lcd_putc,"Nuevo: %.2f ",Acomulado);break;
case 3 : printf(lcd_putc,"Nuevo: %.3f ",Acomulado);break;
case 4 : printf(lcd_putc,"Nuevo: %.4f ",Acomulado);break;
}
Decimas++;
Revote();
}
if(Decimas>4) goto FIN;
}while(tecla!=12);
FIN:
Revote();
lcd_gotoxy(1,1);
printf(lcd_putc," \f ");
return Acomulado;
FIN1:
Revote();
return Actual;
}
Impresion_LCD(){
lcd_gotoxy(1,1);
printf(lcd_putc,"Velocidad:%.1f RPM ",VelocidadMedida);
if(BOTON1==1)
sprintf(text_array,"P:
%.2f I:%.2f D:%.2f ",Kp,Ki,Kd); if(BOTON1==0){
sprintf(text_array,"
%.1f_RPM %.3f_volts %lu_Bits ",Velocidad,Voltaje,value); Array_length=strlen(text_array);
lcd_gotoxy(1,2);
Offset--;
for(i=
0,No_Caracter=Offset;
i<
20;
i++,No_Caracter++
){ if(No_Caracter>=Array_length)
No_Caracter=0;
lcd_putc(text_array[No_Caracter]);
}
Offset++;
}
if(Prescaler>20){
Array_length=strlen(text_array);
lcd_gotoxy(1,2);
Prescaler=0;
for(i=
0,No_Caracter=Offset;
i<
20;
i++,No_Caracter++
){ if(No_Caracter>=Array_length)
No_Caracter=0;
lcd_putc(text_array[No_Caracter]);
}
Offset++;
if(Offset>=Array_length)
Offset=0;
}
}
#int_RB
RB_isr(){
Entero();
tecla2=tecla1;
lcd_gotoxy(1,1);
switch (tecla) {
case 0 :
set_pwm1_duty(0);
Revote();
break;
case 1 :
Kp-=0.01;
BEEP=1;
delay_ms(100);
break;
case 2 :
Kp+=0.01;
BEEP=1;
delay_ms(100);
break;
case 3 :
printf(lcd_putc,"Establecer Kp: ");
Kp=Get_Numero(Kp);
break;
case 4 :
Ki-=0.01;
BEEP=1;
delay_ms(100);
break;
case 5 :
Ki+=0.01;
BEEP=1;
delay_ms(100);
break;
case 6 :
printf(lcd_putc,"Establecer Ki: ");
Ki=Get_Numero(Ki);
break;
case 7 :
Kd-=0.01;
BEEP=1;
delay_ms(100);
break;
case 8 :
Kd+=0.01;
BEEP=1;
delay_ms(100);
break;
case 9 :
printf(lcd_putc,"Establecer Kd: ");
Kd=Get_Numero(Kd);
break;
case 10 :
printf(lcd_putc,"Establecer velocidad");
velocidad=Get_Numero(velocidad);
break;
case 11 :
printf(lcd_putc,"Calibrar Motor DC: ");
Calibracion=Get_Numero(Calibracion);
break;
case 12 :
velocidad-=10;
BEEP=1;
delay_ms(100);
break;
case 13 :
velocidad+=10;
BEEP=1;
delay_ms(100);
break;
case 14 :
lcd_gotoxy(1,2);
velocidad-=100;
BEEP=1;
delay_ms(100);
break;
case 15 :
lcd_gotoxy(1,2);
velocidad+=100;
BEEP=1;
delay_ms(100);
break;
default : ; break; }
if(velocidad<=0)
velocidad=0;
sprintf(text_array,"P:
%.2f I:%.2f D:%.2f ",Kp,Ki,Kd); Array_length=strlen(text_array);
lcd_gotoxy(1,2);
Offset--;
for(i=
0,No_Caracter=Offset;
i<
20;
i++,No_Caracter++
){ if(No_Caracter>=Array_length)
No_Caracter=0;
lcd_putc(text_array[No_Caracter]);
}
Offset++;
BEEP=0;
}
void inicializar(){
lcd_init();
set_tris_b(0b11110000);
set_tris_c(0b10010001);
set_tris_e(0xff);
port_b_pullups(TRUE);
LSB=0b11111110;
PUERTOB=LSB;
setup_adc_ports(AN0|VSS_VDD); // Inicializacion del ADC
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel( 0 );
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
setup_timer_3(T3_INTERNAL|T3_DIV_BY_8);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_TIMER2);
enable_interrupts(INT_TIMER3);
enable_interrupts(INT_RB);
EXT_INT_EDGE(1,H_TO_L);
port_b_pullups(TRUE);
enable_interrupts(GLOBAL);
setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_16, 127, 1);
}