Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

22/06/2015 #1


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!!!
22/06/2015 #2
Moderador

Avatar de D@rkbytes

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:
Código PHP:
Programa
    btfss    PORTA
,0            Comprobar el estado del bit 0 del puerto A
    
goto    Rotar_Izq        Si está en unoir a Rotar_Der
                            
Si está en ceroir 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?
23/06/2015 #3


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?
23/06/2015 #4
Moderador

Avatar de D@rkbytes

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
23/06/2015 #5

Avatar de Scooter

Cargar acumulador con 1
Etiqueta 1:
Rotar acumulador
Sumar uno
¿Bit 7=1? Salto etiqueta 2
Saltar a etiqueta 1
Etiqueta2:
Fin
23/06/2015 #6


Podeis confirmarme que es así finalmente???



Código 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 unoir a Rotar_Der
                            
Si está en ceroir 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 
23/06/2015 #7
Moderador

Avatar de D@rkbytes

Micros52 dijo: Ver Mensaje
¿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é:
Código 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.
23/06/2015 #8


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
Imágenes Adjuntas
Tipo de Archivo: gif tempo.gif (301,9 KB (Kilobytes), 15 visitas)
23/06/2015 #9
Moderador

Avatar de D@rkbytes

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.
24/06/2015 #10


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
Imágenes Adjuntas
Tipo de Archivo: png conexiones y puertos.png (58,2 KB (Kilobytes), 13 visitas)
24/06/2015 #11
Moderador

Avatar de D@rkbytes

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.
24/06/2015 #12


Pues muchas gracias crack, creo que esta parte la tengo bien claro.

Si puedes amigo pásate por mi otra pregunta sobre las tablas porfavor

Saludos!!!
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.