Muchisimas gracias maunix;
Este mismo programa quiero que lo realice cuando el PC envie un dato al PIC y a ete le salte una interrupción, pero tengo un problema y es que el PIC interpreta que mientras no envia tiene el puerto abierto como si estuviese recibiendo... y entonces al ejecutar este código creo que continuamente me salta la interrupción, como puedo arreglarlo para que tan solo envie datos cuando el PC envia la señal para que este los envie aquí os dejo el código. UN saludo a todos!!!
#include <16F877.h> // Se añade la libreria del PIC a utilizar
#device adc=8 // Escogemos una resolucion del conversor de 8 bits
#FUSES NOWDT,HS,NOPUT,PROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay(clock=20000000) //Velocidad del reloj
#use rs232(baud=9600,parity=N,bits=8,stop=1,xmit=PIN_C6,rcv=PIN_C7,enable=PIN_C5,errors) //enable=PIN_C5 hace que el C maneje el pin de habilitación
//Configuramos los PINS C3 Y C4 para controlar la EEPROM
#define EEPROM_SDA PIN_C4
#define EEPROM_SCL PIN_C3
#include <24512.c> // Se añade la libreria de la EEPROM 24LC512
#include <external_eeprom.c> // Se añade la libreria para controlar una EPROM externa
//#include <ds1302.c> // Se añade la libreria del RTC al proyecto
//Interrupción probocada por el PC para volcar datos
#int_rda
void serial_isr(){
///////////////////////////////////////////////////////////////////////////////////
/// ///
/// LECTURA DE DATOS EN LA EEPROM Y ENVIAR AL PC ///
/// ///
///////////////////////////////////////////////////////////////////////////////////
int dato=0,dir2=0,i=0,f=0,g=0,h=0,j=0,k=0;
float dato2=0;
dato=read_ext_eeprom(dir2); // Leemos la hora en la EEPROM
dir2=dir2+1; // Incrementamos el puntero de la EEPROM
printf("%u",dato);// Enviamos dato a ordenador
delay_ms(200);
dato=read_ext_eeprom(dir2); // Leemos los minutos en la EEPROM
dir2=dir2+1; // Incrementamos el puntero de la EEPROM
printf("%u",dato);// Enviamos dato a ordenador
delay_ms(200);
dato=read_ext_eeprom(dir2); // Leemos los segundos en la EEPROM
dir2=dir2+1; // Incrementamos el puntero de la EEPROM
printf("%u",dato);// Enviamos dato a ordenador
delay_ms(200);
delay_ms(200);
for (f=0; f<4; f++){ // Leemos las irradiancias de la EEPROM EXTERNA
dato2= read_float_ext_eeprom(dir2);
delay_ms(200);
dir2=dir2+4;
printf("%f",dato2);// Enviamos dato a ordenador
}
for (g=0; g<4; g++){// Leemos las temperaturas ambientes en la EEPROM EXTERNA
dato2= read_float_ext_eeprom(dir2);
delay_ms(200);
dir2=dir2+4;
printf("%f",dato2);// Enviamos dato a ordenador
}
for (h=0; h<4; h++){// Leemos las temperaturas en la placa de la EEPROM EXTERNA
dato2= read_float_ext_eeprom(dir2);
delay_ms(200);
dir2=dir2+4;
printf("%f",dato2);// Enviamos dato a ordenador
}
for (i=0; i<4; i++){// Leemos las velocidades del viento de la EEPROM EXTERNA
dato2= read_float_ext_eeprom(dir2);
delay_ms(200);
dir2=dir2+4;
printf("%f",dato2);// Enviamos dato a ordenador
}
for (j=0;j<4;j++){// Leemos los voltios de la EEPROM EXTERNA
dato2= read_float_ext_eeprom(dir2);
delay_ms(200);
dir2=dir2+4;
printf("%f",dato2);// Enviamos dato a ordenador
}
for (k=0;k<4;k++){// Leemos las intensidades de la EEPROM EXTERNA
dato2= read_float_ext_eeprom(dir2);
delay_ms(200);
dir2=dir2+4;
printf("%f",dato2);// Enviamos dato a ordenador
}
}
////////////////////////////////////////////////////////////////////////////////////
/// ///
/// ///
/// PROGRAMA PRINCIPAL ///
/// ///
/// ///
////////////////////////////////////////////////////////////////////////////////////
void main(void) // Inicio del programa principal
{
///////////////////////////////////////////////////////////////////////////////////
/// ///
/// DECLARACIÓN DE LAS VARIABLES E INICIALIZACION DE ÉSTAS ///
/// ///
///////////////////////////////////////////////////////////////////////////////////
//Variables float que contienen datos de las tablas
float irra[] = {1, 2, 3, 6};
float tempa[] = {6, 3, 2, 1};
float tempm[] = {2, 4, 5, 6};
float vel[] = {2, 4, 5, 6};
float volt[] = {2, 4, 5, 6};
float inte[] = {2, 4, 5, 6};
//Variables int que contienten el valor de la fecha
int min,sec,hr;
//Inicialización de las variables necesarias para movernos por la EEPROM
int dir=0;
//Iniciaización variables para necesarias para moverse dentro de los datos
int f=0,g=0,h=0,i=0,j=0,k=0;
min=0;
sec=0;
hr=0;
setup_adc_ports (A_ANALOG_RA3_REF);
setup_adc(ADC_CLOCK_INTERNAL);
////////////////////////////////////////////////////////////////////////////////////
/// ///
/// GUARDAR DATOS EN EEPROM EXTERNA Y INICIALIZAR CONTAJE RELOJ ///
/// ///
////////////////////////////////////////////////////////////////////////////////////
init_ext_eeprom(); // Inicializamos EEPROM EXTERNA
//rtc_init(); // Inicializamos el Real Time Clock
delay_ms(200);// retraso 200 milisegundos para no colapsar PIC
//rtc_get_time(hr,min,sec); //Guardamos la hora, minuto y segundo que nos da el RTC
write_ext_eeprom(dir,hr); // Escribimos la hora en la EEPROM
dir=dir+1; // Incrementamos el puntero de la EEPROM
write_ext_eeprom(dir,min); // Escribimos los minutos en la EEPROM
dir=dir+1; // Incrementamos el puntero de la EEPROM
write_ext_eeprom(dir,sec); // Escribimos los segundos en la EEPROM
dir=dir+1; // Incrementamos el puntero de la EEPROM
delay_ms(200);
for (f=0; f<4; f++){ // Escribimos las irradiancias en la EEPROM EXTERNA
write_float_ext_eeprom(dir, irra[f]);
delay_ms(200);
dir=dir+4;
}
f=0;
for (g=0; g<4; g++){// Escribimos las temperaturas ambientes en la EEPROM EXTERNA
write_float_ext_eeprom(dir, tempa[g]);
delay_ms(200);
dir=dir+4;
}
g=0;
for (h=0; h<4; h++){// Escribimos las temperaturas en la placa en la EEPROM EXTERNA
write_float_ext_eeprom(dir, tempm[h]);
delay_ms(200);
dir=dir+4;
}
h=0;
for (i=0; i<4; i++){// Escribimos las velocidades del viento en la EEPROM EXTERNA
write_float_ext_eeprom(dir, vel[i]);
delay_ms(200);
dir=dir+4;
}
i=0;
for (j=0;j<4;j++){// Escribimos los voltios en la EEPROM EXTERNA
write_float_ext_eeprom(dir, volt[j]);
delay_ms(200);
dir=dir+4;
}
j=0;
for (k=0;k<4;k++){// Escribimos las intensidades en la EEPROM EXTERNA
write_float_ext_eeprom(dir, inte[k]);
delay_ms(200);
dir=dir+4;
}
k=0;
enable_interrupts(global);
enable_interrupts(int_rda);
do{
delay_ms(500); // espera por ejemplo 0,5 seg para enviar nuevamente el dato,
output_HIGH(PIN_B1); // por ejemplo conectas un led entre el pin B1 y masa y este debe prender
delay_ms(250); // espera por ejemplo 0,25 seg
output_LOW(PIN_B1); // se apaga el led
delay_ms(250); // esperas otros 0,25 seg para enviar nuevamente el dato,
}while(TRUE);
}
Gracias de antemano!!!!!!!