Escalera de Leds

Hola a todos, soy el estudiante que necesita ayuda sobre ensamblador para las recuperaciones en Julio.
Necesito vuestra ayuda expertos.

Podeis corregirme este ejercicio: ESTA ADJUNTADO EN LA FOTO

Esta es mi solución(la que creo)

Código:
Contador		equ		0x20	;Variable para la temporización 
                     
				org		0x00	 
				goto	Inicio	;Vector de reset 
				org		0x05 
 
;*************************************************************************************** 

 
Delay			movlw	.100 
			movwf	Contador	;Carga el contador con 100
Delay_0			bcf	INTCON,T0IF	;Desconecta el flag de rebosamiento del TMR0 
			movlw	~.39 
			movwf	TMR0		;carga el TMR0 con 39 
Delay_1			btfss	INTCON,T0IF	;Rebasamiento del TMR0 ?? 
			goto	Delay_1		;No.
			decfsz	Contador,F	;Decrementa contador. Se ha repetido 25 veces ? 
			goto	Delay_0		;Todavía no, 
			return			;Ahora si 
 
Inicio	    		clrf 	PORTB		;
			bsf	STATUS,RP0	;Selecciona banco 1 
			clrf	TRISB		;Puerta B se configura como salida 
			movlw	0x06 
			movwf	ADCON1		;Puerta A digital 
			movlw	b'00011111'	 
			movwf	TRISA		;Puerta A se configura como entrada 
			movlw	b'00000111' 
			movwf	OPTION_REG	;Preescaler de 256 para el TMR0 
			bcf	STATUS,RP0	;Selecciona banco 0			                                                                          
	 
			bsf	STATUS,C	;Activa el carry 
Loop			call	Delay		;Temporiza 1s 
			btfsc	PORTA,0		;Está a 0 RA0 ?? 
			goto	A_Dcha		;No, rotación a derecha 
A_Izda			rlf	PORTB,F		;Si, rotación a izquierda 
			goto	Loop 
A_Dcha			rrf	PORTB,F		;Rotación a derecha 
			goto	Loop 
		end				;
Me he hecho un poco el lio. A ver si lo podeis mirar

Gracias!!!
 

Adjuntos

  • ej1.png
    ej1.png
    20.1 KB · Visitas: 21
Me parece que quieres que los LED se vayan encendiendo de uno por uno, pero si rotas los bits, no mantendrás encendidos los demás y necesitarías un contador.
Al rotar los bits del puerto B, se obtendría un efecto visual similar al carro K.I.T.
Enciende el primero, se apaga, enciende el segundo, se apaga y así consecutivamente hasta el bit 7.

Si no quieres complicarte con algún algoritmo o una tabla, puedes realizar las secuencias en binario.
Por ejemplo:
PHP:
Programa
    btfss    PORTA,0            ; Comprobar el estado del bit 0 del puerto A
    goto    Rotar_Izq        ; Si está en uno, ir a Rotar_Der
                            ; Si está en cero, ir a Rotar_Izq
Rotar_Der
    movlw    b'10000000'        ; Poner el número 128 en binario.
    movwf    PORTB            ; Mandarlo al puerto B (Enciende LED en RB7)
    call    Retardo_1s        ; Ir a la rutina de retardo de 1 segundo.
    movlw    b'11000000'
    movwf    PORTB
    call    Retardo_1s
    movlw    b'11100000'
    movwf    PORTB
    call    Retardo_1s
    ; Hacer lo mismo hasta completar los 8 bits.
    clrf    PORTB            ; Limpiar el puerto B (Se apagan todos los LED)
    call    Retardo_1s        ; Esperar 1 segundo.
    goto    Programa        ; Regresar.

Rotar_Izq
    movlw    b'00000001'        ; Poner el número 1 en binario.
    movwf    PORTB            ; Mandarlo al puerto B (Enciende LED en RB0)
    call    Retardo_1s        ; Ir a la rutina de retardo de 1 segundo.
    movlw    b'00000011'
    movwf    PORTB
    call    Retardo_1s
    movlw    b'00000111'
    movwf    PORTB
    call    Retardo_1s
    ; Hacer lo mismo hasta completar los 8 bits.
    clrf    PORTB            ; Limpiar el puerto B (Se apagan todos los LED)
    call    Retardo_1s        ; Esperar 1 segundo.
    goto    Programa        ; Regresar.
