Una ayudita con 18f2550 y PBP

Hace bastante tiempo que no programo, pero me he metido muchisimas horas de ensamblador para el 16f84, resulta que he decidido volver, y empezar por este lenguaje, he hecho un programa muy facilito, led al portb.5 y led al portb.2:

define osc 20
TRISA = %01101

inicio:
HIGH PORTA.2
PAUSE 5000
HIGH PORTA.5
pause 5000
LOW PORTA.2
PAUSE 5000
LOW PORTA.5
PAUSE 10000
GOTO INICIO
end

Bien lo primero es que los tiempos no los calcula bien, imagino que sera por el reloj de 20 Mghz, y despues primero enciende el led 2 despues apaga el 2 y enciende el 5 ????? que raro yo no le he dicho que apague el 2, despues apaga el 5 y se quedan los dos apagados.

Nose que esta pasando???
 
bueno lo que sucede en tu forma de realizar tu programa es que enciendes el puertoA.2 a solo 5 segundos pasando los 5 segundos por logica se va apagar y luego enciendes el puertoA.5. para que te permanesca encendido el puertoA.2 aunmenta el tiempo del pause a 10000 para que sean 10 segundos y posteriormente se apagarn juntos, otra forma de realizar esto puedes usar un gosub para ahorrarte esos pause's ya que durante ese tiempo el pic se muere y revive, saludos
 
Es un ejemplo de programa,ya se que hay maneras de hacerlo multitarea. No entiendo muy bien eso de que apago el les tras 5 segundos en teoría debería quedarse el le encendido hasta que forzara con el los cosa que no hace, apaga directamente el les cuando cambio el otro.
He probado con diferentes pics y lo hace con todos
 
Bueno pues despues de mucho trastear ya encontre mi problema, lo dejo reflejado por si a alguien mas le pasa.

El problema viene de usar para direccionar el puerto, el registro porta (portb, etc...) este registro hace una escritura directa en el puerto, el proceso que tiene esta escritura, es leer el estado actual de todo el puerto, modificar el valor y volver a escribir, por lo que puede darse el caso de que si tenemos dos escrituras seguidas, pues algun bit del registro coja un valor 0 por no haber terminado de escribir los valores anteriores.

La solución, en vez de usar el registro PORTA, usar el LATA, de esa manera no falla pues el micro hace lo que tiene que hacer aunque tenga que esperar algun microsegundo porque no este terminado de escribir la instrucción anterior.
 
Atrás
Arriba