Doble programa en el mismo pic

hola, quiero exponeros una duda aver si alguien le ha pasado tambien. he de decir q soy muy novato. tengo un programa. mediante un pulsador en el portb.0 y un led en el portb.1 cadavez que pulso el pulsador hace un cambio se enciende el led pulso el led parpadea pulso y el led se apaga. la duda es quiero lo mismo en portb.2 pulsador y portb.3 led no consigo hacer q funcionen los dos a la vez.

el programa:


trisb.0=1
trisb.1=0
trisb.2=1
trisb.3=0
pul var portb.0
led var portb.1
pul2 var portb.2
led2 var portb.3
led2=0
led=0

;---------------------------------------------------------------------
; led
;---------------------------------------------------------------------
encendido:
if pul=1 then encendido
if pul=0 then rebote
pwm1:
if pul=1 then pwm1
if pul=0 then rebote3
apagado:
if pul=1 then parpadeo
if pul=0 then rebote2
rebote:
if pul=0 then rebote
pause 200
led=1
goto pwm1
rebote2:
if pul=0 then rebote2
pause 200
led=0
goto encendido
rebote3:
if pul=0 then rebote3
if pul=1 then parpadeo
parpadeo:
led=0
if pul=0 then apagado
pause 200
led=1
if pul=0 then apagado
pause 200
goto apagado

;----------------------------------------------------------------
; led2
;----------------------------------------------------------------

aencendido:
if pul2=1 then aencendido
if pul2=0 then arebote
apwm1:
if pul2=1 then apwm1
if pul2=0 then arebote3
aapagado:
if pul2=1 then aparpadeo
if pul2=0 then arebote2
arebote:
if pul2=0 then arebote
pause 200
led2=1
goto apwm1
arebote2:
if pul2=0 then arebote2
pause 200
led2=0
goto aencendido
arebote3:
if pul2=0 then arebote3
if pul2=1 then aparpadeo
aparpadeo:
led2=0
if pul2=0 then aapagado
pause 200
led2=1
if pul2=0 then aapagado
pause 200
goto aapagado

la idea es generar un PWM en un 16f84A.Mediante un solo pulsador se consiguen 5 posiciones de salida, que son , Apagado, 700mA, 1500mA, y 2000mA, 3000mA
Alimentando el circuito con 7.2v (2 baterias de litio de 3.7v) y uso un 7805 para alimentar la parte del 16F84A.
y quiero un doble canal que es lo que no consigo hacer.
 
Última edición:
ya pero si analizas el circuito va apagado para que se quede parpadeando en espera de la proxima pulsacion. y si lo mando al otro programa y yo quiero empezar con el segundo pulsador hasta que no hiciese todas las funciones del pulsador 1 no pasaria al pulsador 2
 
no se aque te refieres

El ic 16f84a tiene 5 interrupciones en el puerto B, en RB0, y de RB4 a RB7

si tu configuras el registro intcon.3=1 y el intcon.7=1 entonces al cambiar de estado en alguno de esos pines se cambia la bandera del registro intcon.0...

con eso no necesitas estar pausando (congelando) el micro... y puedes llamar las rutinas deacuerdo al pin que se haya pulsado...

si usas pbp busca el archivo de ayuda... ahi hay un ejemplo...
 
Última edición:
Temporizar con bucles vacíos es la primera técnica que se aprende y la primera que hay que olvidar para siempre.
Lee como van los timers
 
hola, lubeck , estado pensando en lo q me has comentado de las interupciones. y me ha costado comprenderlo por que soy novato en esto mi duda a lo que comentas es cuando haces una interrupcion deja lo que esta haciendo y pasa a otra tarea que seria el programa dos pero yo quiero multitarea. te pongo un ejemplo:

se controla un led con pwm con un pulsador cadavez q pulsamos varia el pwm-------pero si se pulsa un segundo pulsador controla otro led con pwm igual q el primero pero el primero no deje lo que estaba haciendo y pase al control del segundo.

no se si me explico se trata de multitarea en dos puertos diferentes pero a la vez es posible por q yo no lo consigo y no te digo si utilizamos un tercer puerto 3 pwm a la vez.

alguna idea de com hacer dicha aplicacion. gracias de antemano
 
No existe la multitarea en los micros, a menos que sea un micro de varios nucleos, lo que si existe es que un micro contenga varios modulos (PWM en tu caso) y estos esten siempre generando una señal independiente, pero el micro tiene que dejar una accion pendiente para pasar a atender la siguiente

Tambien existen intentos de colocar sistemas operativos pequeños dentro del micro, lo que hacen es "partir" un programa en subtareas e irlas ejecutando poco a poco, con esto pareceria que el micro esta haciendo varias acciones a la vez, en realidad ejecuta una, para, ejecuta la siguiente, para y asi susesivamente...
 
hola, me has dejado sin respuestas, entonces lo que quiero hacer hacen falta dos micros.
bueno visto asi usare dos micros.
solo dos cuestiones:
1- me recomendais algun micro en concreto solo para un pulsador y pwm para un led de potencia

2- el pwm cual es mejor usar el del micro o crearlo tu. cuando lo creas tu puedes variar la frecuencia pero si usas el del micro se podria tambien variar la frecuencia.
 
Si y no... como siempre la respuesta es "depende"... muchas veces los micros son tan rapidos que no es necesario usar dos... con uno solo realizando ambas funciones (aunque no sea en paralelo) basta y sobra...

Hay que hacer los calculos segun la velocidad de PWM que necesitas, y en base a eso buscar un micro que tenga varios PWMs, poner un generador PWM externo o generarlo por software...
 
