Página de inicio Mi Correo






   » Foro
   » Nuevo Foro
   » Mi Correo
   » Mis Actividades...


--- Novedades ---



    
  » Microcontroladores » Tutorial Básico (7 de 10)  

.: Antes de empezar

Si bien nos vamos a complicar con las siguientes lecciones, sería bueno que consultes el Set de instrucciones, así será mas fácil que comprendas cada línea de código que se escribe, ya que cada una está acompañada de su respectivo ejemplo, y una vez lo comprendas puedes quedarte con el Resumen de instrucciones.

Lo que haremos ahora será un programa que encienda 4 LED's en forma secuencial, y para ello recurriremos a la rutina de retardo del programa anterior, que espero lo hayas comprendido, si no es así regresa y no vengas aquí hasta que lo entiendas :o))

Ok, sigamos. El circuito será el siguiente...

Y el código que realiza la secuencia es el que viene a continuación.

;---------------Encabezado-------------

	LIST	p=16f84	     
	radix	hex	     

;------------mapa de memoria---------

estado	equ	0x03	     ; Haciendo asignaciones
TRISB	equ	0x06	      
ptob	equ	0x06	     
rotar	equ	0x0A	     ; para desplazar el dato

reg1	equ	0x0C	     ; para hacer el retardo
reg2	equ	0x0D
reg3	equ	0x0E

;-------Configuración de puertos-------

reset	org	0x00

	goto 	inicio	     ; salta a "inicio"
	org	0x05	     ; aquí comienza el programa
inicio	bsf	estado,5  	     ; configurando el puerto B
	movlw	b'00000000'
	movwf	TRISB
	bcf	estado,5

;----Realiza la secuencia de LED's-----

ahora	movlw	0x01	     ; carga W con 00000001
	movwf	rotar	     ; lo pasa al registro rotar

rotando	movf	rotar,0	     ; pasa el contenido de rotar a W
	movwf	ptob	     ; y de allí al puerto B
			     ; encendiendo el LED correspondiente
	call	retardo	     ; llama a retardo
	rlf	rotar,1	     ; desplaza un bit el contenido
			     ; de rotar y lo guarda.
	btfss	rotar,4	     ; prueba si se activa el 5to. bit
			     ; si es así saltea una línea
	goto	rotando	     ; sino, sigue rotando
	goto 	ahora	     ; repite todo de nuevo

;-----------Rutina de Retardo-----------

retardo	movlw	10	     ; Carga los registros
	movwf	reg1	     ; reg1, reg2 y reg3
			     ; con los valores 10, 20 y 30
tres	movlw	20	     ; respectivamente
	movwf	reg2

dos	movlw	30
	movwf	reg3

uno	decfsz	reg3,1	     ; Comienza a decrementar
	goto	uno	     ; cuando termine
	decfsz	reg2,1	     ; regresará a la siguiente
	goto	dos	     ; línea de código
	decfsz	reg1,1	     ; de donde fue llamado
	goto	tres
	retlw	00

;------------------------------------------
	end		     ; The End
;------------------------------------------

Todo está como antes, salvo lo que está en rojo. Veamos de que se trata eso de rotar y rotando.

;----Realiza la secuencia de LED's-----

ahora	movlw	0x01	     ; carga W con 00000001
	movwf	rotar	     ; lo pasa al registro rotar

rotando	movf	rotar,0	     ; pasa el contenido de rotar a W
	movwf	ptob	     ; y de allí al puerto B
			     ; encendiendo el LED correspondiente
	call	retardo	     ; llama a retardo
	rlf	rotar,1	     ; desplaza un bit el contenido
			     ; de rotar y lo guarda.
	btfss	rotar,4	     ; prueba si se activa el 5to. bit
			     ; si es así saltea una línea
	goto	rotando	     ; sino, sigue rotando
	goto 	ahora	     ; repite todo de nuevo

rotar es el registro en el que almacenaré momentáneamente el valor del desplazamiento de los bit's. Así cuando llegue al 5to. no enviaré ese dato ya que se habrá activado el 4to. bit del puerto B del PIC (sería el 4to. LED), y entonces volveré a comenzar.

.: Descripción del código:

Ok, voy a poner a 1 el primer bit del registro rotar a través de w, esto se hace en las dos primeras líneas.

rotando, es una subrrutina: Aquí se pasa el contenido del registro rotar o sea (00000001) a W (por eso el 0) para luego enviarlo al puerto B (portb), y encender el primer LED, luego llama al retardo, cuando regrese se encontrará con la siguiente instrucción.

rlf rotar,1 esto es como decirle, rota el contenido del registro rotar un lugar a la izquierda, y guarda el valor en el mismo registro rotar (por eso el 1). Es decir, que si antes rotar=00000001 luego de esta instrucción rotar=00000010. Ahora viene la verificación del 5to. bit, para saber si completó la rotación.

btfss rotar,4 es como si le preguntarías ¿oye, se activó tu 5to. bit?.

Ok...!!! ya se lo que estas pensando ¿como que el 5to. si aparece el 4?, bueno, es por que no estas siguiendo el tutorial, recuerda que el primer bit está en la posición 0 y por ende, el 5to. esta en la posición 4 ¿ahora esta bien?. Continuemos, si resulta ser que no, saltara hasta rotando y pasará el contenido del registro rotar a W nuevamente (recuerda que ahora rotar es 00000010 por aquello del desplazamiento). luego lo enviará al puerto B, llamará al retardo y rotará nuevamente.

Bien supongamos que ya paso todo eso y que ahora rotar tiene el valor 00001000 y estamos ubicados justo en la etiqueta rotando. Entonces pasará el valor a W y de allí al puerto B, luego llamará al retardo, cuando regrese, rotará el contenido del registro rotar una vez más y entonces su contenido será 00010000. Ahora viene la pregunta...

btfss rotar,4 ¿está activo el 5to. bit del registro rotar?, Siiiiii, si Sr. está activo..., Perfecto, entonces saltaré una línea, me encontraré con goto ahora y comenzaré de nuevo.

Eso es todo. Ahora veámoslo en forma gráfica para aclarar un poco las ideas.

Esa fue la idea, que veas como se hace la rotación, hay varias formas de hacerlo, yo aquí te mostré una, otras utilizan el carry del registro STATUS, otras no utilizan la rotación para hacer esta secuencia, sino van activando los bit's de a uno, en fin, tienes muchas opciones...

Fue todo por hoy, ahora nos tomamos un descanso y vemos que otras herramientas tenemos...



R-Luis...

<--Anterior   Introducción   Siguiente -->
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
Tabla de Referencias


    
--| |--