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