Semaforo assembler pic16f84a

Hola señores.

He estado aprendiendo sobre los pic desde hace como 3 días y estoy armando un semaforo con un PIC16F84A compilado en MPLAB y en lenguaje ENSAMBLADOR para una tarea de la U, para la cual se ha puesto unas condiciones, las cuales son:

CONDICIONES:
Luz en Rojo: La luz roja debe estar encendida durante 20 segundos.
Luz en Rojo-Amarillo: Las luces roja y amarilla deben estar encendidas durante 5 segundo.
Luz en Verde: La luz verde debe estar encendida durante 20 segundos.
Luz en Amarillo: La luz amarilla debe estar encendida durante 10 segundos.

Y este es el código(planteado por mi) con los retardos.

Código:
#include <p16f84A.inc>

__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
                   
; Asignacion de variables utilizadas en demora   
CONT equ 0Ch
CONT2 equ 0Dh
CONT3 equ 0Eh
CONT4 equ 0Fh

ORG   0000h
bsf       STATUS,5         ; Cambiamos al banco 1Switch to Bank 1
            movlw     0000h              ; Ponemos los pines del puerto A ...
            movwf     TRISA            ; ...como salidas.
            bcf       STATUS,5         ; Volvemos al Banco 0.

LUZROJA	movlw     b'00000010'   ; Encendemos el LUZROJA poniendo primero el Valor, por 20 segundos.
            
movwf     PORTA
			call RETARDO
			

LUZAMARILLA	movlw     b'00000110'              ; Encendemos LUZROJA Y LUZ AMARILLA.
            movwf     PORTA
			call RETARDO1
			movlw b'00000000'
	

RETARDO ; Retardo de 20s
		movlw d'10'
		movwf CONT4;
CICLO4	movlw d'100'
		movwf CONT3
CICLO3	movlw d'98'
		movwf CONT2
CICLO2	movlw d'67'
		movwf CONT
CICLO	decfsz CONT,1
		goto CICLO
		decfsz CONT2,1
		goto CICLO2
		decfsz CONT3,1
		goto CICLO3
		decfsz CONT4,1
		goto CICLO4
		Return

RETARDO1; Reatardo de 5s
		movlw d'100'
		movwf CONT3
CICLO6	movlw d'100'
		movwf CONT2
CICLO5	movlw d'166'
		movwf CONT
CICL4	decfsz CONT,1
		goto CICLO4
		decfsz CONT2,1
		goto CICLO5
		decfsz CONT3,1
		goto CICLO6
		Return
END

Todo iba bn, la LUZVERDE se mantiene prendida durante 20s, y luego se prende la LUZAMARILLA junto con la LUZVERDE (he simulado en PROTEUS), pero el problema se presenta con el RETARDO1 (Retardo de 5 segundos), ya que al pasar los 5 segundos deberían apagarse las dos luces, y no lo hacen por ninguna razón, he estado cacharreando pero aún no encuentro la solución. Las salidas del semaforo son RA1,RA2 Y RA3 para respectivas luces.

¿Como elaboro la rutina para que se me apaguen la LUZVERDE Y LUZAMARILLA después del RETARDO1?
 

Adjuntos

  • SEMAFOROSIRVE.txt
    1.3 KB · Visitas: 210
Última edición por un moderador:
no manejo muy bien el mplab... pero no se supone que tendrias que tener un buble para el programa inicial...

me imajino que lo que te ara sera dos veces el proceso y se parara.
y porque no enve de acer una subrrutina para cada proceso, qu solo determinan el tiempo y los pilotos que se van a encener.
no te curras una subrrutina que tansolo active los bit del puerto que sea tanto tiempo como sea.. una bariable para activar las salidas y otra bariable para el tiempo que permanece en la subrrutina.

un saludo
 
clrf PORTA?? limpia el puerto B
bcf PORTA,x?? apaga un bit del puerto B

porque no usas esas instrucciones...
no apagan porque no cargas al puerto nada, o tu codigo esta incompleto?

mmm no veo "luz verde" o es la misma que "rojo" en tu codigo??!!

al rato subo mi solución a tu problema de modo de practicar un poco el asm!!
sin modificar mucho tu codigo.



pd: el el retardo1
una etiqueta se llama CICL4 cuida que nos e repitan en la rutina "retardo" cambie el numbre....
 

Adjuntos

  • semaforo!.zip
    841 bytes · Visitas: 900
Última edición:
QUE TAL, enpezando recien eh, si es una secuencia que se repite segun entendi, deberia repitirce, entonces debe tener esta estructura:
INICIO
LUZROJA movlw b'00000010' ; Encendemos el LUZROJA poniendo primero el Valor, por 20 segun

movwf PORTA
call RETARDO


LUZAMARILLA movlw b'00000110' ; Encendemos LUZROJA Y LUZ AMARILLA.
movwf PORTA
call RETARDO ;revisa tu retardo DE 5s
CLRF PORTA

GOTO INICIO
 
Muchas gracias a todos por sus recomendaciones, y gracias por sus buenos consejos. He podido solucionar mis problemas y obtener el semaforo bajo las condiciones descritas. Ahora solo me espera seguir aprendiendo sobre los micro y el lenguaje ASSEMBLER.
 
