Hola
'Amos a ver.. que compilo mi programa, con sus ajustes, todo bien... lo mando a simular al proteus, y descubro que a partir de cierto segmento del programa, se "estanca" el programa. Miro en el debug del proteus, y pone que "no source line in adress 0x3C9". Voy al PICC, miro en el ASM_OUTPUT, y sorpresa! El compilador ha metido la instruccion SLEEP en la direccion 0x3C8!! Lo que es mas sorprendente... al principio de una subrutina!
VARIABLES.C
int16 time=0;
int LED[4]={0x01,0x02,0x04,0x08};
int16 TVALUE=0;
int16 TVALUEPREV=0;
int16 TMAX=0x0000;
int16 TMIN=0xFFFF;
int16 TMED=0;
int count=0;
int Pulse_Status=0;
int16 DIFF=0;
int16 RNDFACTOR=0; //factor aleatorio del tiempo
int DF;
int a,b;
int randval;
int16 randval2;
MAIN.C
#include <16f876.h>
#use delay(clock=20000000)
#fuses HS,NOWDT
#include <lcdPORTC.c>
#include <stdlib.h>
#include <variables.c>
#define SET_LED(x) (output_a(x || input(PIN_A5))
#define SET_BUZZER(x) (output_bit(PIN_A5,x))
#define READ_PULSE() (!input_b() && 0x0F)
int16 Difficulty();
void Game();
void main()
{
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2);
set_timer1(0);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_RB);
lcd_init();
setup_adc_ports(NO_ANALOGS);
set_tris_a(0x00);
set_tris_b(0xF0);
port_b_pullups(TRUE);
printf(LCD_PUTC,"Medidor Reflejos");
printf(LCD_PUTC,"***Manex 2006***");
//delay_ms(1000);
DIFF=Difficulty();
DIFF=800-100*DIFF;//PROVISIONAL: tiempo que pasa desde pulsar un boton
//hasta encenderse otro led
Game();
while(1);
}
int16 Difficulty()
{
lcd_putc('\f');
lcd_gotoxy(1,1);
printf(LCD_PUTC,"Dificultad:1 2");
printf(LCD_PUTC,"PULSAR 3 4");
DF=0;
while(DF=0) //Rutina de lectura y evitacion de datos erroneos
{
do{
Pulse_Status=READ_PULSE();
}while(Pulse_Status==0);
switch (Pulse_Status){
case 0x01: DF=1;
break;
case 0x02: DF=2;
break;
case 0x04: DF=3;
break;
case 0x08: DF=4;
break;
default: break;
}
}
lcd_putc('\f');
return DF;
}
void Game()
{
printf(LCD_PUTC,"Preparado...");
for(a=5;a==0;a--)
{
lcd_gotoxy(2,1);
printf(LCD_PUTC,"%u",a);
}
lcd_putc('\f');
time=0;
set_timer1(0xEC77);
enable_interrupts(GLOBAL);
for(a=32;a==0;a--)
{
SET_BUZZER(1);
delay_ms(100);
SET_BUZZER(0);
b=get_timer0();
randval=(b/64)+1;
randval2=DIFF+b*3;
do
{
Pulse_Status=READ_PULSE(); //Esperamos a que no haya ninguna tecla pulsada
}while(Pulse_Status!=0x00);
delay_ms(randval2);
SET_LED(LED[randval])); //?????COMPILADOR EXIGE PARENTESIS ADICIONAL????????
TVALUEPREV=time;
do
{
}while(Pulse_Status=LED[randval]); //pulsador coincide con LED
TVALUE=time;
TVALUE=TVALUE-TVALUEPREV; // sacamos el lapso de tiempo entre luz...pulsador
if(TVALUE>TMAX) TMAX=TVALUE; //maximo
if(TVALUE<TMIN) TMIN=TVALUE; //minimo
TMED=TMED+TVALUE/32; //media en 32 intentos
}
}
#INT_TIMER1
void isr()
{
set_timer1(0xEC77); //1msec de timer
if(time++==0xFFFF) time=0; //capacidad:65,535 sec
}
#INT_RB
void isr2()
{
Pulse_Status=READ_PULSE();
}
Resumiendo, se trata de generar el encendido aleatorio de un LED, y de cronometrar el tiempo hasta pulsar el pulsador que le corresponde. Se observa, que despues de MAIN viene DIFFICULTY. Pues cuando miro el asm generado, descubro que la instruccion SLEEP viene... justo cuando empieza lo referente a la subrutina DIFFICULTY!
Es decir, es bien sabido que al final de MAIN siempre viene un sleep (para marcar el fin del programa), pero a mi me lo mete en la siguiente funcion!
Aver si podeis ayudarme... culpa del proteus no creo que sea, pues lo irracional viene desde el mismo ASM!
Bug del CCS? Mal programado (pero bien compilado)?
salu2!