aqui en el foro hay temas por cantidades industriales sobre como usar retardos mediante el modulo Timer.
De hacerlo se puede , con un for y repetir muchas veces el delay. Pero eso trae un problema.:( No ,no hay cristales tan pequeños o de tan baja capacidad
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
Buenas, buscando por san google encontré varios resultados entre ellos un video en youtube: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.
Es para 18F pero te puede servir como guía.
Buena suerte.
Saludos
#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.
*/
}
}Gracias ArcanTf , dio resultado, muy bueno no entiendo eso de tener que hacer otro timer para que se apague
Lo que busco es que el timer corte a las 3horas y despuès incie de vuelta su ciclo .Gracias ArcanTf , dio resultado, muy bueno no entiendo eso de tener que hacer otro timer para que se apague
Estimado, que es lo que realmente deseas hacer, quizas pueda darte una manito
Lo que busco es que el timer corte a las 3horas y despuès incie de vuelta su ciclo .
al principio querìa que un swich o button prendiera el timer con el cual al tiempo se apagara
pero me resulto dificilisimo .Entiendace que hace poco me puse a programar y todavìa no entiendo bien la configuracion de los puertos para que inicie encendido el led bueno desde ya muchas gracias vdiazg.
#include<16f628A.h>
#Fuses xt,nowdt,NOPROTECT, PUT, NOLVP,NOMCLR
#use delay(clock=4000000)
#use fast_io(b)
int16 contador=0;
#int_timer1
int1 start=0; //Bandera de arranque del temporizador
//Coloca aqui la rutina de interrupcion del RB0
void TIMER1_isr(void)
{
if(start) //Si activado temporizador
output_bit(PIN_B7,1); //Inicia con el led encendido
{
contador++;
if(contador==2000) //Si llega al final del tiempo
{
output_bit(PIN_B7,0); //Apaga el led
contador=0;
start=0; //Desactiva el temporizador
}
}
}
void main()
{
set_tris_b (0b00000001); //Puerto B como salidas bits de 1 a 7, el 0 es entrada
setup_timer_1(RTCC_INTERNAL| RTCC_DIV_4);
set_timer1(192);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
while(1)
{
}
}Bueno gracias AcoranTF ,por tu paciencia .
int1 start=0; //Bandera de arranque del temporizador
aca la unica rutina de interrupcion para el swich es con la sentencia if y me da error es la que mas conosco, por decirte la unica . :mrgreen:
//Coloca aqui la rutina de interrupcion del RB0
void TIMER1_isr(void)
Esta muy interesante la propuesta con el otro swich.
yo lo hago simple, con el timer cuento medio segundo y lo repito hasta la cantidad que necesito pero no uso for, anda muy bien ya he vendido muchos de esosSi Claro moe yo tambien realice ese programa el tema esta en ponerle botones de arranque y parada ,me entendes? :o
//Coloca aqui la rutina de interrupcion del RB0
#int_EXT
void EXT_isr(void)
{
If (start)
{
RB7=1;
}
}
Estoy investigando y trabajando ,no me doy por vencido .
He notado varios errores en el codigo que has escrito .Uno es en la configuracion del timer1 . El otro es en la declaracion dela interrupcion ext RB0 dentro del #int_timer1 .
#include<16f628A.h>
#Fuses xt,nowdt,NOPROTECT, PUT, NOLVP,MCLR
#use delay(clock=4000000)
#use fast_io(b)
int1 start=0;
int1 starta=0;
int16 contador=0;
#int_ext
void ext_isr()
{
starta=true; // bandera para el TIMI_isr,pruebo haber si selecciona
start=false; //bandera para el TIMER1_isr ,pruebo haber si no selecciona
delay_ms(5);
}
#int_timer1
void TIMER1_isr(void)
{
if(start)//Si activado temporizador
output_bit(PIN_B7,1);//Inicia con el led encendido
{
contador++;
if(contador==100)
{
output_toggle(PIN_B7);
output_bit(PIN_B5,1);
contador=0;
}
}
}
void TIM1_isr(void)
{
if(starta)//Si activado temporizador
output_bit(PIN_B7,0);//Inicia con el led apagado
{
contador++;
if(contador==300) //tiempo mayor
{
output_toggle(PIN_B7);
output_bit(PIN_B5,0);// se apaga al finalizar el conteo
contador=0;
}
}
}
void main() {
set_tris_b (0b00000001);
set_tris_a (0b00000001);//Puerto a como ent
ext_int_edge(0,L_TO_H);//output_low(int_timer1);//Inicia con el led encendido
setup_timer_1(RTCC_INTERNAL| RTCC_DIV_4);
set_timer1(192);
enable_interrupts(INT_EXT);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
while(1);
}
Bueno hasta aqui ,es como volver a empezar de nuevo .
Bueno entre tantas pruebas parece que uno copia y amontona codigo .
Pero entre las pocas cosas que pude aprender se me ocurren cosas que solo saco de la galera .
haber este codigo que no puedo desifrar no es copiado .Código: [Seleccionar]#include<16f628A.h>Bueno hasta aqui ,es como volver a empezar de nuevo .
#Fuses xt,nowdt,NOPROTECT, PUT, NOLVP,MCLR
#use delay(clock=4000000)
#use fast_io(b)
int1 start=0;
int1 starta=0;
int16 contador=0;
#int_ext
void ext_isr()
{
starta=true; // bandera para el TIMI_isr,pruebo haber si selecciona
start=false; //bandera para el TIMER1_isr ,pruebo haber si no selecciona
delay_ms(5);
}
#int_timer1
void TIMER1_isr(void)
{
if(start)//Si activado temporizador
output_bit(PIN_B7,1);//Inicia con el led encendido
{
contador++;
if(contador==100)
{
output_toggle(PIN_B7);
output_bit(PIN_B5,1);
contador=0;
}
}
}
void TIM1_isr(void)
{
if(starta)//Si activado temporizador
output_bit(PIN_B7,0);//Inicia con el led apagado
{
contador++;
if(contador==300) //tiempo mayor
{
output_toggle(PIN_B7);
output_bit(PIN_B5,0);// se apaga al finalizar el conteo
contador=0;
}
}
}
void main() {
set_tris_b (0b00000001);
set_tris_a (0b00000001);//Puerto a como ent
ext_int_edge(0,L_TO_H);//output_low(int_timer1);//Inicia con el led encendido
setup_timer_1(RTCC_INTERNAL| RTCC_DIV_4);
set_timer1(192);
enable_interrupts(INT_EXT);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
while(1);
}
#int_ext
void ext_isr() {
starta=true;
start=false;
Hola AconranTF, bueno sigo esperando ,espero que el codigo que puse no sea demasiado descabellado o irrealizable .Feliz año ,que esta pequeña relaciòn de alumno maestro,con todo el respeto, dure por muchos años màs . :)
No AconranTF,ni con la configuracion emisor comun funciona. vos sabes que le conecto directo una fuente de 12 y no acciona .en el simulador proteus sera el proteus ?
inclusive los transistores funcionan mal funcionan como si estuvieran en corto o con fugas
No se si funcionara, deberias probarlo.Código: CFunciona muy bien ! :)
#include <16f628A.h> #Fuses xt,nowdt,NOPROTECT, PUT, NOLVP,NOMCLR #use delay(clock=4000000) #use fast_io(b) volatile int1 activo; volatile int16 contador=0; int8 indice; int16 tiempo[4] = {1000,2000,3000,4000}; volatile int16 limite; #int_timer1 void TIMER1_isr(void) { set_timer1(192); if(activo) { contador++; } if(contador>=limite) { output_bit(PIN_B7,0); // Apago Rele contador=0; activo= false; } } void main() { int8 i; // Inicializacion de variables indice = 0; limite = tiempo[0]; activo = true; // Configuracion de los modulos set_tris_b(0x0F); // RB0 a RB3 entradas, RB4 a RB7 salidas output_bit(PIN_B7,1); //Inicia con el rele encendido setup_timer_1(RTCC_INTERNAL| RTCC_DIV_4); set_timer1(192); enable_interrupts(INT_TIMER1); enable_interrupts(GLOBAL); while(1) { /* * Boton de reset */ if(input(PIN_B0)) // Boton de reset { contador = 0; // Reinicio el tiempo output_bit(PIN_B7,1); // Activo rele activo = true; } /* * Boton de tiempo */ if(input(PIN_B1)) // Boton seleccion de tiempo { while(input(PIN_B1)); indice++; limite = tiempo[indice]; if(indice>=sizeof(tiempo)) { indice = 0; } for(i=0;i<=indice;i++) { output_bit(PIN_B6,0); delay_ms(200); output_bit(PIN_B6,1); delay_ms(200); } } /* * Led indicador */ output_bit(PIN_B6,activo); } }
Cuando tengas tiempo me lo podes explicar
if(input(PIN_B1)) // Boton seleccion de tiempo
{
while(input(PIN_B1));
indice++;
limite = tiempo[indice];
if(indice>=sizeof(tiempo))
{
indice = 0;
}
for(i=0;i<=indice;i++)
{
output_bit(PIN_B6,0);
delay_ms(200);
output_bit(PIN_B6,1);
delay_ms(200);
}
hola KillerJC ,me aucente un poco . Debo agradecerte por la explicaciòn circuito parpadeo y de todo el programa ,debo decirte que el reset no funciono pero si lo hiciste aproposito ya lo solucione .
Para que se le pone a las variables la expresion volatile
?