Autor Tema: Apagar un led despuès de varias horas  (Leído 15858 veces)

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

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Apagar un led despuès de varias horas
« en: 05 de Octubre de 2016, 01:12:04 »
 :) prendiendo y apagando un led con un sw me propuse que el led se apague despuès de unas horas ,pero es realmente dificil .No tengo mucha preparaciòn para tal tarea asi que pido que me asistan . Estoy trabajando con un 16F628A ,pic c compiler y icprog . este es el programa. #include<16f628A.h>
//#fuses intrc_io,nomclr,nowdt,noput
#fuses xt,nowdt
#use delay(clock= 4000000)
#use standard_io(b)

//#byte port_b = 0x06
//#byte trisb =0x86
//#byte port_a = 0x05
//#byte trisa =0x85
#define SW1  PIN_A2     //PORTA RA2
#define LED1 PIN_B4     //PORTB RB4

void main(){
set_tris_A(0b11111100); // entrada
set_tris_B(0b00000000);//salida
output_b(0b00000000);

while(1){
    if(input(SW1)==0){
  delay_ms(40);
    if(input(SW1)==1){
     output_toggle(LED1);
     delay_ms(13000);// poner un timer de 6 horas ??
     
     output_low(LED1);
    output_b(0b01000000); delay_ms(1940);
    output_b(0b00000000); delay_ms(240);
     output_b(0b01000000);  delay_ms(240);
    output_b(0b00000000);  delay_ms(240);
     output_b(0b00010000);delay_ms(240);
      output_b(0b01000000);delay_ms(240);
     output_b(0b00010000);delay_ms(240);
      output_b(0b01000000); delay_ms(240);
    output_b(0b00010000);delay_ms(240);
      output_b(0b01000000);delay_ms(240);
     output_b(0b00010000);delay_ms(240);
      output_b(0b01000000); delay_ms(240); 
     output_b(0b00000000);
     
    }
    }
    }
    }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Apagar un led despuès de varias horas
« Respuesta #1 en: 05 de Octubre de 2016, 08:27:22 »
De hacerlo se puede , con un for y repetir muchas veces el delay. Pero eso trae un problema.

Que tu micro va a dejar de responder por esas 4 horas!!!. Es decir no vas a poder sacarlo de su curso normal.

Al Ser un tema de HORAS, te quedan 2 formas, usar un timer que interrumpa cada 0.5s o 1s si es posible y contar la cantidad de segundos que pasaron. Como ves los valores son pequeños, 1s y 0.5s (este mas seguro ). Si quisieramos mas grande, la otra opcion es la de usar un cristal de 32768 Hz sobre el Timer 1, este te va a permitir crear una interrupcion de hasta 16 segundos ( o mejor lo ajustas a 10 segundos).
« Última modificación: 05 de Octubre de 2016, 15:12:43 por KILLERJC »

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #2 en: 05 de Octubre de 2016, 12:01:30 »
 :)Gracias KillerJC ,por tu asistencia ,soy novato y estoy apenas entrando en este mundo enorme .El tema de manejar el timer0 en c para mi es un tema .
Me podrìas mencionar alguna pagina que me enseñe a introducirme en el manejo de los timers .Tengo el manual Compilador c ccs y simulador proteus para microcontroladores pic.
pero es muy tecnico y no me permite comprender.  :-)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Apagar un led despuès de varias horas
« Respuesta #3 en: 05 de Octubre de 2016, 15:12:25 »
La verdad que en eso ya no te puedo ayudar, No uso CCS.
Respecto a lo leido siempre me base desde el datasheet del micro que esta en ingles. Deberias buscar aca en el foro o por internet si es que encontras un articulo explicando como funciona el Timer y como hacerlo en CCS, por mas que no encuentres todo junto es una buena lectura y te va a llevar a comprender como funciona y eso a pasa a saber luego como hacerlo al entenderle correctamente.

La explicacion vaga es...

