bmb, creo que ya he logrado hacer algo de lo que queria, solo que me parece que ahora no estoy leyendo bien a la hora de mostrar por serie los valores guardados en la eeprom, se que esos valores no son correctos, lo que no se es por que estoy leyendolos mal, si se que los esta guardando bien. Otra cosa, que compilador estas usando, pq en el que yo uso (PCWC compiler version 3.249) no me sale ningun warning.
diseño del hardware (MPLAB):
http://www.filefactory.com/file/cbf547d/n/Diseño_hardware.rar
el codigo como me quedo:
#include <16F877A.h> /// libreria para el manejo del pic16f877a
#device ADC=10 ICD=TRUE
#include <stdlib.h>
#define EEPROM_SDA PIN_c4
#define EEPROM_SCL PIN_c3
#include "24256.c"
#include "external_eeprom.c"
#priority rda,ad,timer1,timer0
#use delay(clock=20000000) /// declara la frecuencia del cristal 20mhz
#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use fast_io(A)
#use fast_io(B)
#use fast_io(C) /// con esta instruccion evitamos que
#use fast_io(D) /// se este configurando cada vez que usamos
#use fast_io(E) /// alguna instruccion de entrada o salida
#byte porta = 5
#byte portb = 6
#byte portc = 7 /// se definen direcciones de memoria
#byte portd = 8
#byte porte = 9
int nums[7];
int temporal;
int cont_letras; //variable para contar los 8 numeros que se puede entrar por Tx serie
int16 time; //hasta 300 segundos entre recuperaciones de muestras
int16 cant_var; //hasta 2000 muestras que es necesario recojer
int cont_seg;
int16 cont_time;
int16 cont_var;
int estado_leds;
int var_in_rand;
int16 lectura_ad;
int canal_ad;
int Tabla(int a) //tabla para visualizar numeros por el 7segmentos
{
switch(a)
{
CASE 0:RETURN 0b00111111;
CASE 1:RETURN 0B00000110;
CASE 2:RETURN 0B01011011;
CASE 3:RETURN 0B01001111;
CASE 4:RETURN 0B01100110;
CASE 5:RETURN 0B01101101;
CASE 6:RETURN 0B01111101;
CASE 7:RETURN 0B00000111;
CASE 8:RETURN 0B01111111;
CASE 9:RETURN 0B01100111;
}
}
int Is_num(int a)
{
if(a>=48 && a<=57)
return 0; //si es 0 es un numero sino es otro
return 1;
}
void actualiza_led(int i)
{
switch(i)
{
case 0: portb= 0B11111110; //PC
portd= 0B01110011;
delay_ms(50);
portb= 0B11111101;
portd= 0B00111001;
break;
case 1: portb= 0B11111110; //Ad
portd= 0B01110111;
delay_ms(50);
portb= 0B11111101;
portd= 0B01011110;
break;
case 2: portb= 0B11111110; //Sd
portd= 0B01101101;
delay_ms(50);
portb= 0B11111101;
portd= 0B01011110;
break;
}
}
#use delay(clock=20000000)
void LeerAD(int canal)
{
lectura_ad = 0;
set_adc_channel(canal);
lectura_ad = read_adc();
}
#int_TIMER0 //directiva para it del timer0
void TIMER0_isr()
{
actualiza_led(estado_leds);
set_timer0(81);
}
#use delay(clock=20000000)
#int_TIMER1 //directiva para it del timer0
void TIMER1_isr()
{
if(cont_seg > 9)
{
cont_seg = 0;
if(cont_time < time)
cont_time++;
else
temporal =1;
}
cont_seg++;
set_timer1(3063);
}
#int_rda
void rda_isr()
{
if(cont_letras < 7)
{
temporal = getc();
if(Is_num(temporal)==0)
{
temporal =temporal-48;
nums[cont_letras] = temporal;
printf ("%d",nums[cont_letras]);
cont_letras++;
}
else
{
cont_letras = 0;
printf ("Error");
}
}
}
void configurar(void) //configuraciones
{
enable_interrupts(INT_TIMER0); //habilitar el timer0
enable_interrupts(INT_TIMER1); //habilitar el timer1
enable_interrupts(INT_RDA); //habilitar para comunicación serie
enable_interrupts(GLOBAL); //habilitar el bit de it global
setup_adc_ports( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_tris_d(0x00);
set_tris_b(0x00);
}
#use delay(clock=20000000)
void main()
{
while(1)
{
cont_seg = 0;
estado_leds = 0;
cont_letras = 0;
var_in_rand = 0;
cont_time = 1;
canal_ad = 0;
cont_var = 0;
configurar();
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
set_timer0(81);
while(var_in_rand == 0)
{
while(cont_letras < 7){}
cant_var = _mul(nums[0],1000) + _mul(nums[1],100) + _mul(nums[2],10) + nums[3];
time = _mul(nums[4],100) + _mul(nums[5],10) + nums[6];
var_in_rand = 1;
if(time>300 || time<1)
{
printf (" Tiempo fuera de rango. ");
cont_letras = 0;
var_in_rand = 0;
}
else
if(cant_var>2000)
{
printf (" Cantidad de muestras fuera de rango. ");
cont_letras = 0;
var_in_rand = 0;
}
}
estado_leds = 1;
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
set_timer1(3063);
init_ext_eeprom();
while(cont_var<cant_var)
{
if(temporal ==1)
{
disable_interrupts(int_TIMER1);
temporal =0;
cont_time = 1;
for(canal_ad=0;canal_ad<8;canal_ad++)
{
LeerAD(canal_ad);
write_int16_ext_eeprom(_mul(cont_var+canal_ad,2), lectura_ad);
delay_ms(20);
}
cont_var++;
enable_interrupts(INT_TIMER1);
}
}
disable_interrupts(int_TIMER1);
lectura_ad=0;
estado_leds = 2;
printf(" Lecturas: ");
for(cont_var=0; cont_var<_mul(cant_var,16); cont_var+=2)
{
lectura_ad = read_int16_ext_eeprom(cont_var);
printf("%2x ",lectura_ad);
delay_ms(20);
}
printf(" FIN");
}
}