Para lo que quieres hacer te sobran tres cuartas partes del micro, es cuestión de emplear técnicas adecuadas.
Destierra para siempre los bucles vacíos como temporizadores solamente son válidos para retardos de unos pocos (muy pocos) ciclos, usa los timers que se inventaron para eso.
Procura usar pwm en hard si lo hay.
Dale una buena leída al tema de las interrupciones son la base de la computación, mas o menos.
 
hola, me has dejado sin respuestas, entonces lo que quiero hacer hacen falta dos micros.
bueno visto asi usare dos micros.
solo dos cuestiones:
1- me recomendais algun micro en concreto solo para un pulsador y pwm para un led de potencia

2- el pwm cual es mejor usar el del micro o crearlo tu. cuando lo creas tu puedes variar la frecuencia pero si usas el del micro se podria tambien variar la frecuencia.
Saludos.
Bien pues como dice Chico3001 el micro tiene que teminar de ejecutar una tarea para continuar con la otra, no puede atender un pushbutton mientras no se termina de ejecutar la tarea que esta haciendo, a menos que pongas una sentencia dentro de la tarea para que atienda otra y luego continue, con eso puedes parar la tarea o pasar a hacer otra. Algo que puedes hacer es usar flags y comparaciones, que son mas sencillas de implementar. Por cierto si usas PICBASIC hay una función llamada PWM la cual requiere de un pin de salida y dos variables de esta manera: PWM Pin,Duty,Cycle Donde Pin es el pin de salida, Duty es el ciclo activo 0 = 0% hasta 255 = 100% y Cycle es las veces que el ciclo pwm sera repetido. Un ejemplo en PBP seria así. PWM PORTB.7,127,100 ' Envia una señal PWM del 50% en RB7 100 ciclos. Este ejemplo lo puedes ver en la ayuda del programa MicroCode Studio®. Suerte...
 
Última edición:
buenas noches si quisiera activar dos pines del puerto B al mismo tiempo con PWM como lo haria con un pin del puerto seria PORTB.7,127,100 si quisiera activar 2 pines ala vez osea que los 2 tengan el mismo pulso o pwm al mismo tiempo
 
Última edición:
buenas noches si quisiera activar dos pines del puerto B al mismo tiempo con PWM como lo haria con un pin del puerto seria PORTB.7,127,100 si quisiera activar 2 pines ala vez osea que los 2 tengan el mismo pulso o pwm al mismo tiempo
Saludos. Ok pues seria lo mismo, haz así. Por ejemplo:
' Defines tus puertos salida
TRISB = %00000000 ' En este caso pongo todo el puerto B como salida
' Defines que sera RB6 y RB7 tus puertos de salida PWM
SYMBOL PWM1 = PORTB.6
SYMBOL PWM2 = PORTB.7
' Aqui tus variables
Duty VAR BYTE
Cycle VAR BYTE
' Aqui les asignas un valor
Duty = 127
Cycle = 100
' Mandas llamar a la función PWMOUT

PWMOUT:
' Dara una salida PWM por RB6 y RB7
PWM PWM1,Duty,Cycle: PWM PWM2,Duty,Cycle
RETURN ' o lo que quieras hacer despúes
; o seria igual así también.
PWMOUT2:
PWM PORTB.6,127,100: PWM PORTB.7,127,100
RETURN

Ok espero haberte servido. BYE4NOW :apreton:
 
Última edición:
Muchas gracias amigo por responderme y sobre todo por lograr entender mi idea hoy por la noche compilare el ejemplo y te respondo en verdad muchas gracias.
la idea de este codigo es que se me ocurrio hacer un PARLED pues estos circuitos son luces para discoteka a puros leds seria facil comprarmelo pero esta carito y pues me sale mas barato armarlo
estoy trabajando con un pic 628a y ocupo solo tres pines del PUERTOB
que son RB0 color rojo
RB1 color VERDE
RB2 color AZUL
le he logrado hacer unas secuencias pero tambien lo hare con PWM en verdad muchas gracias en la noche lo pruebo y te respondo gracias
 
Saludos. Ok pues seria lo mismo, haz así. Por ejemplo:
' Defines tus puertos salida
TRISB = %00000000 ' En este caso pongo todo el puerto B como salida
' Defines que sera RB6 y RB7 tus puertos de salida PWM
SYMBOL PWM1 = PORTB.6
SYMBOL PWM2 = PORTB.7
' Aqui tus variables
Duty VAR BYTE
Cycle VAR BYTE
' Aqui les asignas un valor
Duty = 127
Cycle = 100
' Mandas llamar a la función PWMOUT

PWMOUT:
' Dara una salida PWM por RB6 y RB7
PWM PWM1,Duty,Cycle: PWM PWM2,Duty,Cycle
RETURN ' o lo que quieras hacer despúes
; o seria igual así también.
PWMOUT2:
PWM PORTB.6,127,100: PWM PORTB.7,127,100
RETURN

Ok espero haberte servido. BYE4NOW :apreton:

no creo que eso sirva....

mira puse este codigo en PBP

Código:
begin:

pwm portb.0,127,1
pwm portb.1,127,1

goto begin

en si... es lo mismo que dices... pero mira el osciloscopio del simulado...


osea que hace los 256 pasos del ciclo pwm en el RB0 y despues se pasa al RB1 y hace los siguientes 256 pasos del ciclo, creo que eso no es lo que se busca sino que sean simultaneos, una posibilidad es hacerlo por hardware.... hay bastante informacion (me da weba hacerlo honestamente)
 
Última edición:
Atrás
Arriba