El timer es un contador, y cuenta pulsos de reloj, externos (como el cristal de 32768Hz) o internos (Oscilador interno o XT,HS). Algunos tienen un contador de 8 bits como el Timer0 y otros de 16 bits como el Timer1. Estos cuando pasan del maximo valor a 0, 0xFF a 0x00 - o de 0xFFFF a 0x0000, es decir se pasan de cuenta, activan el flag del timer, si tenes activadas las interrupciones va a entrar a la interrupcion. El truco esta en:

- Cargar un valor de preescaler , que es simplemente un divisor de frecuencia, suponete que tenes un cristal de 4Mhz y usas este, a la entrada del Timer tendrias 1Mhz (se dividide por 4 dentro del PIC en caso de ser el oscilador principal) o que es lo mismo que cada ves que cuenta 1 tarda 1us ( 1 / 1MHz ), si usas un preescaler de 1:4 , quiere decir que la frecuencia se divide en 4, es decir a la entrada del timer tendrias 250Khz y por lo tanto contaria 1 cada 4us.

- Cargar el valor del Timer, cargando lo que le falta para llegar a 0x00, ya que el contador es ascendente.

Hagamos un ejemplo.
Usas el Timer1 con un oscilador externo de 32768 Hz, lo haces pasar por un preescaler de 1:8, por lo cual entra una frecuencia de 4096Hz o que es igual a 244.14us cada cuenta.
El timer1 es de 16bits, por lo tanto lo maximo que puede contar es de 65536, esas 65 mil cuentas de 244.14us equivale a 16segundos.
Si quisiera 10 segundos (por que es mas facil de contar asi para llegar al minuto) deberia hacer: 10s / 244.14us = 40960
Tiene que contar 40960 pero es ascendente, por lo cual deberia cargar el timer con 65536 - 40960 = 24576

Es decir, usando un oscilador externo de 32768Hz en el Timer1, configurandolo para que use el mismo, configurarlo con preescaler 1:8, y cargando el numero 24576 cada ves que se rebalse ( que pase a 0 ) estarias contando de 10s en 10s cuando se active el flag del timer o entre a la interrupcion.

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re:Apagar un led despuès de varias horas
« Respuesta #4 en: 05 de Octubre de 2016, 17:32:55 »
Buenas, buscando por san google encontré varios resultados entre ellos un video en youtube:

Es para 18F pero te puede servir como guía.

Buena suerte.

Saludos

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re:Apagar un led despuès de varias horas
« Respuesta #5 en: 05 de Octubre de 2016, 19:01:28 »
aqui en el foro hay temas por cantidades industriales sobre como usar retardos mediante el modulo Timer.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re:Apagar un led despuès de varias horas
« Respuesta #6 en: 06 de Octubre de 2016, 09:48:04 »
aqui en el foro hay temas por cantidades industriales sobre como usar retardos mediante el modulo Timer.

Es verdad amigo, no hay que ir tan lejos  :mrgreen:

http://www.todopic.com.ar/foros/index.php?topic=43197.msg357684#msg357684

http://www.todopic.com.ar/foros/index.php?topic=33244.msg333988#msg333988

Saludos amigos 8)

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #7 en: 17 de Octubre de 2016, 18:38:21 »
De hacerlo se puede , con un for y repetir muchas veces el delay. Pero eso trae un problema.

Que tu micro va a dejar de responder por esas 4 horas!!!. Es decir no vas a poder sacarlo de su curso normal.

