#include <16f877.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES PROTECT //Code protected from reads
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#use delay(clock=20000000)
#use standard_io(c)
#use rs232(baud=9600,parity=N,bits=8,stop=1,xmit=PIN_C6,rcv=PIN_C7,enable=PIN_C5,errors)
char Keypress=' ';
#int_rda
void serial_isr() {
Keypress=0x00;
if(kbhit()){
Keypress=getc();
if(Keypress!=0x00){
putchar(keypress);
keypress=0x00;
printf("hola amigo");
}
}
}
void main() {
enable_interrupts(global);
enable_interrupts(int_rda);
printf("\r\n\Listen on RS232 (Int)\r\n");
do {
} while (TRUE);
}#include <16F877.h> // Se añade la libreria del PIC a utilizar
#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) //enable=PIN_C5 hace que el C maneje el pin de habilitación
#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
//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;
char c;
disable_interrupts(int_rda);//Aqui deshabilito la interrupción
if (kbhit())
//wait until a character has been received
c = getc();
//read character from UART
if(c='H'){
printf(" Interrupcion ");
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;
////////////////////////////////////////////////////////////////////////////////////
/// ///
/// GUARDAR DATOS EN EEPROM EXTERNA Y INICIALIZAR CONTAJE RELOJ ///
/// ///
////////////////////////////////////////////////////////////////////////////////////
init_ext_eeprom(); // Inicializamos EEPROM EXTERNA
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;
printf(" ariburri ");
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,
do{
enable_interrupts(global);
enable_interrupts(int_rda);
}while(TRUE);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
#include <16f877.h>
///////////////////////////////////////////////////////////////////////////////////////////////////
// Fuses y ajuste de Clock
///////////////////////////////////////////////////////////////////////////////////////////////////
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
#use delay(clock=20000000)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Canal de Comunicación : usart
///////////////////////////////////////////////////////////////////////////////////////////////////
#define TTL_TX PIN_C6
#define TTL_RX PIN_C7
#use rs232(baud=9600, xmit=TTL_TX, rcv=TTL_RX)
void main() {
char rec;
printf("TyP_Serie_TTL\r\n"); // Al inicio escribe para ver que emite correctamente
do{ // Bucle ...
if(kbhit()){ // Si hay algo pendiente de recibir ....
rec=getc(); // recibe el caracter ...
putc(rec); // ... y lo escribes ...
} // ... después continúa ...
}while(TRUE); // ... hasta el infinito.
}
///////////////////////////////////////////////////////////////////////////////////////////////////
#include <16f877.h>
///////////////////////////////////////////////////////////////////////////////////////////////////
// Fuses y ajuste de Clock
///////////////////////////////////////////////////////////////////////////////////////////////////
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
#use delay(clock=20000000)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Canal de Comunicación : usart
///////////////////////////////////////////////////////////////////////////////////////////////////
#use rs232(baud=9600,parity=N,bits=8,stop=1,xmit=PIN_C6,rcv=PIN_C7)
void main() {
char rec;
printf("TyP_Serie_TTL\r\n"); // Al inicio escribe para ver que emite correctamente
do{ // Bucle ...
if(kbhit()){ // Si hay algo pendiente de recibir ....
rec=getc(); // recibe el caracter ...
putc(rec); // ... y lo escribes ...
} // ... después continúa ...
}while(TRUE); // ... hasta el infinito.
}
Creo que tiene que haber algo más porque utilizando este codigo no funciona. ///////////////////////////////////////////////////////////////////////////////////////////////////
#include <16f877.h>
///////////////////////////////////////////////////////////////////////////////////////////////////
// Fuses y ajuste de Clock
///////////////////////////////////////////////////////////////////////////////////////////////////
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
#use delay(clock=20000000) // Verificar que el cristal es de 20 Mhz
///////////////////////////////////////////////////////////////////////////////////////////////////
// Canal de Comunicación : usart
///////////////////////////////////////////////////////////////////////////////////////////////////
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
void main() {
char rec;
delay_ms(1000); // esperamos
set_tris_c(0b10000000); // Configuramos bien pines TX y RX
output_high(PIN_C5); // Habilito transmisión
printf("TyP_Serie_TTL\r\n"); // Al inicio escribe para ver que emite correctamente
output_low(PIN_C5); // Habilito recepción
do{ // Bucle ...
if(kbhit()){ // Si hay algo pendiente de recibir ....
rec=getc(); // recibe el carácter ...
output_high(PIN_C5); // Habilito transmisión
//printf("FUNIONA\r\n");
putc(rec); // ... y lo escribes ...
output_low(PIN_C5); // Habilito recepción
} // ... después continúa ...
}while(TRUE); // ... hasta el infinito.
}Hola.
Insisto en que tu problema esta en el hard y no en el soft. Con el programa que te dio RedPic es mas que suficiente para que el PIC capture los datos. Si dices que solo envia y no recibe es porque el pin de habilitacion de un MAX esta cambiando pero el del PC no cambia nunca de estado y solo se queda en recepcion.
Saludos