Autor Tema: Combinar un programa autononmo con USB 18f4550  (Leído 1916 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado antonio903

  • PIC10
  • *
  • Mensajes: 1
Combinar un programa autononmo con USB 18f4550
« en: 27 de Abril de 2014, 23:39:30 »
Un saludo a todos y muchas gracias por la paciencia ydedicasión soy técnico en electronica y lo que se de micro controladores
lo he aprendido en el foro y internet no mucho pero he echo cosillas
Utilzo 18f4550  Real Time Clock 1302 , lcd 16x2 y un potenciómetro para entrada analogica

Y lo que quiero hacer es que al arrancar mantener a 1 o a 0 unas salidas de un puerto leyendo unos datos de la eeprom
que se pudan modificar esos datos a través del hiperterminal en el pc ,en el lcd se vería la fecha y la hora
lo tengo funcionando como yo quiero el problema es que cuando lo conecto al puerto USB arranca bien anda el reloj el tiempo que sea sin abrir el hyerterminal cuado lo abro funciona bien veo la tensión del potenciómetro puedo cambiar los datos de la eeprom del micro el reloj anda en el lcd cierro el hyperterminal y al minuto y algo se para el reloj lo vuelvo abrir anda el reloj otra ves al cerrar el hyperterminal se bloquea y quiero que aga mas cosas sin abrir el programa del pc

 !!aqui esta el paciente!!
#include <18F4550.h>             //PIC a emplear

#device adc=10;                  //Conversor A/D de 10 bits

#fuses HSPLL,NOWDT,NOLVP,USBDIV,PLL5,CPUDIV1,VREGEN,MCLR,PUT,NOPBADEN

#use delay(clock=48000000)       //Frecuencia del cristal oscilador externo

#include <usb_cdc.h>             //Librería de control USB
#include <lcd.c>
#include <DS1302.C>
#use standard_io(e)


///VARIABLES GLOBALES
byte day,mth,year,dow,hour,min,sec; //variabes para ds1302
//byte flag=0,var=2; //variables para menu configurar
byte c_h,c_m,f_h,f_m;
///LLAMADA FUNCION INTERRUPCION
 //#INT_TIMER0
void hora()
{

         rtc_get_date(day,mth,year,dow); //coge dia,mes,año
         rtc_get_time(hour,min,sec ); //coge hora,minuto,segundo
         printf(lcd_putc,"\fFECHA: %02d/%02d/%02d\nHora: %02d:%02d:%02d",day,mth,year,hour,min,sec);


}


 
/******************************************************************************/
/*************************  FUNCIÓN PRINCIPAL  ********************************/

void main() {

  lcd_init();
 
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64);
 // setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //configuracion interrupcion TMR0
  setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
  disable_interrupts(INT_TIMER0); //interrupcion TIMER0 activada
  disable_interrupts(GLOBAL);
  set_timer0(0); //carga TMR0

   
 
 
 
   int16 valor_digital;          //Valor digital obtenido del conversor A/D
   float valor_analogico;        //Valor analógico medido en el conversor A/D
   char teclado;               //Dato recibido del PC
   //int1 control;                 //falso o verdadero para mostrar tensión
   
   setup_adc_ports(AN0);         //Definición del pin a utilizar como entrada analógica
   setup_adc(ADC_CLOCK_INTERNAL);//Definición de la fuente de reloj para el A/D
   set_adc_channel(0);           //Selección del canal analógico
   
   usb_cdc_init();               //Inicialización del modo CDC
   usb_init();         //Inicialización del control del USB
   rtc_init();
   
  if (read_eeprom(0)==0xff)
  {output_high(pin_d7);
  }
  else {output_low(pin_d7); }
 
   if (read_eeprom(1)==0xff)
  {output_high(pin_d6);
  }
  else {output_low(pin_d6); }
   
    if (read_eeprom(2)==0xff)
  {output_high(pin_d5);
  }
  else {output_low(pin_d5); }
 
   if (read_eeprom(3)==0xff)
  {output_high(pin_d4);
  }
  else {output_low(pin_d4); }
 
   if (read_eeprom(4)==0xff)
  {output_high(pin_c7);
  }
  else {output_low(pin_c7); }
 
   if (read_eeprom(5)==0xff)
  {output_high(pin_c6);
  }
  else {output_low(pin_c6); }
 
  hora();
 while(true)  {
      if(usb_cdc_connected()) {
      usb_task();               //Detección de la conexión de dispositivo USB
                     //Devuelve TRUE si dispositivo ha sido enumerado por el PC
      if (usb_enumerated()) {
         
         hora();
         //Lectura del canal analógico
         valor_digital=read_adc();
         valor_analogico=5.0*valor_digital/1024.0;
         //Si se ha recibido dato...
         if (usb_cdc_kbhit()){
             lcd_gotoxy(16,2);
             lcd_putc("U");
            teclado=usb_cdc_getc();  //lo lee ylo almacena en la variable teclado
            //teclado pc nº del 1 al 6 enciende y apaga led
             switch(teclado){
    // Periodos Prefijados
    case '1': output_high(pin_d7),write_eeprom(0,0xff);
              break;
    case 'q': output_low(pin_d7),write_eeprom(0,0x00);
              break;         
    case '2': output_high(pin_d6),write_eeprom(1,0xff);
              break;
    case 'w': output_low(pin_d6),write_eeprom(1,0x00);
              break;
    case '3': output_high(pin_d5),write_eeprom(2,0xff);
              break;         
    case 'e': output_low(pin_d5),write_eeprom(2,0x00);
              break;
    case '4': output_high(pin_d4),write_eeprom(3,0xff);
              break;
    case 'r': output_low(pin_d4),write_eeprom(3,0x00);
              break;         
    case '5': output_high(pin_c7),write_eeprom(4,0xff);
              break;
    case 't': output_low(pin_c7),write_eeprom(4,0x00);
              break;
    case '6': output_high(pin_c6),write_eeprom(5,0xff);
              break;
    case 'y': output_low(pin_c6),write_eeprom(5,0x00);
              break;
   // case 'h': rtc_set_datetime(1,4,14,0,3,14);
         //     break;         
    }
         teclado=0x00;
         }
         //Si control=1 envia a PC valor de tensión leido
         // if (control==1)
            printf(usb_cdc_putc, "\f Voltage = %01.2fV", valor_analogico);
         //sino deja de enviarlo y limpia la pantalla del hyperterminal   
        // else 
           // printf(usb_cdc_putc, "\f ");
            hora();
         delay_ms(300);
      }
      }
      else
      hora();
     
      }
       
      } 
Esto es es unas pruebas que estoy haciendo ,en realidad el programa va a ser bastante más largo
« Última modificación: 09 de Mayo de 2014, 21:50:29 por antonio903 »


 

anything