/*
         Practica #3 de Microprocesadores II.
                  Elaborado por:
                  Jesús Mendoza
                  Iván Barreto
                 Wilman Gguerra.
La funcionalidad del proyecto consiste en controlar
la velocidad, giro y parada total de un motor CC
desde el teclado de un PC a traves del puerto serial.
También se lleva un historial con Fecha y hora de la actividad
del motor.
*/

////////////////////////////////////////////////
#INCLUDE <18F4550.H>
#INCLUDE <STRING.H>
#FUSES   XT
////////////////////////////////////////////////
#USE FAST_IO(E)
#USE FAST_IO(D)
#USE FAST_IO(C)
#USE FAST_IO(B)
#USE FAST_IO(A)
////////////////////////////////////////////////
#USE DELAY(CLOCK=4000000)
#USE RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7)
#USE I2C(MASTER, SDA=PIN_B0, SCL=PIN_B1)
////////////////////////////////////////////////
#INCLUDE <DS1307.C>
////////////////////////////////////////////////
VOID RELOJ(VOID);
CHAR SDOW[11];
BYTE DAY;
BYTE MONTH;
BYTE YR;
BYTE HRS;
BYTE MIN;
BYTE SEC;
BYTE DOW;
////////////////
VOID SHUTDOWN();
VOID MEMORIA();
///////////////
INT16 DATO1_V;
INT  DATO2_D;
INT  DATO3_M;
INT  DATO4_A;
INT  DATO5_H;
INT  DATO6_M;
INT  DATO7_S;
CHAR DATO8_S;
CHAR DATO9_A;
CHAR CARATER_A='N';
CHAR CARATER_S='D';
INT  LECTURA=0;
INT  INCREMENTO=1,Z=0;
INT   NUMERO=0;
INT   VARIABLE_H;
INT   VARIABLE_L;

INT16 PERIODO=256,  CICLO_UTIL=0,AUX=0, RPS=0;
INT   INTERRUPCION, SENTIDO=0, PARADA=0;
INT   MINUTOS;
INT   SEGUNDOS=0;
INT   DATE;
INT   CONTROL=0;
INT   DIA_H,DIA_L,DIAS;
INT   MESH,MESL,MES,A_H,A_L,YEAR;
INT   HORA_A,HORA_B,HORA,MIN_H,MIN_L;


VOID RELOJ(VOID)
{ DS1307_INIT(DS1307_OUT_ON_DISABLED_HIHG | DS1307_OUT_ENABLED | DS1307_OUT_1_HZ);
  PRINTF(" INGRESE EL DIA ACTUAL\n\r");
  PRINTF(" LUNES=1    \n\r");
  PRINTF(" MARTES=2   \n\r");
  PRINTF(" MIERCOLES=3 \n\r");
  PRINTF(" JUEVES=4   \n\r");
  PRINTF(" VIERNES=5  \n\r");
  PRINTF(" SABADO=6   \n\r");
  PRINTF(" DOMINGO=7  \n\r");
  DATE=GETC();
  DATE=DATE-0X30;
  DATE=DATE-1;
  PRINTF(" INGRESE LOS DATOS DEL RELOJ Y FECHA\N\R");
  PRINTF("¿HORA?\n\r");
  HORA_A=GETC();
  HORA_B=GETC();
  VARIABLE_H=HORA_A-0X30;
  VARIABLE_L=HORA_B-0X30;
  HORA=(VARIABLE_H*10)+VARIABLE_L;
  PRINTF("HORA: %02D\n\r",HORA);
  DELAY_MS(500);
  PRINTF("¿MINUTOS?\n\r");
  MIN_H=GETC();
  MIN_L=GETC();
  VARIABLE_H=MIN_H-0X30;
  VARIABLE_L=MIN_L-0X30;
  MINUTOS=(VARIABLE_H*10)+VARIABLE_L;
  PRINTF("MINUTOS: %02D \n\r",MINUTOS);
  DELAY_MS(500);
  PRINTF("¿SEGUNDOS?\n\r");
  MIN_H=GETC();
  MIN_L=GETC();
  VARIABLE_H=MIN_H-0X30;
  VARIABLE_L=MIN_L-0X30;
  SEGUNDOS=(VARIABLE_H*10)+VARIABLE_L;
  PRINTF("MINUTOS: %02D \n\r",SEGUNDOS);
  DELAY_MS(500);
  PRINTF("¿DIA DEL MES?\n\r");
  DIA_H=GETC();
  DIA_L=GETC();
  VARIABLE_H=DIA_H-0X30;
  VARIABLE_L=DIA_L-0X30;
  DIAS=(VARIABLE_H*10)+VARIABLE_L;
  PRINTF("DIA: %02D \n\r",DIAS);
  DELAY_MS(500);
  PRINTF("¿MES?\n\r");
  MESH=GETC();
  MESL=GETC();
  VARIABLE_H=MESH-0X30;
  VARIABLE_L=MESL-0X30;
  MES=(VARIABLE_H*10)+VARIABLE_L;
  PRINTF("MES: %02D\n\r",MES);
  DELAY_MS(500);
  PRINTF("¿AÑO?\n\r");
  A_H=GETC();
  A_L=GETC();
  VARIABLE_H=A_H-0X30;
  VARIABLE_L=A_L-0X30;
  YEAR=(VARIABLE_H*10)+VARIABLE_L;
  PRINTF("AÑO: %02D\n\r",YEAR);
  DELAY_MS(500);
  DS1307_SET_DATE_TIME(DIAS,MES,YEAR,DATE,HORA,MINUTOS,SEGUNDOS);
  DS1307_GET_DAY_OF_WEEK((CHAR*) SDOW);
  DS1307_GET_DATE(DAY,MONTH,YR,DOW);
  DS1307_GET_TIME(HRS,MIN,SEC);
  PRINTF("%S: %02D/%02D/%02D|%02D:%02D:%02D|\n\r",SDOW,DAY,MONTH,YR,HRS,MIN,SEC);
  DELAY_MS(500);
  NUMERO=0;
}