Así es fácil. ¿No? :)
 
Última edición:
En la ultima tirada, los 8 leds deben estar encendidos 1 seg, por lo que seria asi no?
Código:
 movlw    b'11111111'
    movwf    PORTB
    call    Retardo_1s
    clrf    PORTB            ; Limpiar el puerto B (Se apagan todos los LED)
    goto    Programa


otra pregunta, aqui hacemos :
Código:
 call retardo_1s

No deberíamos ponerlo en el código?

el de crear un contador a 100 y luego con el tmr0 ponerle un valor de 256 segundo?
 
Respuesta a la primer pregunta:
Sí, así es como debe ser el código para poner en 1 los 8 bits del puerto B.
Pero coloca también un retardo después de: clrf PORTB para que se alcance a notar el cambio.

Si se puede obtener el retardo de un segundo con el Timer 0, pero es más complicado porque tendrás que sincronizar el programa y realizar un conteo por cada desborde del Timer 0 hasta que logres un segundo.
Es más fácil que uses una subrutina para generar el retardo deseado.
Mira este enlace para generar retardos: Delay Code Generator
 
Cargar acumulador con 1
Etiqueta 1:
Rotar acumulador
Sumar uno
¿Bit 7=1? Salto etiqueta 2
Saltar a etiqueta 1
Etiqueta2:
Fin
 
Podeis confirmarme que es así finalmente???



PHP:
Inicio
    bsf      STATUS,RP0
    clrf      TRISB
    movlw  b'00000111'
    movwf OPTION_REG
    bcf      STATUS,RP0

Programa
    btfss    PORTA,0            ; Comprobar el estado del bit 0 del puerto A
    goto    Rotar_Izq        ; Si está en uno, ir a Rotar_Der
                            ; Si está en cero, ir a Rotar_Izq
Rotar_Der
    movlw    b'10000000'        ; Poner el número 128 en binario.
    movwf    PORTB            ; Mandarlo al puerto B (Enciende LED en RB7)
    movlw    d'100'
    movwf    aux
    call        retardo_1s

    movlw    d'100'
    movwf    aux
    movlw    b'11000000'
    movwf    PORTB
    call    Retardo_1s

    movlw    d'100'
    movwf    aux
    movlw    b'11100000'
    movwf    PORTB
    call    Retardo_1s

    ; Hacer lo mismo hasta completar los 8 bits.

   ;ultima tirada
    

    movlw    d'100'
    movwf    aux
    movlw    b'11100000'
    movwf    PORTB
    call    Retardo_1s

    clrf    PORTB            ; Limpiar el puerto B (Se apagan todos los LED)
    call    Retardo_1s        ; Esperar 1 segundo.
    goto    Programa        ; Regresar.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Lo mismo para el otro sentido


Retardo 
 
contador1   
    btfss    INTCON,TOIF
    movlw    d'256'
    movwf    TMR0
   
contador2
    btfss    INTCON,TOIF
    goto    contador2
    decfsz    aux,1
    goto     contador1
    return
 
¿Podéis confirmarme que es así finalmente?
Nop. De nada sirve en este programa que configures el registro OPTION_REG y no tiene caso que recargues siempre con el mismo valor la variable "aux".

Yo te decía de ésta forma y usando el código de retardo generado en la página que te mencioné:
PHP:
    cblock    0x20
    cnt1,cnt2,cnt3                    ; Variables para el retardo
    endc

    org    0x00                        ; El programa inicia en la dirección 0
    
Inicio
    ; Aquí abajo colocar el código de configuración de registros correspondientes para pines Digital I/O
    ; ...
    bsf        STATUS,RP0
    clrf    TRISB                    ; Configurar el Puerto B como salidas
    bcf        STATUS,RP0

Programa
    btfss    PORTA,0
    goto    Rotar_Izq

