Autor Tema: timer 0 a un segundo  (Leído 159 veces)

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

Desconectado Saulv_123

  • PIC10
  • *
  • Mensajes: 4
timer 0 a un segundo
« en: 23 de Julio de 2021, 03:40:51 »
Realizar un programa que genere un retardo de 1 segundo utilizando el TIMER 0 con interrupciones.
cristal = 4MHz
ayuda con la modificacion de  este programa para que de 1 segundo de retardo porfavor

#include <xc.h>
#pragma config FOSC = XT


void __interrupt() myISR(void){
    if(TMR0IF == 1){
       
        LATC0 = ~LATC0;
       
        TMR0L = 125;
        TMR0IF = 0;
    }
   
}












void main(void) {
    TRISC = 0x00;
    ANSELC = 0x00;
    T0CON = 0xC2;
    GIE = 1;
    TMR0IE = 1;
    PEIE = 1;
    TMR0L = 125;
    while(1){
   }
   
    return;
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8136
Re:timer 0 a un segundo
« Respuesta #1 en: 23 de Julio de 2021, 07:23:09 »
Hola, esta lleno de tutoriales que enseñan como calcular el tiempo de un timer, así que no voy a explicarlo, solo voy a decirte lo que tenes que hacer.

- Aprende a como calcular el tiempo que tiene tu interrupción cuando le cargas cierto valor al timer. En este caso 125. Busca "Timer PIC tiempo" en google, y tenes videos y tutoriales escritos.
- Sabiendo el tiempo, si es 100ms por ejemplo, podes contar 10 interrupciones, y recién ahí activar una salida. Si el tiempo era de 10ms la interrupción, entonces vas a contar 100 veces. Por eso es importante saber el tiempo que dura tu interrupción. Luego modificar esta parte:

Código: C
  1.     if(TMR0IF == 1){
  2.       if(contador++ > 50)           ; Aca puse 50, que es la cantidad de veces que se debe repetir la interrupcion
  3.       {
  4.         LATC0 = ~LATC0;
  5.         contador = 0;
  6.        }
  7.        TMR0L = 125;
  8.        TMR0IF = 0;
  9.     }

PD: Es absolutamente necesario saber la frecuencia del cristal para hacerlo.
PD2: No es necesario ningún tutorial, tenes todo en el datasheet del micro explicado, pero hay personas que les cuesta el ingles.

Si tenes una duda mas puntual, no tengo problemas en resolverlo

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 521
Re:timer 0 a un segundo
« Respuesta #2 en: 23 de Julio de 2021, 12:09:25 »
En ese programa los cálculos están hechos para 1 interrupción cada milisegundo.

El principio todo lo que tenés que hacer es contar 1000 interrupciones

Código: [Seleccionar]
uint16_t Contador,Contador00=1000 ;

void __interrupt() myISR(void){
    if(TMR0IF == 1){
        TMR0L = 125;
        if(--Contador==0){
            Contador = Contador00 ;
            //.................
            LATC0 = ~LATC0;
            //  mas codigo
            //.................
        }
        TMR0IF = 0;
    }
}

Pero como al tiempo se le suma lo que demora en recargar TMR0L en realidad resulta un poco mas de 1ms.
Si esa pequeña diferencia de tiempo no importa no pasa nada, pero si debe ser mas preciso habría que contar el número de ciclos.  A mí me resulta mas cómodo poner un breakpoint en el Proteus, leer el tiempo transcurrido y corregir la constante de conteo.

Desconectado Saulv_123

  • PIC10
  • *
  • Mensajes: 4
Re:timer 0 a un segundo
« Respuesta #3 en: 23 de Julio de 2021, 21:06:16 »
gracias poe el aporte al final pude realizar el pograma de manera correcta :-/ :-/


 

anything