Semaforo creado en ensamblador con pic16f84a

#1
Hice un programa q es un semaforo muy sencillo q me encienda 3 leds x tiempos, el programa es el siguiente:

Código:
TITLE "celdasolar"
	LIST P=16F84A
		INCLUDE <P16F84A.INC>	
		__CONFIG _CP_OFF& _WDT_OFF& _PWRTE_ON& _XT_OSC 
ORG 00h
INICIO 	
		BSF STATUS,5; PASAMOS AL BANCO1
		CLRF PORTB; CONFIGURAMOS PUERTO B COMO SALIDA
		MOVLW 01h; HABILITO UNA ENTRADA DEL PUERTO A (A0)
		MOVWF TRISA
		BCF STATUS,5; REGRESO BANCO 0
TODOAPAGADO
		MOVLW 00H
		MOVWF PORTB
SEPRENDE
		BTFSS PORTA,0
		goto SEPRENDE
VERDE
		MOVLW b'01'
		MOVWF PORTB
		call Retardo_5s
		MOVLW b'00'
		MOVWF PORTB
		call Retardo_1s
		MOVLW b'01'
		MOVWF PORTB
		call Retardo_1s
		MOVLW b'00'
		MOVWF PORTB
		call Retardo_1s
		MOVLW b'01'
		MOVWF PORTB
		call Retardo_1s
AMARILLO
		MOVLW b'10'
		MOVWF PORTB
		call Retardo_2s
ROJO
		MOVLW b'100'
		MOVWF PORTB
		call Retardo_5s
		GOTO VERDE
	INCLUDE <RETARDOS.INC>
END
la cuestion es q en proteus me sale algo nada q ver, se enciende asi como q parpadeando solo un led, me gustaria q me orientara q me falta o esta mal en mi programa
gracias
 
#2
el programa esta bien, pero estaria bueno que nos digas a que lineas estan conectados los leds, ademas despues de la etiqueta "rojo" pones

movlw b'100'

qe es 100?

00000100?
10000000?

tenes que poner el byte completo

con respecto con lo que dice sangreaztk, hace caso omiso. esta bien asi, tanto portb como trisb funcionan en este micro, siempre y cuando estes trabajando en el banco correcto (en tu caso el banco 1).

salu2,
mano.
 
#3
Manonline, b'100' es igual a b'00000100'. Al parecer la luz verde es RB0, la amarilla RB1 y la roja RB2.

Por lo que se ve en el código todo esta bien, el único problema podría estar en el archivo RETARDOS.INC que no se puede ver.
 
#5
Hola amigos, necesito una pequeña ayuda en mi trabajo.
Tengo que hacer un semáforo para autos y uno para peatones con el pic16f84.

condiciones:

LUZ ROJA AUTO - VERDE PEATON: 5 SEGUNDOS
LUZ VERDE AUTO - ROJA PEATON : 5SEGUNDOS
LUZ AMARILLO AUTO - ROJO PEATON : 3 SEGUNDOS AMARILLO FIJO Y ROJO 0.5 SEG (3 seg. Parpadeando)

El problema está en que no sé como colocar dos retardos en una misma línea.
Por favor, toda ayuda es bienvenida.
Gracias.
Código:
        d1 equ 0ch
    d2 equ 1ch
    d3 equ 2ch
    rb2 equ 2
    org 0x00
    bsf status,5
    movlw b'00000000'
    movwf trisb
    bcf status,5    


led    movlw b'00010001' ;activacion de leds ;;;;;;rojo-verde
    movwf portb
    call Delay1
    
    movlw b'00001100' ;activacion de leds ;;;;;;verde-rojo
    movwf portb
    call Delay1

    movlw b'00000010' ;activacion de leds ;;;;;;amarillo
    movwf portb
    call Delay2
    
    
    movlw b'00001000' ;activacion de leds ;;;;;;;;;;;;;;;;;parpadeo rojo peaton
    movwf portb
    call Delay3
    movlw b'00000000' ;activacion de leds 
    movwf portb
    call Delay3
    movlw b'00001000' ;activacion de leds 
    movwf portb
    call Delay3
    movlw b'00000000' ;activacion de leds 
    movwf portb
    call Delay3
    movlw b'00001000' ;activacion de leds 
    movwf portb
    call Delay3
    movlw b'00000000' ;activacion de leds 
    movwf portb
    call Delay3

    goto led
    end







;;;;;;;;;;;;;;;;;;;;;5 segundos;;;;;;;;;;;;;;;;;;;;;;;;

Delay1
                    ;4999993 cycles
    movlw    d'250' 
    movwf    d1
    movlw    d'230' 
    movwf    d2
    movlw    d'11' 
    movwf    d3
Delay_1
    decfsz    d1, f
    goto    $+2
    decfsz    d2, f
    goto    $+2
    decfsz    d3, f
    goto    Delay_1
                    ;3 cycles
    goto    $+1
    nop
                    ;4 cycles (including call)
    return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;3 segundos;;;;;;;;;;;;;;;;;;;;;;;;

Delay2
                    ;4999993 cycles
    movlw    d'250' 
    movwf    d1
    movlw    d'130' 
    movwf    d2
    movlw    d'7' 
    movwf    d3
Delay_2
    decfsz    d1, f
    goto    $+2
    decfsz    d2, f
    goto    $+2
    decfsz    d3, f
    goto    Delay_2
                    ;3 cycles
    goto    $+1
    nop
                    ;4 cycles (including call)
    return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;0.5 segundos;;;;;;;;;;;;;;;;;;;;;;;;

Delay3
                    ;4999993 cycles
    movlw    d'250' 
    movwf    d1
    movlw    d'20' 
    movwf    d2
    movlw    d'2' 
    movwf    d3
Delay_3
    decfsz    d1, f
    goto    $+2
    decfsz    d2, f
    goto    $+2
    decfsz    d3, f
    goto    Delay_3
                    ;3 cycles
    goto    $+1
    nop
                    ;4 cycles (including call)
    return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
Última edición por un moderador:
#6
El problema está en que no sé como colocar dos retardos en una misma línea.
No entiendo a que te refieres con hacer dos retardos en la misma línea.
Pero ¿porqué no creas una sola rutina de retardo de un segundo?
Luego la mandas llamar la veces en segundos que requieras. Algo así...

call retardo1s
call retardo1s
call retardo1s

Y así haces un retardo de 3 segundos.

Saludos.