Autor Tema: Ayuda con timer mplab xc8  (Leído 123 veces)

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

Desconectado Electro_pic

  • PIC10
  • *
  • Mensajes: 2
Ayuda con timer mplab xc8
« en: 15 de Enero de 2020, 00:20:29 »
Buenas, les hago una consulta tengo un programa que estoy haciendo es que cuaando tenga un 1 en el pin RB0 tengo que prender un led durante 1 minuto y dejarlo apagado por 5 minutos mientras tenga el un 1 en el pint RB0, aclaro que en esto soy muy nuevo, al usar delay al sacar la señal de RB0 no apaga como quiero el Led hasta que no termine el ciclo de los delay, me podria dar un ejemplo con timer adaptado a lo que tengo desde ya gracias y me ayudaria mucho entender los timer.

PIC 16f628a

Código: [Seleccionar]
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON       // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>

/*Velocidad del oscilador en este caso esta configurado para utilizar el osc interno del micro*/
#define _XTAL_FREQ 4000000

#define Entrada_12V PORTBbits.RB0
#define Entrada_12V_tris TRISBbits.TRISB0

#define Salida_rele PORTBbits.RB1
#define Salida_rele_tris TRISBbits.TRISB1

#define Salida_led PORTBbits.RB2
#define Salida_led_tris TRISBbits.TRISB2

#define estado PORTBbits.RB3
#define estado_tris TRISBbits.TRISB3

int i = 0;

void main(void)
{
Entrada_12V_tris = 1;
Salida_rele_tris = 0;
Salida_led_tris = 0;
Entrada_12V = 0;
Salida_rele = 0;
Salida_led = 0;
estado = 0;
estado_tris = 1;
 

    do
    {
        if(Entrada_12V == 1)
         {
           for(i=0; i<60; i++)
          {
          Salida_rele = 1;
          Salida_led = 1;
          __delay_ms(1000);
          }
          for(i=0; i<300; i++)
          {
          Salida_rele = 0;
          Salida_led = 1;
         __delay_ms(1000);
          }
        }
    }while(1);               
}
« Última modificación: 18 de Enero de 2020, 09:22:05 por Electro_pic »

Desconectado AccioRw

  • PIC16
  • ***
  • Mensajes: 145
Re:Ayuda con timer mplab xc8
« Respuesta #1 en: 16 de Enero de 2020, 08:45:23 »
Hola Electro_pic si quieres hacerlo funcionar con Delays prueba así, de todos modos el ejemplo que has puesto tu tambien debería funcionar
estos defines deberias usar el registro LAT para salidas si tu PIC lo tiene:

#define Salida_led  LATBbits.RB2
#define Salida_rele LATBbits.RB1

Código: [Seleccionar]
       
if(Entrada_12V == 1)
         {
          Salida_rele = 1;
          Salida_led = 1;
          // Aqui esperaras 1 minuto con rele y led encendido
           for(i=0; i<60; i++)
          {
          __delay_ms(1000);
          }
          Salida_rele = 0;
          Salida_led = 1;
          // Aqui esperarás los 5 minutos ocn la luz encendida y el relé apagado
          for(i=0; i<300; i++)
          {
         __delay_ms(1000);
          }
        }

Para ponerte un ejemplo con los timers, que version de XC8 estas usando y que modelo de Pic.

Un saludo!

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7486
Re:Ayuda con timer mplab xc8
« Respuesta #2 en: 16 de Enero de 2020, 11:12:56 »
Sigue siendo el mismo problema.... Deja de responder.. Si quisiera algo un poco mas acorde entonces:


Código: C
  1. while(1) {
  2.   if(Entrada_12V == 1)
  3.   {
  4.     if(contador = 0){
  5.       Salida_rele = 1;
  6.       Salida_led = 1;  
  7.     }
  8.     if(contador = 250) {
  9.       Salida_rele = 0;
  10.       Salida_led = 1;
  11.     }
  12.     if(contador = 1200)
  13.     {
  14.       contador = 0;
  15.     }
  16.     delay_ms(250);
  17.   } else {
  18.     contador = 0
  19.     Salida_rele = 0;
  20.     Salida_led = 0;  
  21.   }  
  22. }

Por supeusto, como todo delays depende de los ciclos anteriores, por lo tanto vas a fallar en obtener 5 minutos exactos. Podes probar poniendo 249 en ves de 250.
contador es una variable de 16 bits sin signo.
Se puede hacer mas pequeño el delay aumentando el error entre pasos, ya que usarias numeros mas grandes todavia. Pero un cuarto de segundo deberia ser suficiente.

lo correcto seria un Timer + interrupcion + CCP

Desconectado Sebas1010

  • PIC10
  • *
  • Mensajes: 7
Re:Ayuda con timer mplab xc8
« Respuesta #3 en: 16 de Enero de 2020, 12:27:42 »
Holas, podrias probar con el timer como te mencionaron, asi no utilizas los delay, el timer por ejemplo que desborde cada 500mS y los valores de los dos for son apoximados tendrias que ver bien lo valores para que sean lo mas exactos posibles.
Espero que te sirva.


Código: [Seleccionar]
void Timer1_delay(void);
if(Entrada_12V == 1)
         {
          Salida_rele = 1;
          Salida_led = 1;
          // Aqui esperaras 1 minuto con rele y led encendido
           for(i=0; i<120; i++)
          {
            Timer1_delay();
         // __delay_ms(1000);
          }
          Salida_rele = 0;
          Salida_led = 1;
          // Aqui esperarás los 5 minutos ocn la luz encendida y el relé apagado
          for(i=0; i<600; i++)
          {
           Timer1_delay();
        // __delay_ms(1000);
          }
        }
void Timer1_delay(void)//Timer cada 500mS con osc de 4MHz
{
    T1CONbits.T1CKPS0 = 1;
    T1CONbits.T1CKPS1 = 1;
    T1CONbits.T1OSCEN = 0;
    T1CONbits.nT1SYNC = 0;
    T1CONbits.TMR1CS = 0;
    T1CONbits.TMR1ON = 1;
    TMR1 = 3036;       
    T1CONbits.TMR1ON = 1;
    while(PIR1bits.TMR1IF == 0);     
    TMR1ON=0;         
    TMR1IF=0;                         
}


Desconectado Electro_pic

  • PIC10
  • *
  • Mensajes: 2
Re:Ayuda con timer mplab xc8
« Respuesta #4 en: 18 de Enero de 2020, 09:14:32 »
Desde ya muchas gracias, implemente el timer funciono correntamente.