Hola, te agradezco la ayuda, aunque ese codigo es viejo, el timer que activo es el timer0 que se encarga de actualizar el 7segmentos, ya tengo un codigo mejo implementado, pero aun solo me muestra la primera lectura, pues el resto solo me muestra ff, no tengo ni idea de por que....
#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 tecla_activa;
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()
{
disable_interrupts(int_rda);
tecla_activa=1;
}
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;
tecla_activa = 0;
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)
{
if(tecla_activa ==1)
{
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");
}
enable_interrupts(int_rda);
tecla_activa = 0;
}
}
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");
}
}