TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Protheus5 en 16 de Diciembre de 2004, 13:30:00

Título: [b]Problema con interrupcion RTCC[/b]
Publicado por: Protheus5 en 16 de Diciembre de 2004, 13:30:00
Hola que tal.

Os escribo para ver si alguien me puede hechar una mano con el siguiente código, que al parecer no funciona.

Estoy tratando de hacer parpadear un led conectado al pin B7 del PIC 18f452 cada 500 ms, mediante un numero determinado de descargas del Timer 0, o RTCC.

Lo que no consigo averiguar es por qué el programa no va bien; a continuacion os paso el código:


#include <18F452.H>
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,WRT
#use delay( clock = 8000000 )
#use fast_io(B)

#define pulsos 6
long contador=0;

#int_rtcc void interrupcion(void)
{

set_rtcc(pulsos);
contador++;  
}


void main( void)
{
set_tris_b(0x00); // puerto B como salida

setup_counters(RTCC_INTERNAL,RTCC_DIV_32);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
set_rtcc(pulsos);


while(1)
{
if(contador==125)    //  0.5s/4ms=125 veces se ha de descargar T0
{
contador=0;
output_bit(PIN_B7,!input(PIN_B7));
}
 
}

}


Si podéis hecharme una mano os lo agradecería.Sonrisa

Un saludo
Título: RE: [b]Problema con interrupcion RTCC[/b]
Publicado por: Nocturno en 17 de Diciembre de 2004, 00:02:00
Cuando dices que no funciona, ¿te refieres a Proteus o a una prueba real?.
Tengo entendido que Proteus no se lleva muy bien con los timers. Yo he intentado simular tu programa y no consigo que funcione, pero no veo nada raro en él.

Bueno, sólo una cosa, para poder compilarlo tuve que cambiar de línea el nombre de la función "interrupcion" y ponerlo en la línea siguiente.
Dejándolo como está, es decir, justo detrás de la declaración #int_rtcc, me daba error al compilar.
Título: RE: [b]Problema con interrupcion RTCC[/b]
Publicado por: Protheus5 en 17 de Diciembre de 2004, 06:47:00
Ola nocturno.

Me refería a que no funciona en una prueba real, ya que he construido una placa para probar PIC"s.

Si, la función interrupción va debajo, lo que pasa es que al copiarla a la web se me puso en la misma línea.

La verdad, lo he simulado en el MPLAB SIM, abriendo unas watch al valor del contador y del timer, y ocurre algo bastante curioso: al principio, el timer 0 se precarga, y todo va bien; pero una vez que se desborda, empieza su valor desde cero, y no se precarga!!
Además el valor de la variable contador(que es el que indica el nº de veces que se tiene que desbordar timer 0) ni siquiera se actualiza, se queda clavado en cero.

Estos es un expediente X.

Por cierto, no he probado Proteus. Tiene mayor potencia que el SIM??

Gracias por la ayuda!
Título: RE: [b]Problema con interrupcion RTCC[/b]
Publicado por: Nocturno en 17 de Diciembre de 2004, 06:56:00
Jaja, es curioso que no lo hayas probado en Proteus, con el nick que tienes.

Bueno, la ventaja de Proteus es que es un simulador totalmente gráfico y no sólo del programa que cargues en el PIC, sino de todo el circuito que estés diseñando.
Aunque a veces hace cosas raritas, la verdad es que es muy potente y fácil de manejar.

Y con respecto al problema que tienes, la verdad es que no sé porqué te está pasando eso. A ver si aparece por aquí algún gurú que seguro te dice cuál es el error.
Título: RE: [b]Problema con interrupcion RTCC[/b]
Publicado por: gfp en 17 de Diciembre de 2004, 18:22:00
Por que no intentas de esta forma, no es el mejor código pero la idea es que entiendas lo que se hizo para llegar al tiempo requerido (500 ms) . Para simular el tiempo te recomiendo la herramienta "Stopwatch" ubicada en el menú Debugger del MPLAB.

#include <18F452.h>
#fuses NOWDT,WDT128,HS, NOPROTECT, NOOSCSEN, NOBROWNOUT, BORV20, PUT, NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB, NOEBTR, NOEBTRB
#use delay( clock = 8000000 )
#use fast_io(B)

long contador=0;

#int_rtcc
void rtcc_isr()
{
   set_rtcc(0);
   contador++;
}
void main( void)
{
   set_tris_b(0x00); // puerto B como salida
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   set_rtcc(0);

   while(1)
   {
      if(contador==7)
      {
         contador=0;
         delay_ms(41);
         output_bit(PIN_B7,!input(PIN_B7));
         set_rtcc(0);
      }

   }

}

Me cuentas si entendiste todo.


gfp Sonrisa
Título: RE: [b]Problema con interrupcion RTCC[/b]
Publicado por: Protheus5 en 20 de Diciembre de 2004, 06:09:00
gfp, tu ejemplo me ha servido para descubrir donde residia mi error.

Siguiendo el manual del micro, éste especificaba que tras un reset, el valor del registro que controla al timer 0, el T0CON, se inicializaba todo a unos.

Si estaba todo a unos, significa que el bit T08BIT0=>1, lo cual configuraba al Timer 0 en modo de 8 bits.

Pero despues de probar tu ejemplo, por curiosidad miré en una watch el valor del bit, y estaba a Cero!! con lo cual se deduce que por defecto, si no le dices nada al codigo C, este timer 0 esta en modo de 16 bits, y no de 8 bits como supuse yo a la hora de hacer los càlculos!!!!.

Gracias por la ayuda!!!!!

Un saludo