como crear un delay en una salida sin afectar a otras activadas al mismo tiempo

hola a todos... estoy realizando un proyecto de control de luces por sensores.. el problema que al poner un delay para una salida el programa se queda parado, y al acitvarse otro sensor la otra salida se activa hasta que termina el delay de la salida anterior.. les agradeceria todas sus sugerenciaas.. :)
 
Tienes que crear una interrupcion en un tiempo determinado, supongomos que 1 seg. Y el tiempo que le asignes a cada salida configurarlo en una o varias variables.
Cada vez que se active la interrupcion tienes que ir restando el valor de todas las variables segun el numero de salidas que utilices, y verificar si alguna ha llegado ya a cero, actuando en consecuencia.
 
Hacer retardos usando bucles vacíos es bastante/muy absurdo, sobre todo para tiempos largos.
Como probablemente no te de para todo el tiempo con una interrupción lo que se suele es hacer digamos 10 o 20 interrupciones para un segundo y luego contar segundos...
 
Podés también hacer algo como una llamada a un método de la siguiente manera

short demora(){
contador++
if(contador == 1000)
contador = 0;
return 1;
else
return 0;
}

y lo que hacés es llamar a la demora como

if(demora()){
acá hacés lo que pasa cuando ejecutás el código luego de la demora
}

De todas formas con una interrupción también lo podés hacer.

Saludos
 
creo que lo que lo mejor es usar timers no se cuantos puertos usas pero lo puedes hacer de muchas maneras, por ejemplo calculando un timer cada 1ms, si una luz la tienes que activar cada 100ms pues creas una variable que se vaya decrementando y al llegar a 0 se active esa luz. Sin embargo si la otra quieres que se active cada 50ms pues lo mismo, otra variable para esa luz se vaya decrementando cuando llege a 0 se activa.
 
gracias a todos por sus respuestas vere cual metodo me es mas sencillo implentar, ya que tendre 13 sensores y 13 lamparas, cada sensor acitivara 3 lamparas una en el lugar del sensor y las otras dos a sus lados. recorriendose una sola lampara cuando cambie de señal..

este el el programa que eh elaborado sin retardos y me funciona ala perfeccion elabore una tabla para las variables que activaran las salidas, ya que algunas entras activan salidas iguales lo implemente con compuertas or


#include <16F877A.h>
#fuses NOPROTECT,NOWDT,XT,NOPUT
#use fast_io(b)
#use fast_io(a)
#use fast_io(c)
#use fast_io(e) // Acceso rápido a las entradas y salidas
#use delay (clock=4000000,RESTART_WDT)
int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,
h1,i1,j1,k1,l1;
void main()
{ output_b(0x0);
output_c(0x0); // Borra las salidas
set_tris_a(0x11);
set_tris_b(0x00);
set_tris_c(0x00);
set_tris_d(0x11);
while (true)
{

if(a||c==1)
{output_high(48); }
else output_low(48);

if(b||d||f==1)
{output_high(49); }
else
output_low(49);


if(e||g||i==1)
{output_high(50); }
else
output_low(50);


if(h||j||l==1)
{ output_high(51); }
else
output_low(51);


if(k||m||o==1)
{ output_high(52); }
else
output_low(52);


if(n||p||r==1)
{ output_high(53); }
else
output_low(53);


if (q||s||u==1)
{output_high(54); }
else
output_low(54);


if (t||v||x==1)
{output_high(55); }
else
output_low(55);


if (w||y||a1==1)
{output_high(56); }
else
output_low(56);


if (z||b1||d1==1)
{output_high(57); }
else
output_low(57);


if (c1||e1||g1==1)
{output_high(58); }
else
output_low(58);


if (f1||h1||j1==1)
{output_high(59); }
else
output_low(59);

if (i1||k1==1)
{ output_high(60); }
else
output_low(60);


if (l1==1)
{ output_high(61); }
else
output_low(61);

/// entradas //

if (input(40))
{ a=b=1; }

else a=b=0;

if (input(41))
{ c=e=d=1; }
else
c=d=e=0;

if (input(42))
{ f=g=h=1; }
else
f=g=h=0;

if (input(43))
{ i=j=k=1; }
else
i=j=k=0;

if (input (44))
{ l=m=n=1; }
else
l=m=n=0;

if (input(45))
{o=p=q=1; }
else
o=p=q=0;

if (input(64))
{ r=s=t=1; }
else
r=s=t=0;

if (input(65))
{ u=v=w=1; }
else
u=v=w=0;

if (input(66))
{ x=y=z=1; }
else
x=y=z=0;

if (input(67))
{ a1=b1=c1=1; }
else
a1=b1=c1=0;

if (input(68))
{ d1=e1=f1=1; }
else
d1=e1=f1=0;

if (input(69))
{ g1=h1=i1=1; }
else
g1=h1=i1=0;

if (input(70))
{ j1=k1=l1=1; }
else
j1=k1=l1=0;


}
}

el problema que no soy muy experimentado en CCS y nunca eh usado las interrupciones si alguien me podria dar una ejemplo con el codigo que te puse se los agradeceria mucho..
 
Última edición:
Atrás
Arriba