Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

Hace 2 Semanas #1


Temporizar un LED sin instrucción "delay_ms()"
Hola amigos del foro.
Quisiera temporizar un led o lámpara y manejarlo con un switch o botón, como un temporizador común pero sin delay_ms()
¿Podrían enseñarme cuál es el código?

Tengo poco tiempo estudiando C y es lo que mas estoy empapado.
Mi compilador es PIC C Compiler.

Código PHP:
#include <16f628A.h>
Fuses Xt,NOWDT 
use delay(clock=4M)

int tiempo;
int8 start 0;
#int_TIMER1
void TIMER1_isr(){
   
tiempo tiempo ++;
   
set_timer1(0);
   if (
tiempo ){ //  para 2.5 segundos encedido led aproximadamente
      
output_low(PIN_B7);
      
disable_interrupts(INT_TIMER1); //paramos timer1
      
start false;
   }
}
void main()
 {
      
set_tris_b (0b00000001);   //Puerto B como salidas bits de 1 a 7, el 0 es entrada
      
ext_int_edge(L_TO_H);   // activacion flanco de subida ,aunque por default es por flanco de subida .
      
setup_timer_1(RTCC_INTERNALRTCC_DIV_4);
      
set_timer1(192);
      
enable_interrupts(INT_TIMER1);
      
enable_interrupts(GLOBAL);

  while(
1)
  {

         }
   } 
Hace 2 Semanas #2

Avatar de Gudino Roberto duberlin

Hola, hay varias maneras para lograr tu cometido.
Una de ellas es utilizar la interrupción de un timer interno. Cuando se desborda, gestiona el evento que deseas.
Otro forma es incrementar un número, un determinado número de veces cómo por ejem.: contar++;
Luego cuando la variable "contar" alcanza un valor dado, realiza de igual manera el evento deseado.
Hace 2 Semanas #3
Moderador

Avatar de D@rkbytes

Gudino Roberto duberlin dijo: Ver Mensaje
Hola, hay varias maneras para lograr tu cometido.
Una de ellas es utilizar la interrupción de un timer interno. Cuando se desborda, gestiona el evento que deseas.
Otro forma es incrementar un número, un determinado número de veces cómo por ejemplo: contar++;
Luego cuando la variable "contar" alcanza un valor dado, realiza de igual manera el evento deseado.
Así es cómo lo está haciendo.
pastor007 dijo: Ver Mensaje
Hola amigos del foro.
Quisiera temporizar un led o lámpara y manejarlo con un switch o botón, como un temporizador común pero sin delay_ms()
Así cómo lo estás haciendo con un timer y un conteo, está bien.
El problema que tiene tu programa es de configuración.
Estás usando el Timer 1 con constantes para el Timer 0, aparte de no ser correcto su valor.

Si requieres que el Timer 1 desborde cada 500 mS @ 4 MHz, su valor de carga debe ser de 3036 o 0xBDC en hexadecimal y el prescaler con un divisor entre 8.
pastor007 dijo: Ver Mensaje
¿Podrían enseñarme cuál es el código?
Algo así:
Código PHP:
#include <16f628A.h>
#use     delay(crystal = 4MHz)

int8 tiempo 0;

#INT_TIMER1
void sdi_desborde_timer1 (void)
{
   
tiempo ++;                                   // Incrementar la variable "tiempo"
   
   
if (tiempo )                             //  0.5 x 5 = 2.5 Segundos.
   
{
      
tiempo 0;                               // Retornar la variable "tiempo" a 0
      
output_toggle(PIN_B7);                    // Cambiar de estado el pin RB7
   
}
   
   
set_timer1(3036);                            // Recargar el Timer 1
}

void main (void)
{
      
setup_timer_1(T1_INTERNAL T1_DIV_BY_8); // Reloj interno para el Timer 1 y prescaler entre 8
      
set_timer1(3036);                         // Cargar el Timer 1 para que desborde cada 500 mS. @ 4 MHz.
      
enable_interrupts(INT_TIMER1);
      
enable_interrupts(GLOBAL);
      
      
output_high(PIN_B7);                      // RB7 en 1 al iniciar.

  
while (true);
  

Hace 1 Semana #4


OK! Gracias , ya entiendi .Ahora veo que puedo configurar los tiempos de prendido y apagado
inclusive jugar y poner otros leds o lamparas. Pero ,como pudedo poner un tiempo prefijado con unos botones ejemplo sw1 timpo 10s , sw2 30s y asi cosa de manejarlo desde afuera?.Si hay algo que no puedo hacer es hacer que el programa salga de ahi de es bucle . Tambien pense en un boton de parada no se como manejar las banderas o flags pero no sale de ahi.
Baje el manual de proteus y c compiler pero no entiendo mucho .La verdad es que estos circuitos me parecen fascinantes . Realice el grabador ,compre mi primer pic un 16F628A lo queme y flash de ahi creo que me enamore de c y estos integrados fue un flash ,pero cuanto mas me meto mas complicado es .
Hace 1 Semana #5
Moderador

Avatar de D@rkbytes

Para cambiar el periodo, puedes usar una variable que le asigne un nuevo valor al Timer.
Para que el servicio de interrupción ya no se ejecute, deshabilita su bit de activación.
En PIC C de CCS se hace con la instrucción "disable_interrupts(level);"
Por ejemplo: disable_interrupts(TIMER1);

Y yo pienso lo contrario, que mientras más los uses, más los comprendes.

Suerte.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.