Página de inicio Mi Correo






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


--- Novedades ---



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

.: Programando en serio

Debo confesar que el programa anterior aunque parezca una burrada, lo utilizaremos de tiempo completo, y lo único que cambiaremos serán los pines de entrada y salida.

Te recuerdo que lo que hicimos hasta ahora, solo fue configurar los puertos, pero no genera ninguna señal ni nada por el estilo.

Ahora si programaremos en serio. Encenderemos un LED, lo mantendremos encendido por un tiempo, luego lo apagaremos y haremos que se repita todo de nuevo. Recuerda ponerle un nombre, aquí lo llamaré LED1.asm (no olvides el .asm)

.: Comencemos
;---------------Encabezado-------------

	LIST	p=16f84	     
	radix	hex	     

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

estado	equ	0x03	     ; Haciendo asignaciones
TRISB	equ	0x06	      
ptob	equ	0x06	     

reg1	equ	0x0C	     ; Estos 3 registros los utilizaré
reg2	equ	0x0D	     ; para hacer el retardo
reg3	equ	0x0E	     	

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

reset	org	0x00 	     ; origen del programa, aquí comenzará
			     ; siempre que ocurra un reset
	goto 	inicio	     ; salta a "inicio"
inicio	bsf	estado,5  	     ; pone rp0 a 1 y pasa al banco1
	movlw	b'00000000'    ; carga W con 00000000
	movwf	TRISB	     ; y pasa el valor a trisb
	bcf	estado,5  	     ; pone rp0 a 0 y regresa al banco0

;----Aquí enciende y apaga el LED-----

ahora	bsf	ptob,0	     ; pone un 1 en RB0 (enciende el LED)
	call	retardo	     ; llama al retardo

	bcf	ptob,0	     ; pone a 0 RB0 (apaga el LED)
	call	retardo	     ; llama al retardo
	goto 	ahora	     ; repite todo de nuevo

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

retardo	movlw	10	     ; Aquí se cargan 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	     ; Aquí se comienza a decrementar
	goto	uno	     ; Cuando reg3 llegue a 0 
	decfsz	reg2,1	     ; le quitare 1 a reg2
	goto	dos	     ; cuando reg2 llegue a 0	
	decfsz	reg1,1	     ; le quitare 1 a reg1
	goto	tres	     ; cuando reg1 llegue a 0
	retlw	00	     ; regresare al lugar 
			     ; de donde se hizo la llamada

;------------------------------------------
	end		     ; se acabó
;------------------------------------------
.: Descripción del código:

No te asustes por el tamaño del código, que aunque parezca difícil todo está igual que el código anterior, por lo que sólo describiré los cambios... (lo que está en rojo)

Se agregaron 3 registros mas (reg1, reg2 y reg3), éstos vendrían a ser como variables ubicadas en sus respectivas posiciones (0x0C, 0x0D, 0x0E,) y son registros de propósito general (recuerda que para el PIC16F84 son 68, puedes elegir cualquiera).

A demás se agregó ptob, etiqueta que corresponde a la dirección del puerto B

Analicemos lo que sigue..., que éste es el programa en sí:

;----Aquí enciende y apaga el LED-----

ahora	bsf	ptob,0	     ; pone un 1 en RB0 (enciende el LED)
	call	retardo	     ; llama al retardo

	bcf	ptob,0	     ; pone a 0 RB0 (apaga el LED)
	call	retardo	     ; llama al retardo
	goto 	ahora	     ; repite todo de nuevo

La etiqueta "ahora" es el nombre de todo este procedimiento o rutina, de tal modo que cuando quiera repetir el procedimiento solo saltare a "ahora".

bsf es poner a uno un bit, en este caso al primer bit (el bit 0) del puerto B (ptob).

call es una llamada, en este caso llama a la rutina de retardo, cuando regrese, continuará con el código.

bcf es poner a cero un bit, en este caso al primer bit (bit 0) del puerto B (ptob). y luego llama al retardo, cuando regrese se encontrará con la instrucción goto obligándolo a saltar a la etiqueta ahora para que se repita todo de nuevo. Eso es todo...!!!.

.: Rutina de retardo

Esta es la parte más difícil, pero trataré de hacerlo sencillo así puedes continuar con lo que sigue y no te trabas en esta parte. Primero veremos como se cargan los registros para el retardo. Veamos el código...

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

retardo	movlw	10	     ; Aquí se cargan 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

Recordemos que en el mapa de memoria los registros 0x0C, 0x0D y 0x0E fueron nombrados como reg1, reg2 y reg3 respectivamente. Ahora simularemos los tres registros para ver como se cargan mediante el registro de trabajo W, (utilizamos W por que los valores 10, 20 y 30 son valores constantes). Repito, esto es una simulación bien a lo bruto, así que vamos a suponer que en vez de 10 cargo 1, en lugar de 20 cargo 2 y en lugar de 30 cargo 3, hago esto, solo con fines didácticos así podrás comprenderlo mejor, ok?.

Lo que acabas de ver, fue la carga de los registros reg1, reg2 y reg3. Ahora verás como se comienza a decrementar cada uno de esos registros, primero reg3, luego reg2 y finalmente reg1.

tres	movlw	20	     ; respectivamente
	movwf	reg2

dos	movlw	30
	movwf	reg3

uno	decfsz	reg3,1	     ; Aquí se comienza a decrementar
	goto	uno	     ; Cuando reg3 llegue a 0 
	decfsz	reg2,1	     ; le quitare 1 a reg2
	goto	dos	     ; cuando reg2 llegue a 0	
	decfsz	reg1,1	     ; le quitare 1 a reg1
	goto	tres	     ; cuando reg1 llegue a 0
	retlw	00	     ; regresare al lugar 
			     ; de donde se hizo la llamada

Veamos, decfsz reg3,1 esto es, decrementa reg3, si al decrementar te da cero saltéate una línea. El 1 que sigue a reg3, indica que guarde el valor de reg3 decrementado en el mismo reg3, es comoooo.... contador=contador-1 (se entiende...?)

goto, es saltar y goto uno es saltar a la etiqueta uno. En esta pequeña vuelta estoy decrementando reg3 hasta que se haga cero.

Cuando reg3 llegue a 0 decrementaré reg2 en una unidad, volveré a cargar reg3 y lo decrementaré nuevamente para recién restarle otra unidad a reg2, y así... hasta que reg2 se haga cero. Cuando eso ocurra decrementaré reg1 en una unidad, cargaré nuevamente reg2 y reg3, para luego decrementarlos de nuevo, todo esto ocurrirá hasta que reg1 se haga igual a cero.

Esta rutina de retardo, aunque parezca absurda y larga nos permite ver como se enciende y se apaga el LED, de lo contrario no podríamos notar la diferencia, o lo veríamos apagado o encendido, ya que la velocidad es demasiado alta si estamos trabajando con un XT de 4 MHz. Finalmente nos queda la última instrucción:

;------------------------------------------
	end		     ; se acabó
;------------------------------------------

Sin palabras.

Una vez cargado el programa en el PIC, necesitarás ver el programa funcionando, por lo que deberás armar este circuito.

El pin 4 (MCLR) está conectado por lo del Reset, para que se estabilicen los niveles de tensión.

Eso fue todo, buena suerte...!!!



R-Luis...

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


    
--| |--