VOID MAIN()
   {
   SETUP_ADC_PORTS (NO_ANALOGS);
   SET_TRIS_A (0XFF);
   SET_TRIS_B (0X0F);
   SET_TRIS_C (0XF1);
   SET_TRIS_D (0X00);
   SET_TRIS_E (0X02);
   ENABLE_INTERRUPTS(INT_TIMER0);
   SETUP_TIMER_0(RTCC_DIV_128|RTCC_8_BIT);
   SET_TIMER0(0);
   SETUP_TIMER_1(T1_EXTERNAL|T1_DIV_BY_1);
   SET_TIMER1(0);
   SETUP_CCP1(CCP_PWM_FULL_BRIDGE|CCP_PWM_H_H);
   SETUP_TIMER_2(T2_DIV_BY_16,PERIODO - 1,4);
   AUX=CICLO_UTIL;
   SET_PWM1_DUTY(AUX);
   DELAY_MS(500);
   ENABLE_INTERRUPTS(GLOBAL);
PRINTF("\f");
PRINTF("TIPO DE OPCIONES: PULSE NUMERO \N\R");
PRINTF("GUARDAR DATOS          1\n\r");
PRINTF("LEER MEMORIA           2\n\r");
PRINTF("CONFIGURAR RELOJ:      3\n\r");
PRINTF("SHUTDOWN               4\n\r");
PRINTF("INCREMENTO             5\n\r");
PRINTF("DECREMEMTO             6\n\r");
PRINTF("GIRO                   7\n\r");
PRINTF("HORA ACTUAL            8\n\r");
DELAY_MS(500);
PRINTF("\f");

WHILE(TRUE)
   {
   while( !kbhit() );
    NUMERO=GETC();

    SWITCH(NUMERO)
    CASE('2')

    {PRINTF("\F");
    Z=0;
    PRINTF("LOS 20 DATOS ALMACENADOS SON: \r");

    PRINTF("    VELOCIDAD   FECHA     HORA     SENTIDO   SHUTDOWN \n\r");
    FOR(INCREMENTO=1;INCREMENTO<=20;INCREMENTO++)
    {    DATO1_V= READ_EEPROM(Z);
         Z++;

         DATO2_D= READ_EEPROM(Z);
         Z++;

         DATO3_M  = READ_EEPROM(Z);
         Z++;

         DATO4_A= READ_EEPROM(Z);
         Z++;

        DATO5_H= READ_EEPROM(Z);
         Z++;

         DATO6_M= READ_EEPROM(Z);
         Z++;

         DATO7_S= READ_EEPROM(Z);
         Z++;

         DATO8_S= READ_EEPROM(Z);
         Z++;

         DATO9_A= READ_EEPROM(Z);
         Z++;

PRINTF(" %d.-  %Lu       %d/ %d/ %d    %d:%d:%d    %c     %c  \n\r ",INCREMENTO,DATO1_V,DATO2_D,DATO3_M,DATO4_A,DATO5_H,DATO6_M,DATO7_S,DATO8_S,DATO9_A);
         NUMERO=0; }
         BREAK
       }
    CASE('1')
          MEMORIA();
    CASE('3')
          RELOJ();
    CASE('4')
          SHUTDOWN();
    CASE('5')               //Incremento de velocidad
         {  DELAY_MS(500);
            IF (AUX<250)
               AUX=AUX+50;
               SET_PWM1_DUTY(AUX);
               PRINTF("CICLO UTIL= %LD\N\R",AUX);
               NUMERO=0;}
    CASE('6')               //Decremento de velocidad
         { DELAY_MS(500);
            IF (AUX>0)
            AUX=AUX-50;
            SET_PWM1_DUTY(AUX);
            PRINTF("CICLO UTIL0 %Ld \n\r",AUX);
            NUMERO=0;}
    CASE('7')
       { IF(SENTIDO==0)
         {SENTIDO=1;                                       //IZQUIERDA
          SETUP_CCP1(CCP_PWM_FULL_BRIDGE_REV|CCP_PWM_H_H);
          CARATER_S='I';
          PRINTF("<-----------\n\r ");      }
       ELSE
          {SENTIDO=0;//DERECHA
           CARATER_S='D';
           SETUP_CCP1(CCP_PWM_FULL_BRIDGE|CCP_PWM_H_H);   //MODO PWM PARA EL CCP1
           PRINTF("-----------> \R\N ");     }  }
    CASE('8')
           {DS1307_GET_DAY_OF_WEEK((CHAR*) SDOW);
           DS1307_GET_DATE(DAY,MONTH,YR,DOW);
           DS1307_GET_TIME(HRS,MIN,SEC);
           PRINTF("%S: %02D/%02D/%02D|%02D:%02D:%02D|   \N\R",SDOW,DAY,MONTH,YR,HRS,MIN,SEC);
           }}
        }