ostia... no te importaria averlo comentao done comentaste anterior mente y mantener el programa anterior. asi porlomenos podria observas tus fallas ala hora de estructuracion de los programas.
y se ve que le as echo unos camvios como te ije.. pero me da que te as liado algo.. como e dicho anterior mente no me manejo mucho con el mplab.. (no tengo tanto nivel) pero si lo llego entender medianamente y los programas se acen mas largos pero mucho mas eficieentes.

y prestaba que pusieras los comentarios en los camvios que le pusiste... (al mismo leyendo los comandos mplab seme van quedando)jejejje sino no me entero de mucho
y por cierto no se pueden definir una bariable array. pongamos que almacenas los distintos estados
y los distintos tiempos que corresponen a cada intervalo. espues las dos subrrutinas una la de las salidas de luces y otra el tiempo.. y en el programa inicial es one mueves y compruevas todas las entradas. ya sea el voton para cruzar el peaton el sensor de coche para que en algunos cruces si no hay coche para salir no le de paso anada.. vamos en el programa inicial seria donde tendrias que poner todas las variantes del transito de veiculos y los botones para los peatones

saludos
 
Última edición:
cierto!!.. eso si seria un semáforo completo ...inteligente!!!??

variable array??
jeje array me recuerda a las clases de algoritmos

puedes crear un registro cualquiera en los espacios vacios de la memoria despues de 0x0C en el 16f84
de por cierto ya se crean algunos para la temporizacion
 
jajajja. no te sonara e resistencias array. s como ecir varios apartados en el mismo sitio o resistencia con barias entradas..
Variable arrays can be created in a similar manner to variables.


bueno mas bien arrays.. jejejjeje
y en mplab creo que tambien se pueden efinir para ser mas macil la programacion.
por egemplo
estado [1,9]
estado seria la bariable y constaria de 20 bancos e memoria..
espues acees mejor a ella.
pongamos que el primr numero seria 0 para el tiempo y el 1 los 8 bit e salidas y despues el valor de 0 a 9 los distintos pasos. pero que bueno igual tampoco seria muy eficiente replantearlo asi. porlomenos para un semaforo. pero mas o menos...

un saludo
 
no. eso es mas bien util para acer comparaciones de bit o en mi caso creo que es lo que uso en muchos programas como bit que utilizo por separdo.... (tampoco es quetenga un gran nivelazo en el tema)
se supone que todos los compiladores tienen esa comodidad defines una variable y la redimensionas para despues aceder a ella mas fail. cuano el compilador compila el programa pues redicionara todo de seguido.
por ejemplo
si ya as efinido unas bariables, y de golpe defines una con 10 campos o como quieras llamarlo.
el programa la definiria.

estado[variable para aceer] equ 10h 'hasta 1Ah si la defines de 10. vamos del 0 al 9, 10 posiciones de memoria

lo bueno de acer los procesos e esta manera viee que nunca te conincidira que se ponga todo en verde o rojo, por que ya tienes los procesos almacenaos en la ram o una epron que cargue.

un saludo
 
ahora si no te entiendo nada!!!
quieres varioa "arreglos"?con distintos estados* ya pre-cargados....
para cuando detecte esas variables de transito y/o peatones lanze a mostrar el estado correspondinte....
eso si lo tengo claro, pero no tanto:D
usando tablas con la instrucción RETWL
 
me pregunto que por que no miraras tu mismo lo que es un redicionamiento array, ya que no saves lo que es......

https://www.forosdeelectronica.com/f13/declaracion-variables-mplab-31600/

y ya te igo que no me manejo tanto.. suelo programar con em mecanike picbasic. y raravez anor cachos con comandos en mplab.. que se que es mejor programar de esa manera (saviendo estructurar ien los programas.. y replanteando bien el flujo del programa.

un saluo

y lee mejor los manuales antes de los compiladores para aprender cosas simple nuevas que te puedan alluar acer el programa y estructurarlo comodamente.
 
ahhhh....
"CBLOCK"!!
no creía que a eso te referias al mplab, solo me limitaba a las instrucciones del Datashett propiamente dichas, no le metía mucha mano al mplab en ese sentido
leyendo otras cosas encontré que se pueden crear librerias...no tomaba mucho en cuenta eso
ahora estoy investigando eso gracias amigo
 
bueno es empieza practicando con instrucciones simple... pero leer bien los manuales el compilaor y cosas que te alluden a mejorar el programa es siempre muy interesante.
pues ya saves una cosa nueva y que es muy util. aparte de la que ya comentaste anterior mente que es para estraer it sueltos y operar despues con ellos, INDF y FSR. ya te digo que son muy utiles. comento estas por que creo que es lo que uso muy frecuente en picbasic solo que es mas facil manejarlas.

y por cierto eso no son librerias.
tansolo es crear un emplazamiento de memoria de seguido por ejemplo de 0X10 a 0X24 y acedes a ella desde una bariable, que la pondrias en 0X0F por un decir todo esto. (no entiendo porque no empezais con un compilador mas simples para ir empezando a entender el mplab poco a poco)

un saludo y muy bien por la dedicacion en tus estudios
 
Última edición:
Atrás
Arriba