TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: black_flowers en 23 de Junio de 2007, 20:40:08

Título: timer 0 para 1 segundo
Publicado por: black_flowers en 23 de Junio de 2007, 20:40:08
hola, ¿funcionaría esto bien? lo que debería hacer es poner el ra0 a 1 cuando salte la interrupcion del timer0. Más o menos debería ser un segundo. Los valores tanto para el contador, el timer0 y el prescaler pongo los mismos que uso en un programa en asm, y que hace temporizaciones de 1 segundo bastante buenas. Contador=250, Prescaler=16,Timer0=6

Tengo varias dudas en el programa como por ejemplo:

¿en qué momento empieza a contar el timer0? ¿cuando se ejecuta set_timer0(6); puede ser?
y otra, una vez que salta la interrupcion... si quiero recargar qué instrucciones debería añadir?

es que vengo del asm y no tengo muy claro lo del ccs, parece que faltan cosas je je.

un saludo.

el código es este:

#include <16f84a.h>     
#fuses XT,NOWDT,NOPROTECT,PUT     
#use delay (clock=4000000)       
#use fast_io(a)

int    Contador = 250;

void main()
{set_tris_a(0xFE);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
output_low(PIN_A0);
setup_counters(RTCC_INTERNAL,RTCC_DIV_16);
set_timer0(6);
   do {
      } while (TRUE);
}

#INT_TIMER0
void interruption()
   {Contador ++;
    if (Contador == 0){
        output_high(PIN_A0);
       }
//set_timer0(6);
//RESET TIMER 0
   }
Título: Re: timer 0 para 1 segundo
Publicado por: Cryn en 24 de Junio de 2007, 20:54:33
Contador=250, Prescaler=16,Timer0=6    <----- ok

El timer0, y podria afirmar que todos los timers, se incrementan siempre con cada instrucción, tu decides donde empieza la cuenta, con set_timer(xxx); haces que comience la cuenta desde ese valor mas precisamente, puede ser, como dices, jeje

recarga mejor al entrar en la interrupcion, para que las instrucciones de la interrupcion tb sean contadas con el tmr0 (de esta manera llega a ser un poco más exacto el segundo temporizado), porque ya el contador se encarga de contar las interrupciones.

#INT_TIMER0
void interruption()
   {----------------set_timer0(6);
     Contador ++; <---  deberia ser Contador--;
     if (Contador == 0){
        output_high(PIN_A0);             <------ mejor colocale output_toggle(PIN_A0); //ya qeu el qeu pones coloca en alto todo el tiempo
                       <------ Contador=250;   //si el contador ya llego a 0 debes reestablecer
       }
//set_timer0(6);    <---- quitale el comentario; pero mejor al principio de la interrupcion
//RESET TIMER 0
   }
Título: Re: timer 0 para 1 segundo
Publicado por: jfh900 en 24 de Junio de 2007, 21:12:18
Ademas de lo indicado por Cryn yo realizaría las siguientes modificaciones:


Código: C
  1. #include <16f84a.h>    
  2. #fuses XT,NOWDT,NOPROTECT,PUT    
  3. #use delay (clock=4000000)      
  4. #use fast_io(a)
  5.  
  6. int    Contador = 250;
  7.  
  8. void main()
  9. {set_tris_a(0xFE);
  10. output_low(PIN_A0);
  11. setup_counters(RTCC_INTERNAL,RTCC_DIV_16);
  12. set_timer0(6);
  13. enable_interrupts(GLOBAL);
  14. enable_interrupts(INT_TIMER0);
  15.  do {} while (TRUE);
  16. }
  17.  
  18. #INT_TIMER0
  19. void interruption()
  20.    {
  21.     set_timer0(6);
  22.     Contador--;
  23.     if (Contador == 0)
  24.       {
  25.        output_togle(PIN_A0);
  26.        Contador = 250;
  27.        }
  28.    }

Un saludo.
Título: Re: timer 0 para 1 segundo
Publicado por: black_flowers en 25 de Junio de 2007, 19:26:28
ok, pero la instruccion output_togle(PIN_A0) es nueva para mí, qué diferencia hay con output_high(PIN_A0) ?

UN SALUDO.  :mrgreen:
Título: Re: timer 0 para 1 segundo
Publicado por: jfh900 en 25 de Junio de 2007, 19:32:43
La instrucción output_togle lo que hace es invertir el estado del pin correspondiente, si esta a "1" lo pone a "0" y viceversa, si está a "0" lo pone a "1", como puedes ver es la instrucción ideal para hacer parpadear un led  :-).

Un saludo
Título: Re: timer 0 para 1 segundo
Publicado por: RedPic en 26 de Junio de 2007, 02:33:19
Exacto jfh900.

Entonces black_flowers lo que haces es ajustar mediante la interrupción del timer es el semi-periodo de la onda cuadrada correspondiente.

Cada dos interrupciones consecutivas tienes un periodo completo de un pulso.

Y con 1 / (2 * time_int) tienes la frecuencia de dicho tren de pulsos.
 
Serie Técnicas en C : Presentación e Indice de Contenidos (http://www.todopic.com.ar/foros/index.php?topic=14427.0)

Y lo mismo En Picmania (http://picmania.garcia-cuervo.net/Tecnicas_en_C_0_Indice.htm)
Título: Re: timer 0 para 1 segundo
Publicado por: black_flowers en 26 de Junio de 2007, 16:45:29
ok, chic@s, perfecto como siempres.  :-/