Autor Tema: Varias dudas básicas (ejecución de programa y timer)  (Leído 2731 veces)

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

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Varias dudas básicas (ejecución de programa y timer)
« en: 31 de Agosto de 2010, 13:48:49 »
Hola a todos de nuevo, estoy ejecutanto un ejemplo del libro "Compilador C CCS" de Eduardo García, y tengo varias dudas. El ejemplo lo que hace es generar una señal cuadrada de 1 Hz. El programa es el siguiente:

Código: [Seleccionar]
#include <16f876.h>
#fuses XT, NOWDT
#use delay(clock=4000000)
#use standard_io(b)

int1 cont=0;

#int_TIMER1          //Interrupcion TIMER1
void tempo1(void)    //FUNCION

{

   if (cont==1)
      output_toggle(PIN_B1);  //Cada 2 interrupciones de 0.5 segundos
      set_timer1(3036);       //Recarga del TMR1
      cont++;
     
}

main()
{
   
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); ///Preescales de 8
   set_timer1(3036);                      ///Recarga el timer1
   enable_interrupts(INT_TIMER1);         ///Habilita interrupcion TIMER1
   enable_interrupts(global);             ///Habilita interrupcion general
   
   while(1);

Y las dudas que tengo son las siguientes:

1.- El programa empieza a correr, la variable cont toma el valor cero, y despues ejecuta todas las líneas que existen en el main. ¿cual es la función exacta de while (1)?
2.- Una vez que el Timer a contado desde 3036 a 65536,¿las siguientes líneas que se ejecutan son las que hay en la interrupción? Si es cierto ¿cuando vuelve a tomar el valor cero la variable cont ?
3.-Cuando simulo el circuito con Proteus, éste funciona, pero el periodo es de 2 segundo. ¿Qué ocurre?
4.- Finalmente, cuando intento simularlo paso a paso, siempre se queda en la función while(1). ¿porqué?. No puedo ver de alguna manera cómo se movería la ejecuación del programa por todas las líneas del mismo.

De nuevo, gracias a todos por la colaboración

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Varias dudas básicas (ejecución de programa y timer)
« Respuesta #1 en: 31 de Agosto de 2010, 15:35:24 »
Hola ramirez,
... Y las dudas que tengo son las siguientes:

1.- El programa empieza a correr, la variable cont toma el valor cero, y despues ejecuta todas las líneas que existen en el main. ¿cual es la función exacta de while (1)?
2.- Una vez que el Timer a contado desde 3036 a 65536,¿las siguientes líneas que se ejecutan son las que hay en la interrupción? Si es cierto ¿cuando vuelve a tomar el valor cero la variable cont ?
3.-Cuando simulo el circuito con Proteus, éste funciona, pero el periodo es de 2 segundo. ¿Qué ocurre?
4.- Finalmente, cuando intento simularlo paso a paso, siempre se queda en la función while(1). ¿porqué?. No puedo ver de alguna manera cómo se movería la ejecuación del programa por todas las líneas del mismo.

1.- while(1) es un bucle infinito.  El programa se queda allí y como no contiene ningún código, lo único que el programa hace es atender
     las interrupciones cuando ocurran.
2.- Es correcto.  Una vez se desborda el temporizador salta la interrupción y el programa atiende a las líneas dentro de esta.  Como cont
     es una variable de un bit, la instrucción ++ lo que hace es que pase de 1 a 0 y así sucesivamente.
3.- Proteus no funciona en tiempo real y dependiendo de la velocidad del equipo toma más o menos tiempo en ejecutar las instrucciones.
4.- La razón de esto, es que además del punto anterior, tendrías que darle todos los pasos correspondientes a los ticks del Timer1 hasta lograr
     el desbordamiento y por ende la interrupción.  Si te fijas serían muchos  :shock:  No conozco muy bien el Proteus, pero me imagino que
     tendrá forma de ponerle breakpoints para que avance de un punto del programa a otro sin necesidar de darle paso a paso.

Saludos!

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: Varias dudas básicas (ejecución de programa y timer)
« Respuesta #2 en: 31 de Agosto de 2010, 17:02:10 »
Gracias por las respuestas, creo que ya lo tengo todo mas claro. Gracias de nuevo y saludos

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Varias dudas básicas (ejecución de programa y timer)
« Respuesta #3 en: 31 de Agosto de 2010, 18:34:08 »
4.- La razón de esto, es que además del punto anterior, tendrías que darle todos los pasos correspondientes a los ticks del Timer1 hasta lograr
     el desbordamiento y por ende la interrupción.  Si te fijas serían muchos  :shock:  No conozco muy bien el Proteus, pero me imagino que
     tendrá forma de ponerle breakpoints para que avance de un punto del programa a otro sin necesidar de darle paso a paso.

En Proteus, posicionandote en el código de interrupción, por ejemplo en if (cont==1), haces doble click y fijas un breakpoint. Luego corres el programa con play, y al llegar a este punto se detendrá la ejecución del programa.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado ramirez

  • PIC16
  • ***
  • Mensajes: 195
Re: Varias dudas básicas (ejecución de programa y timer)
« Respuesta #4 en: 01 de Septiembre de 2010, 11:15:16 »
Gracias a los dos por vuestras respuestas, ahora lo tengo todo más claro, pero aún tengo dos cuestiones que son las siguientes:

1.- Para ese valor con el que cargo el timer1, éste se desbordaría cada 0.5  entrando de esta manera en la interrupción, por lo tanto deberíamostener una frecuencia de 1 HZ, pero cuando mido con el osciloscopio virtual obtengo un periodo de 2 segundos ¿qué ocurre?

2.- Ya he utilizado los breakpoints y veo que son bastantes útiles, pero veo que a veces el punto no está relleno, ¿qué significa esto?

De nuevo gracias a todos.

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: Varias dudas básicas (ejecución de programa y timer)
« Respuesta #5 en: 01 de Septiembre de 2010, 11:35:17 »
Ramirez, hagamos un poco de teoria.

Timer1 configurado con el tiempo a 3036, esto quiere decir que la interrupción actúa cada 65536-3036 =  62500 ticks del timer.
Como tenemos puesto el preescaler a 8, el timer hará interrupción a cada 62500 * 8 = 500000 us = 0.5 s.

Aunque la interrupción del timer se haga cada 0.5 s, la instrucción output_toggle(PIN_B1); se ejecuta cada 2 interrupciones, entonces obtienes una forma de onda de 2Hz de frecuencia, es decir, 1 segundo en alto y 1 segundo en bajo.


Un Saludo.
Share the world !

Blog's

http://www.area0x33.com