Autor Tema: timer 0 para 1 segundo  (Leído 9902 veces)

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

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
timer 0 para 1 segundo
« 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
   }

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: timer 0 para 1 segundo
« Respuesta #1 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
   }
« Última modificación: 24 de Junio de 2007, 21:06:15 por Cryn »
.

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: timer 0 para 1 segundo
« Respuesta #2 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.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: timer 0 para 1 segundo
« Respuesta #3 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:

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: timer 0 para 1 segundo
« Respuesta #4 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
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: timer 0 para 1 segundo
« Respuesta #5 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

Y lo mismo En Picmania
« Última modificación: 26 de Junio de 2007, 02:36:36 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: timer 0 para 1 segundo
« Respuesta #6 en: 26 de Junio de 2007, 16:45:29 »
ok, chic@s, perfecto como siempres.  :-/