Autor Tema: Problema timer0 PIC18F452-CCS:simula ok pero en la realidad no respeta tiempos  (Leído 3404 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado e-l-e-n

  • PIC10
  • *
  • Mensajes: 10
Hola, estoy aprendiendo a utilizar los timers del pic 18F452 y he creado un programa en CCS- MPLAB que me compila y simula bien pero que al pasarlo a una placa de pruebas me da problemas.
He querido utilizar el timer 0 de mi PIC que se puede configurar como de 8 o de 16 bits (en mi caso de 16) y para que desborde en 16.777216 segundos le he puesto un reloj internod e $ MHz y un prescaler de 256,
según la fórmula: overflow= bits*prescaler*4*(1/frecuencia de reloj) que he aplicado después de leer posts del foro.
Lo que hace mi programa es que cuando le meto un pulso se inicia un contador, que cuando llega a 15 segundos, hace que el temporizador desborde y entra en la interrupción RTCC dentro de la cual pone los pines del puerto B a 1 (se habían inicializado a 0)
Para que desborde a los 15 segundos y no en 16.777216 he calculado que tengo que cargar el valor 1B1E en el set_rtcc, que se correspondería con empezar la cuenta en 1.777216 y llegar hasta 16.777216
Mi problema es que cuando lo simulo en el MPLAB SIM me da los tiempos perfectos incluso si le voy variando el valor que cargo al set_RTCC, pero sin embargo en la placa real me salta la interrupción más o menos a los 4 segundos independientemente de lo que le cargue.
¿a alguien se le ocurre qué puedo estar haciendo mal?


Código:
#define compiler __PCWH__                   //Compilador CCS


#include "18F452.h"                        //PIC

#byte PORTA=0xF80                        //Defino los puertos que voy a utilizar
#byte PORTB=0xF81

#fuses HS,NOWDT,NOPROTECT,NOLVP               // fusibles deben activarse en el dispositivo cuando se programa. Watchdog desactivado por hardware
#use delay(clock=4000000)                  //reloj de 4 MHz

int aux=0;                              //inicializo la variable auxiliar a 0

#INT_RTCC                               //interrupción del timer0
void timer(){                           // la interrupción se dispara cuando desborda el timer

   output_B(0xFF);                        //todos los pines del puerto b a 1
    disable_interrupts(GLOBAL);                // y deshabilito la interrupción para que no vuelva a iniciar el Timer cuando salga de la interrupción, a no ser que se den las condiciones necesarias
   disable_interrupts(INT_RTCC);
   aux=0;            
}



void main()                              

{
   setup_WDT(WDT_OFF);                     //Desactivo el Watchdog por programa                                   
 
   set_tris_a(0x01);                     //puerto A, bit 0  como entrada digital
   set_tris_b(0x00);                     //puerto B, todos los bits  como salidas


   output_B(0x00);                        //inicializo el puerto B a 0 para indicar que el sensor no está dando error de giro             



   while (1){
   
      if( input(PIN_A0) ){                //si tengo a 1 el pin A0
         if(aux==0){                     // y la variable auxiliar a 0
            SET_RTCC(0x1B1E);            //tiempo en que tiene que empezar el timer para desbordar en  15 segundos
            SETUP_TIMER_0(RTCC_INTERNAL | RTCC_DIV_256 );// configuro el Timer para que desborde en 16.777216 s
             enable_interrupts(GLOBAL);       //habilito itnerrupciones
            enable_interrupts(INT_RTCC);
            aux=1;
         }
      }


   
   }
}

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Problema timer0 PIC18F452-CCS:simula ok pero en la realidad no respeta tiempos
« Respuesta #1 en: 22 de Septiembre de 2011, 11:12:27 »
para un cristal de 4mhz debes poner el fuse XT, el HS es para 8Mhz o mas

Desconectado e-l-e-n

  • PIC10
  • *
  • Mensajes: 10
Re: Problema timer0 PIC18F452-CCS:simula ok pero en la realidad no respeta tiempos
« Respuesta #2 en: 22 de Septiembre de 2011, 11:56:41 »
He descubierto que los tiempos iban mal porque aunque en el programa tengo 4MHz de reloj, el cristal oscilador de mi placa era de 20 MHz, y  estba usando el cristal externo en vez del reloj interno, a pesar de que en mi programa he puesto la instrucción: code:         SETUP_TIMER_0(RTCC_INTERNAL | RTCC_DIV_256 ) tal y como pone en la librería del "18F452.h"   . Probablemente es porque he puesto el Fuse equivocado, voy a cambiarlo por el que me has dicho a ver si me va mejor. Muchísimas gracias por la respuesta!!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema timer0 PIC18F452-CCS:simula ok pero en la realidad no respeta tiempos
« Respuesta #3 en: 22 de Septiembre de 2011, 12:10:35 »
Hola, la instrucción

Código: C
  1. SETUP_TIMER_0(RTCC_INTERNAL | RTCC_DIV_256 )

  sirve para indicar que el timer se va a incrementar tomando los pulsos de clock de sistema, y no utilizando un clock exclusivo para uso del timer.

  Esa instrucción no tiene nada que ver con la configuración del oscilador para el PIC.

  Si la placa que estás usando tiene cristal de 20MHz, podes dejar el fuse HS pero cambiar la línea

Código: C
  1. #use delay(clock=4000000)                  //reloj de 4 MHz

  por

Código: C
  1. #use delay(clock=20000000)                  //reloj de 20 MHz
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado e-l-e-n

  • PIC10
  • *
  • Mensajes: 10
Re: Problema timer0 PIC18F452-CCS:simula ok pero en la realidad no respeta tiempos
« Respuesta #4 en: 22 de Septiembre de 2011, 12:25:43 »
He probado a cambiar el fuse HS por XT que es el que corresponde para relojes de menos de 8MHz y sigue sin reconocerme el oscilador itnerno, sólo el externo.
el tema es que quiero poder usar el reloj interno, no el oscilador externo. Y no puedo, sólo me usa el externo

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema timer0 PIC18F452-CCS:simula ok pero en la realidad no respeta tiempos
« Respuesta #5 en: 22 de Septiembre de 2011, 12:38:39 »
  Estoy mirando el datasheet de los pic 18fxx2, en la página 17 habla de la configuración para el oscilador, pero no existe configuración para oscilador interno.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Problema timer0 PIC18F452-CCS:simula ok pero en la realidad no respeta tiempos
« Respuesta #6 en: 22 de Septiembre de 2011, 14:29:34 »
creo que este pic no tiene oscilador interno, porque no usas el externo?

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: Problema timer0 PIC18F452-CCS:simula ok pero en la realidad no respeta tiempos
« Respuesta #7 en: 22 de Septiembre de 2011, 15:09:34 »
si tiene oscilador interno RC de 4MhZ
#FUSES RC_IO

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: Problema timer0 PIC18F452-CCS:simula ok pero en la realidad no respeta tiempos
« Respuesta #8 en: 22 de Septiembre de 2011, 15:13:10 »
Upsss meti la pata, pues si este pic no tiene oscilador interno

Desconectado e-l-e-n

  • PIC10
  • *
  • Mensajes: 10
Re: Problema timer0 PIC18F452-CCS:simula ok pero en la realidad no respeta tiempos
« Respuesta #9 en: 23 de Septiembre de 2011, 03:24:44 »
Ahh vaya  :( di por hecho que todos tenían oscilador interno. Y como en la libreria .h me venía la instrucciín RTCC_INTERNAL pues  pensé que definitivamente tenía.Lo necesitaba por especificaciones de la placa pero puedo cambiar de pic. Muchas gracias por la ayuda!!