TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: nickpic2013 en 14 de Mayo de 2013, 20:42:09

Título: Timer 1 no entra en rutina de interrupcion (CCS en MPLAB 8.90 con 16F877A)
Publicado por: nickpic2013 en 14 de Mayo de 2013, 20:42:09

Buenas estimados, desde ya muchas gracias por la ayuda que puedan aportar. Estoy perdido con este tema y no le encuentro la vuelta. Realice un programa en el cual confguro el timer1 como interno, habilito las interrupciones debidas (TMR1IE y Global) y se activa el flag TMR1IF al desbordar pero nunca salta/entra a la rutina de interrupcion del timer1. Algo curioos que noto que ni bien configurado y hechado a funcionar el timer 1 a las dos instrucciones siguientes se desborda el Timer y se activa el flag - configuro el timer1 en 1, me da la sensacion de que para llegar a 65535 lo hace demasiado rapido (2 instruccones de "C"), no me parece  normal. Otro dato el desbordamiento se me genra dentro de un switch, igual probe de sacarlo de ahi al principio del programa para que no tenga problemas y se comportta igual. Bueno, espero puedan ayudarme. Muchas gracias.
Título: Re: Timer 1 no entra en rutina de interrupcion (CCS en MPLAB 8.90 con 16F877A)
Publicado por: BrunoF en 14 de Mayo de 2013, 20:49:21
Hola!

vas a tener que mostrarnos el código para que podamos ayudarte!
Título: Re: Timer 1 no entra en rutina de interrupcion (CCS en MPLAB 8.90 con 16F877A)
Publicado por: nickpic2013 en 16 de Mayo de 2013, 09:04:40
Hola!

vas a tener que mostrarnos el código para que podamos ayudarte!


Gracias estimado por la atencion. Agrego que hice una prueba con el timer 0 y se comporta igual, parece ser un problema general con las interrupciones. A alguien le paso esto antes??
Título: Re: Timer 1 no entra en rutina de interrupcion (CCS en MPLAB 8.90 con 16F877A)
Publicado por: KALLITOS en 16 de Mayo de 2013, 09:43:44
Hola!

vas a tener que mostrarnos el código para que podamos ayudarte!
Título: Re: Timer 1 no entra en rutina de interrupcion (CCS en MPLAB 8.90 con 16F877A)
Publicado por: nickpic2013 en 18 de Mayo de 2013, 10:50:38
Hola!

vas a tener que mostrarnos el código para que podamos ayudarte!


Estimado, gracias por tu atencion. Abajo va el codigo. Te comento las pruebas realizadas, con un PIC16F877A programador ICD2 en MPLAB con lengiuaje CCS no me funcionaba en un programa bastante avanzado las interrupciones llegue a probar con al del timer 1 y 0. No entreba en las interrupciones, luego para descartar pruebo en un chip 18F874 y lo mismo. Para descartar que el problema no viene del programa hago una sencilla rutina de timer 1 (la pego abajo) con PIC18F877A y me sucede lo mismo. Ultima prueba, ejecuto la sencilla rutina de timer 1 en el 874 y lo mismo. Ya le desconfio al MPLAB con plugin CCS o al ICD2.
Algo que note: ni bien ejecuto la primera instruccion ya levanta el flag de interrupcion de timer 1 (en una de las veces se metio en la rutina de interrupcion, despues nunca mas) a lo que pongo el flag a 0, cuando desborda el timer1 se levanta el flag pero no salta a la rutina de intrrupcion. Probe con prescaler DIV 8 o DIV 1, no funciona igual.
Bueno eso es todo, va el codigo:


#include "16F874.h" //Incluye el archivo de cabecera para el PIC

#DEVICE  ICD=TRUE
//#DEVICE ADC=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT//INTRC_IO            //oscilador interno a 4Mhz
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
//#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#use delay(clock=4000000)  //clock de 4Mhz


int a = 0;
int b = 0;


#INT_TIMER1      //Interrupcion del timer 1
void atiende_timer1(void)
 {
   a = a + 1;
      
 }
 
 
 void main ()
{
   setup_timer_1 ( T1_DISABLED );
   set_timer1(0x0BDC);//Carga del TMR1
   enable_interrupts(GLOBAL);//Habilito interrupciones globale
   enable_interrupts(INT_TIMER1);//Habilito interrupción particular del TIMER1
   setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_1 );

   do//Bucle infinito hasta interrupción
   {
      b = b + 1;
      b = b + 1;
      
   }while(b < 200);
 
}
Título: Re: Timer 1 no entra en rutina de interrupcion (CCS en MPLAB 8.90 con 16F877A)
Publicado por: BrunoF en 18 de Mayo de 2013, 12:48:22
Tu bucle no es infinito y eso trae problemas. Y si estas usando !MCLR asegurate de tenerlo mediante una resistencia a Vdd a dicho pin. Caso contrario se reiniciará constantemente.
Título: Re: Timer 1 no entra en rutina de interrupcion (CCS en MPLAB 8.90 con 16F877A)
Publicado por: nickpic2013 en 18 de Mayo de 2013, 16:10:22
Tu bucle no es infinito y eso trae problemas. Y si estas usando !MCLR asegurate de tenerlo mediante una resistencia a Vdd a dicho pin. Caso contrario se reiniciará constantemente.

Estimado:

El bucle que indicas como no infinito, imagino que es el do...while lo coloque como prueba, inicialmente era un while(true) -bucle infinito- y tenia el mismo problema. Con respecto a la resistencia no esta colocada hasta el momento pero no seria problema ya que lo estoy usando con ICSD y la linea de MCLR la uso para el VPP del ICD2. El programa en modo debugger corre perfectamente pero no salta a las interrupciones, ese es el problema.
Título: Re: Timer 1 no entra en rutina de interrupcion (CCS en MPLAB 8.90 con 16F877A)
Publicado por: nickpic2013 en 19 de Mayo de 2013, 20:31:25
Estimados:

Despues de mucha investigacion llegue a buen puerto y pude encontrar rspuesta al problema, que en definitiva no es problema, es funcionamiento normal del ICD2 e ICD3. Buscando en la web de microchip encontre un documento del ICD2 que indica:

When running in debug mode, selecting Debugger>Reset resets the program, goes to the zero location, and halts. The program does not automatically re-run.

The following applies to all devices except for Extended PIC18F Devices V2:

·               - While single stepping, the MPLAB ICD 2 will not respond to interrupts.

O sea que cuando uno ejecuta el debugueo en modo paso a paso como lo ejecuto yo no salta a las rutinas de interrupcion. Lo probe en modo "play" y por razones obvias de la velocidad de ejecucion no veia si entraba o no en la rutina de interrupcion, como estaba trabajando con un PIC16F877 tampoco puedo colocarle un breakpoint en la interrupcion pero hecha la ley hecha la trampa, le ordene un "run tu cursor" hasta dentro de la rutina de interrucpion y finalmente veo que entra y la ejecuta. Bueno, eso es todo. Subo la info para que si alguien le pasa no reniegue tanto como yo que hace un mes estoy parado con este tema. Saludos a todos y gracias por la ayuda. Voy a ver si puedo subir esto con un titulo que represente mas el tema para el que lo necesite lo encuentre rapido.