# Como ejecutar 2 programas a la vez? en Asm Ensamblador



## JnRuiz (Ago 26, 2015)

Tengo un controlador de tira de leds y un programa que controla un motor a pasos, el caso que para que incluya los dos nose, pues quiero que los leds queden fijos funcionando y realizar el programa del motor

Una solucion es hacerlo en 2 Pics diferentes, pero no es el caso.
Espero sus comentarios ...


----------



## torres.electronico (Ago 26, 2015)

no mencionas que microcontrolador estas empleando, pero tienes PIC que puedes implementar sus dos o en algunos otros casos tres pwm por hardware (PIC16F777 y la gran mayoria de los 18F paa arriba)... Esto seria para que los led trabajen en segundo plano y puedas correr tranqulamente en 1er plano la rutina del pap. saludos


----------



## TRILO-BYTE (Ago 26, 2015)

de ensamblador no se mucho 

pero en C "no precisamente debe ser C puede ser ASM ,BASIC ,etc."

el algoritmo es simple

```
unsigned int contador;

unsigned char segundos1,segundos2,segundos3;

timer0 "puede ser 1 2 ,3 etc."
{
desbordar timer X segundos "1ms para el ejemplo"

contador++; //incrementara 1ms 

[B]if(contador>=1000)[/B] //mil milisegundos es un segundo
{
contador=0; //reseteamos contador

segundos1++;
segundos2++;
segundos3++;
}
}

void main()
{

//prendemos un led cada 2 segundos
if(segundos1>=2)
{
segundos1=0; //reseteamos el segundo1
[B]//prende led[/B]
}
else
{
[B]//apaga led[/B]
}

//prendemos un rele cada 10 segundos
if(segundos2>=10)
{
segundos2=0; //reseteamos segundos2
//rele on
}
else
{
//rele off
}



}//fin del main
```


si he visto gente que soluciona sus problemas de multitarea o varios PWM con varios micros pero yo creo que son soluciones bastante marranas


----------



## JnRuiz (Ago 26, 2015)

jnruiz dijo:


> tengo un controlador de tira de leds y un programa que controla un motor a pasos, el caso que para que incluya los dos nose, pues quiero que los leds queden fijos funcionando y realizar el programa del motor
> 
> una solucion es hacerlo en 2 pics diferentes, pero no es el caso.
> Espero sus comentarios ...



me di a enteder mal y rectifico lo que trate de decir
manejo un pic16f877a

ya tengo la programacion de los leds de mi tira rbg para que cambien de color
ya tengo mi programacion para que mi motor a pasos de 5 hilos de 8 pasos cada 3 seg.

Ahora lo que nose es como correr mi progrmacion de tira de leds y quede funcionando mientras que el motor haga su respectiva funcion

ej.

Inicio
prog rgb
prog motor a pasos
goto inicio

el error sera de que primero hara uno y luego el otro y no ambas al mismo tiempo

puede ser en mikro c tambien pero mas en asm



trilo-byte dijo:


> de ensamblador no se mucho
> 
> pero en c "no precisamente debe ser c puede ser asm ,basic ,etc."
> 
> ...







me di a enteder mal y rectifico lo que trate de decir
manejo un pic16f877a

ya tengo la programacion de los leds de mi tira rbg para que cambien de color
ya tengo mi programacion para que mi motor a pasos de 5 hilos de 8 pasos cada 3 seg.

Ahora lo que nose es como correr mi progrmacion de tira de leds y quede funcionando mientras que el motor haga su respectiva funcion

ej.

Inicio
prog rgb
prog motor a pasos
goto inicio

el error sera de que primero hara uno y luego el otro y no ambas al mismo tiempo

puede ser en mikro c tambien pero mas en asm


----------



## torres.electronico (Ago 26, 2015)

en ese caso, si no queres migrar al 16F777 que tambien es de 40 pines y tenes los tres pwm por hardware, lo que podes hacer es como te menciono anteriormente trylobytes.. emplea el TMR0

*ej.*

*Inicio:
prog rgb
prog motor a pasos
correr motor paso a paso
goto inicio

interrupcion tmr0:
correr rgb

*o intentar que en la interrupcion corra lo que programaste en el manu principal... pero creo que de una u otra manera, vas a perder algo en el camino


----------



## TRILO-BYTE (Ago 27, 2015)

es que no todo es miel sobre hojuelas 

si ya tienes un programa que mueve un motor y haces un porgrama que mueve una tira led RGB 
pero tienes muchos *horrorosos DELAYS o retardos*

el programa *No sirve para la multitarea*

hay que volverlo hacer orientado a que va  a ser multitarea.

yo no ocupo directivas propias de un compilador asi que lo escribi de manera generica para que lo capten un poco 

el PWM por hardware es buena opcion  yo he generado 30 PWM emulados por registros de corrimiento para controlar RGB y van bastante bien.

aparte de recibir datos RS232 y control Sony todo al mismo tiempo, tuve que reescribir muchas lineas de codigo muchas veces

no a la primera quedo.

si ya tenia la libreria escrita para mover una tira RGB por el puerto B y queria 30 PWM no me seriva pero si el algoritmo tube que hacer una cirugia de codigo  bastante drastica.

yo digo que es mucha paciencia y aprendizaje de uno mismo.

no hay que ser necios y decir pero ya me quedo el motor  y el RGB aparte pero los 2 juntos no funcionan

hay que reescribir casi todo para que funcionen juntos


----------



## chclau (Ago 27, 2015)

En definitiva, en vez de hacer retardos en el bucle principal, en el bucle principal solo dos contadores.

Esos contadores van reduciendo su valor en la rutina de interrupcion.

En el bucle principal verificas si uno de los contadores es cero, si es asi, enciendes o apagas el LED, o activas o desactivas el motor, y recargas el valor del contador.

No es complicado.


----------



## Scooter (Ago 27, 2015)

La respuesta una vez más es no usando delays (como siempre) y luego ya depende de como estén hechos los programas.
Se puede montar una multitarea "desde el sistema operativo" es decir con un timer y una interrupción se cambia del programa A al B por ejemplo cada 10ms
Otra opción es mirar los programas y juntarlos, eso es lo más normal. Los equipos 'serios' realizan varias cosas aparentemente a la vez sin problemas.
Secuencialmente haces todo ll que tengas que hacer y vuelves a empezar.


----------



## aguevara (Ago 27, 2015)

trata de implementar RTOS, en el 877 es factible aunque laborioso.


----------



## TRILO-BYTE (Ago 27, 2015)

si no puede con un simple timer


----------



## Scooter (Ago 28, 2015)

Se puede hacer algo así:
Un bloque de arranque.
Una rutina de interrupción
Dos o más bloques de programa:

El bloque de arranque configura interrupciones cada por ejemplo 10ms. Guarda el inicio del programa2 en un sitio y salta al inicio del programa 1.

La rutina de interrupción saca de la pila el vector de retorno de la interrupción y lo guarda. Mete en la pila el "del otro programa" y retorna... Al otro

Los dos bloques de programa son programas normales sin más sólo que colocados en direcciones de memoria que no se pisen.


----------

