Eduardo2 ¿Pero cómo son esos pulsos?,
Si son 50 todos iguales basta con leer la aparición del primero para largar los otros, sin necesidad de andar contando.
[b]Eduardo2[/b]La verdad no entiendo, tu 1er mensaje es confuso. ¿Podés dibujar un timing?,entonces si una puerta abierta envía 30 pulsos en 30 milisegundos, si hay 2 puertas abiertas envía 100 pulsos en los mismos 30 milisegundos.
#include<16F877A.h>
#use delay(crystal=4MHz)
#use fast_io(all)
#BIT Out1 = getenv("SFR:PORTB").0 ;
#BIT Out2 = getenv("SFR:PORTB").1 ;
#BIT Out3 = getenv("SFR:PORTB").2 ;
#BIT Out4 = getenv("SFR:PORTB").3 ;
#BIT boton = getenv("SFR:PORTB").7 ;
/* Ancho en ms de cada tren de pulsos */
#define W1 21
#define W2 19
#define W3 30
#define W4 55
/* Variables de estado de los contadores */
int8 npuls1 = 0 ,
npuls2 = 0 ,
npuls3 = 0 ,
npuls4 = 0 ;
int8 n1 = W1 ,
n2 = W2 ,
n3 = W3 ,
n4 = W4 ;
/* Macro contador */
#define T_OUT(x) \
if(npuls##x !=0) \
if(--n##x ==0){ \
n##x = W##x ; \
if(Out##x ==1) Out##x = 0 ; \
else if(--npuls##x !=0) Out##x = 1 ; \
}
#INT_TIMER2
void TIMER2_isr(void) {
T_OUT(1)
T_OUT(2)
T_OUT(3)
T_OUT(4)
}
/* Inicialización de lso trenes de pulsos */
void secuencia(int8 n){
npuls1 = npuls2 = npuls3 = npuls4 = n ;
Out1 = Out2 = Out3 = Out4 = 1 ;
}
void main(void) {
output_b(0) ;
set_tris_b(0x80) ;
port_b_pullups(0xFF);
setup_timer_2(T2_DIV_BY_4,125,1); //.5ms overflow, .5ms interrupt
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL) ;
while(true){
if(!boton){
secuencia(100) ; // Inicia la secuencia de pulsos
while(!boton) ;
}
}
}
CitarEduardo2 ¿Pero cómo son esos pulsos?,
Si son 50 todos iguales basta con leer la aparición del primero para largar los otros, sin necesidad de andar contando.
cordial saludo, gracias por tu respuesta, si todos los pulsos son iguales.
lo que se evalúan son unos sensores en unas puertas, entonces si una puerta abierta envía 30 pulsos en 30 milisegundos, si hay 2 puertas abiertas envía 100 pulsos en los mismos 30 milisegundos.
Eduardo2Gracias por tu respuesta, pues la verdad es que el código que me compartes es muy avanzado para mi y de hecho me has puesto a estudiar (lo cual me agrada) nunca he trabajado con macros ni con los registros"getenv("SFR:PORTB"" directamente, me estoy documentando para entender tu código y adaptarlo a mi proyecto. mi idea no es copiar y pegar sino aprender de ustedes así que si estas de acuerdo voy a ir segmentando tu código y agregarle los comentarios para saber si voy bien.
Hay muchas maneras, dependerá de los timers libres, la frecuencia y los gustos personales.
Te pongo un ejemplo para 4 trenes de pulsos, es mas corto escribirlo que explicarlo (y que se entienda ;) )
Cuando pulsás el boton de PIN_B7 te saca 4 trenes de pulsos cuadrados por PIN_B0..3
El argumento de secuencia() es la cantidad de pulsos a sacar y los W1...4 el intervalo entre pulsos.
remi04gracias, así sera tan pronto tenga el anterior codigo corriendo.
Usa un timer , y una interrupción por cambio de estado y mide el periodo.
30 pulsos en 30 ms significa 1 pulso en 1 ms.
100 pulsos en 30 ms significa 1 pulso en 300 uS.
Una vez determinado el periodo de un solo pulso ya sabes cómo están las puertas y puedes decidir que hacer.
Un solo '#' creará una cadena a partir del argumento dado, independientemente de lo que contenga ese argumento, mientras que el doble '##' creará un nuevo token al concatenar los argumentos.
/* Expansion de T_OUT(1)*/
if(npuls1 !=0) // npuls1 es el número de pulsos pendientes de enviar.
if(--n1 ==0){ // Cuando n1 llegue a 0 hay que cambiar de estado la salida
n1 = W1 ; // recarga n1
if(Out1==1) Out1 = 0 ;
else if(--npuls1 !=0) Out1 = 1 ; // Si Out1 estaba en 0 entonces toca mandar el siguiente, salvo que haya sido el úlltimo.
// Esto ya no vuelve a arrancar hasta que se asigne a npuls1 un valor mayor que 0. De eso se encarga secuencia()
}
#define T_OUT(x,w) \
static int8 n##x = w ; \
if(npuls##x !=0) \
if(--n##x ==0){ \
n##x = w ; \
if(Out##x ==1) Out##x = 0 ; \
else if(--npuls##x !=0) Out##x = 1 ; \
}
static int8 n1 = 19 ;
if(npuls1!=0)
if(--n1==0){
n1 = 19 ;
if(Out1==1) Out1 = 0 ;
else if(--npuls1!=0) Out1 = 1 ;
}