TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: zira en 06 de Mayo de 2008, 05:31:32
-
hola amigos de todo pic, me estoy iniciando en microcontroladores y la verdad es q han sido una gran ayuda.
En este momento entoy trabajando con la pic 16f873a y tengo una duda con la int tmr0, he buscado en el foro pero no he encontrado nada q me ayude, quiero hacer rotar un bit a traves de leds conectados al puerto c, es decir se debe prender un led cada 1 seg, pero la temporizacion deseo hacerla con la interrupcion del timer0 pero no lo he logrado.
espero alguien pueda ayudarme, esto es lo q he hecho:
#include <16f873a.h>
#use delay(clock=4000000)
#byte puerto_c=0x07
/////// VARIABLES GLOBALES /////////
int cont;
char led_on=0x01;
//////// INTERRUPCION TIMER0 ///////////
#int_timer0
void int_tmr0()
{
for(cont=0; cont<21; cont++)
{
set_timer0(61);
}
disable_interrupts(int_timer0);
}
/////////// PRINCIPAL //////////
void main()
{
set_tris_c(0x00);
do{
enable_interrupts(int_timer0);
setup_counters(rtcc_internal,rtcc_div_256);
set_timer0(61);
enable_interrupts(global);
output_c(led_on);
rotate_left(&led_on,1);
}while(1);
}
saludos
-
Tienes varias cosas mal:
- Este bloque:
enable_interrupts(int_timer0);
setup_counters(rtcc_internal,rtcc_div_256);
set_timer0(61);
enable_interrupts(global);
sácalo del while y déjalo en el main
- Esto:
for(cont=0; cont<21; cont++)
{
set_timer0(61);
}
conforme está, no hace nada. El TMR0 lo recargas a toda leche 21 veces seguidas, pero eso no consigue 1s
Ideas:
- Calcula cada cuantos ms quieres que se dispare la interrupción (por ejempo 25ms). Hay que hacer números.
- Entra en la interrupción x veces hasta conseguir 1s
- Cuando entre por última vez, en la misma interrupción activas un flag (flag=1)
- En el while pones: if (flag==1) ----> rotar
Un saludo
-
Dentro de la interrupcion del timer 0 para 1sg aproximadamente puedes hacer lo siguiente:
char i=0,cuenta=0;
#int_TIMER0
void TIMER0_isr(void)
{
if(cuenta ==250) // 1 sg aprox
{
cuenta = 0;
rotate_left(&led_on,1);
}
cuenta++;
set_timer0(6); // Setea a 5 el timer 0
}
void main()
{
set_timer0(6);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
do{
output_c(led_on);
}while(true);
}
Podrias probar con esto aunque no lo he probado.... :P
-
De verdad muchas gracias por sus respuestas, una vez mas el foro no me falla........
manuelroin24 funciona a la perfeccion..
Saludos
-
¿Sabrías hacer el programa haciendo que rotara en el while?