#INT_TIMER0
VOID D_T()
   {  INTERRUPCION++;
   IF(INTERRUPCION > 30)
      {   INTERRUPCION=0;
          RPS=GET_TIMER1();
          SET_TIMER1(0);
          DS1307_GET_DAY_OF_WEEK((CHAR*) SDOW);
          DS1307_GET_DATE(DAY,MONTH,YR,DOW);
          DS1307_GET_TIME(HRS,MIN,SEC);
          MEMORIA();
   IF(NUMERO=='V')
         PRINTF(" VELOC:%LD RPS  \n\r ",RPS);
  }
 }



VOID SHUTDOWN()
   {

         IF(PARADA==0)
            {
            PARADA=1;
            PRINTF("ACTIVADO\n\r ");
            SETUP_CCP1(CCP_SHUTDOWN_BD_L);
            CARATER_A='S';
            DELAY_MS(100);
            }
         ELSE
            {
              PARADA=0;
              PRINTF("DESACTIVADO\n\r ");
              SETUP_CCP1(CCP_SHUTDOWN_RESTART);
              SET_PWM1_DUTY(AUX);
              CARATER_A='N';
            }
NUMERO=0;
   }



VOID MEMORIA()
{ IF(NUMERO=='1'&& CONTROL<=20)
        {   IF(CONTROL==0)
        {   PRINTF("ESCRITURA DE MEMORIA \n\r");}
        CONTROL++;
PRINTF("VELOCIDAD   FECHA         HORA     SENTIDO   SHUTDOWN \N\R");
PRINTF(" %Lu        %02d/%02d/%02d|   %02d:%02d:%02d|     %c         %c \n\r "RPS,DAY,MONTH,YR,HRS,MIN,SEC, CARATER_S, CARATER_A);
         WRITE_EEPROM(LECTURA,RPS );
         DELAY_MS(1);
         LECTURA++;
         WRITE_EEPROM(LECTURA,DAY );
         DELAY_MS(1);
         LECTURA++;
         WRITE_EEPROM(LECTURA,MONTH );
         DELAY_MS(1);
         LECTURA++;
         WRITE_EEPROM(LECTURA,YR );
         DELAY_MS(1);
         LECTURA++;
         WRITE_EEPROM(LECTURA,HRS );
         DELAY_MS(1);
         LECTURA++;
         WRITE_EEPROM(LECTURA,MIN );
         DELAY_MS(1);
         LECTURA++;
         WRITE_EEPROM(LECTURA,SEC );
         LECTURA++;
         WRITE_EEPROM(LECTURA,CARATER_S);
         LECTURA++;
         WRITE_EEPROM(LECTURA,CARATER_A);
         LECTURA++;

      IF(CONTROL>=20)
         { CONTROL=0;
         NUMERO=0;
         LECTURA=0;
         }
         }
         }