Rotar_Der
    movlw    b'10000000'
    movwf    PORTB
    call    Retardo_1s
    movlw    b'11000000'
    movwf    PORTB
    call    Retardo_1s
    movlw    b'11100000'
    movwf    PORTB
    call    Retardo_1s
    movlw    b'11110000'
    movwf    PORTB
    call    Retardo_1s
    movlw    b'11111000'
    movwf    PORTB
    call    Retardo_1s
    movlw    b'11111100'
    movwf    PORTB
    call    Retardo_1s
    movlw    b'11111110'
    movwf    PORTB
    call    Retardo_1s
    movlw    b'11111111'
    movwf    PORTB
    call    Retardo_1s
    clrf    PORTB
    call    Retardo_1s
    goto    Programa

Rotar_Izq
    movlw    b'00000001'
    movwf    PORTB
    call    Retardo_1s
    movlw    b'00000011'
    movwf    PORTB
    call    Retardo_1s
    movlw    b'00000111'
    movwf    PORTB
    call    Retardo_1s
    movlw    b'00001111'
    movwf    PORTB
    call    Retardo_1s
    movlw    b'00011111'
    movwf    PORTB
    call    Retardo_1s
    movlw    b'00111111'
    movwf    PORTB
    call    Retardo_1s
    movlw    b'01111111'
    movwf    PORTB
    call    Retardo_1s
    movlw    b'11111111'
    movwf    PORTB
    call    Retardo_1s
    clrf    PORTB
    call    Retardo_1s
    goto    Programa
    
; Subrutina de retardo de 1 segundo @ 4 MHz.
Retardo_1s
    ; 999990 ciclos.
    movlw    0x07
    movwf    cnt1
    movlw    0x2F
    movwf    cnt2
    movlw    0x03
    movwf    cnt3
Retardo_1s_0
    decfsz    cnt1,f
    goto    $+2
    decfsz    cnt2,f
    goto    $+2
    decfsz    cnt3,f
    goto    Retardo_1s_0
    ; 6 ciclos.
    goto    $+1
    goto    $+1
    goto    $+1
    ; 4 ciclos (incluyendo llamada)
    return  
    
    end
Falta la palabra de configuración, pero eso depende del PIC que estés usando. ;)
El código no está comentado porque lo expliqué anteriormente.
 
Gracias D@rkbytes.

Yo ponía el option reg con el timer0 para los retardos por que utilizaba el esquema de esta pagina para encender y apagat todos los leds con un intervalo de un segundo entre encendido y apagado y creia que era muy parecido a lo mio

Adjunto el gif

echale un vistazo si puedes y comentame por ahi sí utiliza el option reg.

Gracias crack
 

Adjuntos

  • tempo.gif
    tempo.gif
    301.9 KB · Visitas: 16
Así es como te mencioné anteriormente, sincronizando la ejecución del programa con el Timer 0.

Si te fijas bien, primero se encienden todos los LED del puerto B, se entra a un bucle hasta que el Timer 0 se desborde, se apagan los LED, se entra a otro bucle similar y el proceso se repite.
Eso lo tendrías que hacer por cada cambio de secuencia y el código sería bastante largo por lo repetitivo.
Por eso te recomendé hacer uso de una subrutina de retardo. :cool:
 
D@rkbytes tienes razon, con el call retardo es mucho mas corto.

Ultima pregunta sobre este tema
Un esquema de conexiones de todas las partes del sistema y puertos seria la foto adjuntada?
Gracias
 

Adjuntos

  • conexiones y puertos.png
    conexiones y puertos.png
    58.2 KB · Visitas: 13
Si piensas utilizar el pin RB0 como salida y entrada, tal vez por interrupción, eso te será muy complicado.
De esa forma tienes que hacer comprobaciones para actuar adecuadamente conforme se vaya ejecutando el programa.

Por ahora es mejor que realices la verificación de cambio de sentido usando otro pin.
Te recomiendo que empieces por hacerlo de forma sencilla y ya que vayas avanzando, lo hagas más complejo.
 
Atrás
Arriba