TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: mlen en 28 de Abril de 2013, 20:27:20
-
Hola, tengo un problema para debugear en el mplab. Tengo un proyecto programado en c con el compilador ccs, este tiene que usar las interrupciones del timer 1, el problema es que al debuggear no entra a la función de interrupción del timer, siempre se queda en la función principal (loop), y si quiero poner un breakpoint en la función de interrupción me tira un error.
¿Alguna idea para debuggear y que pueda entrar a la función de interrupción?
-
podrias poner tu código para ayudarte
-
pongo solo el main y la interrupcion del timer si necesitas algo mas pedimelo
#include <libreria.h>
#fuses XT,NOWDT, NOPROTECT
#use delay(clock =20000000)
#use standard_io(A) //uso standard_io
#use standard_io(B) //uso standard_io
#use standard_io(C) //uso standard_io
#use standard_io(D) //uso standard_io
#use standard_io(E) //uso standard_io
void main(void){
//--------------------------------------------------------------------------------------
// Variables Locales
//--------------------------------------------------------------------------------------
unsigned char Tecla; // Variable local utilizada para la lectura de las teclas
port_b_pullups(TRUE); //inicio
OUTPUT_C(0);
OUTPUT_HIGH(PIN_E0);
OUTPUT_LOW(PIN_E0);
Leds = 0;
est = 0;
flag = 0;
Estado = 0;
est_juego = 0;
turno = 0;
mostrar = 0;
cant=1; //1 son 2 jugadores, 0 un solo jugador, por defecto empiezan dos jugadores
record = 0; //inicio a 0 los buffer de puntajes
jug1 = 0;
jug2 = 0;
puntos = 0;
cont = 0;
setup_timer_1 (T1_INTERNAL|T1_DIV_BY_8);
set_timer1 (0xff29);
enable_interrupts(INT_TIMER1);
enable_interrupts(global); //fin inicio
TIMERS_Inicializar();
while(true){
TIMERS_Verificar_Fin(); // Chequeo el vencimiento de los temporizadores
Tecla = Get_Key(); // Chequeo si hubo alguna tecla presionada
switch(Estado){
case 0: //estado standby
if( Tecla == 1 ){
Estado=1;flag=0;Leds = 0; seleccion = 0; solto = 0;
texto('J', 3);texto('U', 4);texto('G', 5);texto(55, 6);texto(55, 7);texto(57,8); //no entiendo porque no anda mostrardis(2,1);
}
else if(flag==0){
flag=1;
MostrarDis(record,2); LimpiarPantalla(); texto('A', 3);texto('L', 4);texto('E', 5);texto('L', 6);texto('I', 7);texto(91, 8);
Efectos(T0);
}
break;
case 1: //estado menu
if(flag==0){
flag=1;TIMERS_Encender(2,4);
}
switch(seleccion){
case 0:
if(Tecla == 1){ //va a seleccionar nivel de juego
TIMERS_Detener(2); seleccion = 1; flag = 0;tecla = 0;
/*LimpiarPantalla();*/ texto('F',3);texto('A',4);texto('C',5);texto('I',6);texto('L',7);texto(91,8);
}
if( Tecla == 2){
if(cant == 1){
cant=0;
Leds = 2;
//MostrarDis(1,1);
texto('J', 3);
texto('U', 4);
texto('G', 5); //cambia a 1 JUG
texto(55, 6);
texto(55, 7);
texto(56, 8);
}
else {
cant = 1 ;
Leds = 4;
texto('J', 3); //CAMBIA A 2 JUG
texto('U', 4);
texto('G', 5);
texto(55, 6);
texto(55, 7);
texto(57, 8);
}
}
break;
case 1: //nivel =0 facil - nivel = 1 Dificil
if( Tecla == 1 ){ TIMERS_Detener(2); Estado = 2; flag = 0; } //va a estado juego
if( Tecla == 2 ){
if(nivel == 0){
nivel = 1; LimpiarPantalla();texto('D',3);texto('I',4);texto('F',5);
}
else {
nivel = 0 ;LimpiarPantalla();texto('F',3);texto('A',4);texto('C',5);texto('I',6);texto('L',7);
}
}
break;
}
break;
case 2: //Estado: Juego
juego();
break;
default:
break;
}
}
}
#int_TIMER1 //Interrupcion timer1
void Timer_Tick(void){
disable_interrupts(INT_TIMER1);
set_timer1 (0xff59);
enable_interrupts(INT_TIMER1);
//---------------------------------------------------------------------------------
// Aca tengo que poner todas las funciones que quiero que funcionen a 1 milisegundos
//---------------------------------------------------------------------------------
barrido_leds();
Barrido_Display();
Board();
TIMERS_Descuento(4);
TIMERS_Descuento(3);
//---------------------------------------------------------------------------------
dec--;
if(dec==0) // Base de tiempo de CENTESIMAS
{
dec = DECIMAS;
//---------------------------------------------------------------------------------
// Aca tengo que poner todas las funciones que quiero que funcionen a 1 centesima
//---------------------------------------------------------------------------------
TIMERS_Descuento(7);
TIMERS_Descuento(1);
//---------------------------------------------------------------------------------
seg--;
if(!seg) // Base de tiempo de SEGUNDOS
{
seg = SEGUNDOS;
//---------------------------------------------------------------------------------
// Aca tengo que poner todas las funciones que quiero que funcionen a 1 segundos
//---------------------------------------------------------------------------------
TIMERS_Descuento(2);
TIMERS_Descuento(5);
TIMERS_Descuento(6);
TIMERS_Descuento(7);
//---------------------------------------------------------------------------------
min--;
if(!min) // Base de tiempo de MINUTOS
{
min = MINUTOS;
//---------------------------------------------------------------------------------
// Aca tengo que poner todas las funciones que quiero que funcionen a 1 centesima
//---------------------------------------------------------------------------------
//---------------------------------------------------------------------------------
hor--;
if(!hor) // Base de tiempo de HORAS
{
hor = HORAS;
//---------------------------------------------------------------------------------
// Aca tengo que poner todas las funciones que quiero que funcionen a 1 centesima
//---------------------------------------------------------------------------------
//---------------------------------------------------------------------------------
}
}
}
}
}
-
las interrupciones se desactivan automáticamente cuando entras a la interrupción, también, no es recomendable llamar a funciones dentro de una interrupcion.
lo que debe hacer es activar una bandera dentro de tu interrupción y en el main mandar a llamar a la función que deseas cuando la bandera este activa
-
Ok, entonces no se puede poner breakpoints en interrupciones ?
-
si deberían de funcionarte las interrupciones dentro de tu interrupción, lo que te comento es para optimizar tu código, pero no deberías tener problema con tus breakpoints.
podrías checar si el mplab si esta compilando con el ccs, o intenta debugguear en proteus