TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ramirez 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:
#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
-
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!
-
Gracias por las respuestas, creo que ya lo tengo todo mas claro. Gracias de nuevo y saludos
-
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!
-
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.
-
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.