Al Ser un tema de HORAS, te quedan 2 formas, usar un timer que interrumpa cada 0.5s o 1s si es posible y contar la cantidad de segundos que pasaron. Como ves los valores son pequeños, 1s y 0.5s (este mas seguro ). Si quisieramos mas grande, la otra opcion es la de usar un cristal de 32768 Hz sobre el Timer 1, este te va a permitir crear una interrupcion de hasta 16 segundos ( o mejor lo ajustas a 10 segundos).
:( No ,no hay cristales tan pequeños o de tan baja capacidad

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Apagar un led despuès de varias horas
« Respuesta #8 en: 17 de Octubre de 2016, 18:50:46 »
:( No ,no hay cristales tan pequeños o de tan baja capacidad

De esos.. Son re comunes. Seguro que los viste por muchos lados.
http://tepuyelectronics.com/485-large_default/cristal-32768khz-oscilador-.jpg


Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #9 en: 06 de Noviembre de 2016, 22:36:42 »
Si tenes razòn , yo lei mal . en realidad es de 32,768megas . perdon .

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #10 en: 06 de Noviembre de 2016, 22:40:30 »
Buenas, buscando por san google encontré varios resultados entre ellos un video en youtube:

Es para 18F pero te puede servir como guía.

Buena suerte.

Saludos
Ahora si entendi , pero hay algo que no me sale ,es hacer que el led empiece prendido ,siempre empieza apagado . con las preconfiguraciones de puertos no doy pie con bola.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re:Apagar un led despuès de varias horas
« Respuesta #11 en: 06 de Noviembre de 2016, 23:03:10 »
Hola retovil, te trabaste en lo mas facil. Hay varias formas de hacer que el led empiece encendido. La mas directa es setear el pin donde se encuentre el led como salida y en estado logico 1. Tambien podrias utilizar una variable intermedia e igualmente asignarle el valor 1 o true y el tipo short.

Saludos.

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #12 en: 07 de Noviembre de 2016, 21:15:58 »
AcoranTf ,no es tan asì me parece no he podido preconfigurar los puertos de ninguna manera . Por lo menos las que consco no te olvides que hay un timer1 donde configuras el
puerto ?  :? este es el codigo :

#include<16f628A.h>
#Fuses xt,nowdt,NOPROTECT, PUT, NOLVP,NOMCLR
#use delay(clock=4000000)
#use standard_io(b)

#define TRUE 1
int16 contador=0;
#BIT RB0 = 0x06.1
#int_timer1
void timer0(){
RB0 = 1;
contador++;
if(contador==2000){
output_bit(PIN_B0,1);
  output_b(0b0000011);
 contador=0;
 }
set_timer1(192);
}


void main() {
setup_timer_1(RTCC_INTERNAL| RTCC_DIV_4);
set_timer1(192);
 enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);

while(1){

}
}

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re:Apagar un led despuès de varias horas
« Respuesta #13 en: 07 de Noviembre de 2016, 22:15:02 »
Prueba este codigo y comentas que tal te va.

Código: [Seleccionar]
#include<16f628A.h>
#Fuses xt,nowdt,NOPROTECT, PUT, NOLVP,NOMCLR
#use delay(clock=4000000)
#use fast_io(b)

//#define TRUE 1
int16 contador=0;
//#BIT RB0 = 0x06.1
#int_timer1

void TIMER1_isr(void)
{
contador++;

if(contador==2000)
{
output_bit(PIN_B0,0); //Apaga el led
contador=0;
}

//set_timer1(192);

}


void main()
{
set_tris_b (0); //Puerto B como salidas
output_bit(PIN_B0,1); //Inicia con el led encendido
setup_timer_1(RTCC_INTERNAL| RTCC_DIV_4);
set_timer1(192);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);

while(1)
{

/*
Con estos datos el led estara tanto tiempo encendido, como despues apagado
deberas decidir el tiempo que deseas que este apagado y obrar en consecuencia
reprogramando el TIMER1 para ello y una vez encendido de nuevo, volver a los
parametros iniciales para la nueva temporizacion de encendido.
O detener la interrupcion del TIMER1 y programar otro TIMER para el tiempo de apagado.
Deje comentadas las lineas que considero no necesarias.
Lo hice con prisa, espero no haber metido la pata en nada.
*/

}
}

Saludos.

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #14 en: 07 de Noviembre de 2016, 23:23:13 »
Gracias ArcanTf , dio resultado, muy bueno no entiendo eso de tener que hacer otro timer para que se apague 
 
« Última modificación: 08 de Noviembre de 2016, 00:21:00 por retovil »


 

anything