#include <p18F452.h>
#include <timers.h>
#include <capture.h>
#include <delays.h>
#include <xlcd.h>
#include <adc.h> //libreria conversor analogico digital
//#include <stdlib.h>
#pragma config OSC = XT
#pragma config OSCS = OFF
#pragma config PWRT = ON
#pragma config BOR = OFF
#pragma config BORV = 45
#pragma config WDT = OFF
#pragma config WDTPS = 128
#pragma config CCP2MUX = ON
#pragma config STVR = OFF
#pragma config LVP = OFF
void DelayFor18TCY(void); //funciones de retardo
void DelayPORXLCD (void); //
void DelayXLCD (void); //
void main(void)
{
int band_inter=0,periodo=20,etapa=1,valor=0,fall=0,actualizacion=0,retardo=0,buffkey4=0,intensidad=17,iexterna=0,divisor=0,cont=0,band_boton=0,detecfrec=1; //intensidad 0 es maximo y 16? es minimo
int tiempomotor=0,iinterna,intensidadref=0,puertaabierta=0,puertacerrada=0;
char pinesmotor=1;
long lcd=0,buffkey=0; //declaramos las variables del programa
OpenCapture1( C1_EVERY_RISE_EDGE & CAPTURE_INT_ON );
OpenTimer3( TIMER_INT_OFF & T3_SOURCE_INT & T3_PS_1_8); //inicializamos el timer 3
OpenTimer0( TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_2 ); //inicializa el Timer 0 (interrupcion, formato, fuente de reloj, pre-escalador)
OpenADC( ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_2ANA_2REF, ADC_CH0 & ADC_CH1 & ADC_INT_OFF );// Configuramos el conversor analogico digital
//OpenXLCD( FOUR_BIT & LINES_5X7 );
//CloseXLCD(); //inicializa el LCD
// configuramos los puertos del pic
PORTD=1;
PORTB=0;
TRISD=0;
TRISB=0;
TRISA=0xFF;
TRISE=0;
//WriteCmdXLCD(0xc1); para posicionar cursor segundo renglon
//WriteCmdXLCD(0x01); //borrar lcd
//while(!PIR1bits.CCP1IF); // Wait for event
// ciclo que permite capturar el periodo de la señal recibida del detector de cruce por cero
while(detecfrec){
if(PIR1bits.CCP1IF){ //Nos permite saber si hay un flanco en la señal recibida
if(band_inter==0){ //condiciones
if (etapa==2){ //condiciones
periodo=ReadCapture1()/61; // capturamos el valor del periodo recibido
detecfrec=0;
band_inter=1;
}
etapa++;
}
if(CCP1CONbits.CCP1M0){
CCP1CONbits.CCP1M0=0;
}
else{
CCP1CONbits.CCP1M0=1;
}
PIR1bits.CCP1IF=0;
TMR3H=0;
TMR3L=0;
//cont=0;
//if(intensidad==0)
// PORTA=1;
//else
// PORTA=0;
}
}
OpenXLCD( FOUR_BIT & LINES_5X7 ); //se inicializa la pantalla LCD
while(BusyXLCD()) ; //disponibilidad de la pantalla LCD
WriteCmdXLCD(BLINK_OFF & CURSOR_OFF); //enviar comando al lcd
while(BusyXLCD()) ; //verificar si el lcd esta ocupado
putrsXLCD("Enter"); //para enviar texto al lcd
WriteCmdXLCD(0xc1); //Cambiamos de renglon dentro de la pantalla
putrsXLCD("SetPoint"); //Ubicamos set point en el segundo renglon
putrsXLCD(" "); //Nos permite eliminar numeros no deseados en la pantalla
putsXLCD(ltoa(lcd)); //para enviar variables al lcd
while(1){
tiempomotor=tiempomotor+1;
if((tiempomotor>600 && fall!=2) ||(tiempomotor>200 && fall==2)){
if(iinterna<intensidadref && iexterna>=intensidadref && PORTCbits.RC3==0){
intensidad=17;
pinesmotor=pinesmotor<<1;
if(pinesmotor==16)
pinesmotor=1;
}
else if((iinterna<intensidadref && iexterna<intensidadref && puertacerrada==0) ||
iinterna>intensidadref ){
puertacerrada=PORTCbits.RC7;
if(puertacerrada==1){
if(intensidadref>1)
if(intensidadref==10)
intensidad=3;
else
intensidad=(190-17*intensidadref)/10;
else if(intensidadref==1)
intensidad=16;
}
else{
intensidad=17;
pinesmotor=pinesmotor>>1;
if(pinesmotor==0)
pinesmotor=8;
}
}
if(fall==2){
WriteCmdXLCD(0xc1);
putrsXLCD("pocicionI:");
putsXLCD(itoa(valor)); //!intensidad valor
putrsXLCD(" ");
actualizacion=0;
}
PORTE=pinesmotor;
PORTBbits.RB7=pinesmotor>>3;
tiempomotor=0;
}
if(band_boton==0)
PORTD=PORTD<<1;
if(PORTD==16)
PORTD=1;
if((PORTCbits.RC4==1 || PORTCbits.RC5==1 || PORTCbits.RC6==1 ) && band_boton==0 ){
band_boton=1;
if(PORTDbits.RD0==1){
if(PORTCbits.RC4==1)
buffkey=7+10*buffkey;//Numero 7
else if(PORTCbits.RC5==1)
buffkey=8+10*buffkey;//Numero 8
else if(PORTCbits.RC6==1)
buffkey=9+10*buffkey;//Numero 9
}
else if(PORTDbits.RD1==1){
if(PORTCbits.RC4==1)
buffkey=4+10*buffkey;//Numero 4
else if(PORTCbits.RC5==1)
buffkey=5+10*buffkey;//Numero 5
else if(PORTCbits.RC6==1)
buffkey=6+10*buffkey;//Numero 6
}
else if(PORTDbits.RD2==1){
if(PORTCbits.RC4==1)
buffkey=1+10*buffkey;//Numero 1
else if(PORTCbits.RC5==1)
buffkey=2+10*buffkey;//Numero 2
else if(PORTCbits.RC6==1)
buffkey=3+10*buffkey;//Numero 3
}
else if(PORTCbits.RC5==1)
buffkey=10*buffkey;//Numero 0
else if(PORTDbits.RD3==1){ //verificamos la pulsacion de la tecla enter
if(PORTCbits.RC4==1){ //verificamos si se ha presionado alguna tecla
//! intensidad=17; //operacion para obtener la longitud de la onda adecuada
//! puertacerrada=0;
//! intensidadref=buffkey; //operacion para obtener la longitud de la onda adecuada
WriteCmdXLCD(0x80); //escribimos en el primer renglon
putrsXLCD("IngreseKg,Kp y L:"); //ingresamos la palabra intensidad
// putsXLCD(ltoa(intensidad));
putsXLCD(ltoa(buffkey)); //a continuacion concatenamos el valor de intensidad
putrsXLCD(" "); //eliminamos variables no deseadas dentro de la pantalla
WriteCmdXLCD(0xc1); //pasamos al segundo renglon
putrsXLCD("pocicion:"); //ingresamos la palabra pocicion
putsXLCD(itoa(valor)); // a continuacion se concatena la variable que proviene del CAD con su valor
putrsXLCD(" ");
fall=2;
buffkey=0; //reseteamos buffkey
}
// else if(PORTCbits.RC5==1)
// buffkey=10*buffkey;//es
else if(PORTCbits.RC6==1){
WriteCmdXLCD(0xc1);
putrsXLCD("Pocicion:");
putsXLCD(itoa(valor)); // intencidad valor
putrsXLCD(" ");
}
}
PORTBbits.RB2=1;
}
else if((PORTCbits.RC4==0 && PORTCbits.RC5==0 && PORTCbits.RC6==0 ) && band_boton==1 )// si no se presiona tecla alguna
band_boton=0;
if(PIR1bits.CCP1IF){
if(CCP1CONbits.CCP1M0){
CCP1CONbits.CCP1M0=0;
}
else{
CCP1CONbits.CCP1M0=1;
}
PIR1bits.CCP1IF=0;
TMR3H=0;
TMR3L=0;
cont=0;
TRISCbits.TRISC0=0;
if(intensidad==0)
PORTCbits.RC0=1;
// PORTA=1;
else
PORTCbits.RC0=0;
// PORTA=0;
}
if(INTCONbits.TMR0IF){
// /*!
if(intensidad==0)
;// PORTCbits.RC0=0;
else{
cont++;
//if que permite verificar el momento en que se va a mandar un uno al optotriac
if(intensidad==17)
PORTCbits.RC0=0;
else if(cont==intensidad*periodo/36)
PORTCbits.RC0=1;
//este ciclo nos da un pulso con un ancho de banda muy pequeño para proceder de manera correcta con el disparo del triac
while(retardo!=29){ //nos da el ancho del pulso
retardo++;
}
retardo=0;
// PORTA=0;
PORTCbits.RC0=0;
//para valores superiores a 15
if(intensidad<=2)
PORTCbits.RC0=0;
INTCONbits.TMR0IF=0;
}//!*/
}
}
}
// RETARDOS
void DelayFor18TCY( void ){
int ind;
for(ind=1;ind<=18;ind++){
Nop();
}
}
void DelayPORXLCD (void){
Delay1KTCYx(480);
return;
}
void DelayXLCD (void){
Delay1KTCYx(160);
return;
}