domingo, 20 de julio de 2008

Baseline. ProgBasico 9.

Este programa se va a seguir profundizando en la creación de subrutinas, en este caso, vamos a crear una subrutina que realice un pequeño y simple retardo.

Para la realización de este programa, se ha utilizado el microcontrolador PIC10F200, cuyas características expuestas por Microchip, se pueden observar en la siguiente dirección: PIC10F200.

El programa es el siguiente:

;**********************************************************************
; AqueronteBlog@gmail.com *
; *
; Este archivo es propiedad intelectual del blog Aqueronte, *
; cuya dirección web, es la siguiente: *
; *
; http://unbarquero.blogspot.com/ *
; *
; Se permite cualquier modificación del archivo siempre y cuando *
; se mantenga la autoría del autor. *
; *
; El autor no se responsabiliza de las consecuencias que pueda *
; ocasionar éste código debido a un uso inadecuado del mismo. *
;**********************************************************************
; *
; Filename: Ejemplo9.asm *
; Date: 20-Julio-08 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
; *
;**********************************************************************
; *
; Files Required: P10F200.INC *
; *
;**********************************************************************
; *
; Notes: Como hacer una subrutina. *
; *
;**********************************************************************

list p=10F200 ; Directiva para definir el procesador
#include < p10F200.inc > ; Registros especificas del procesador

__CONFIG _MCLRE_ON & _CP_OFF & _WDT_OFF & _IntRC_OSC

; _MCLRE_ON: Reset externo ACTIVADO.
; _CP_OFF: Protección del código DESACTIVADO.
; _WDT_OFF: Watchdog DESACTIVADO.
; _IntRC_OSC: Oscilador interno de 4MHz.


;***** DEFINICIÓN DE VARIABLES

Numero EQU 0x10 ; Variable número en la dirección 0x10 RAM

;**********************************************************************
ORG 0x00FF ; Valor del oscilador interno

; El valor del oscilador interno se localiza en la dirección 0xFF
; como una instrucción movlw k, donde k es el valor de configuración del oscilador.

ORG 0x0000 ; Inicio de código
movwf OSCCAL ; Actualiza el valor del oscilador interno a 4MHz

movlw b'11011111'

OPTION ; Transición del TMR0 interna


clrf GPIO
clrw
TRIS GPIO ; Pines GP0-GP2 salida

Inicio
bsf GPIO,0 ; GP0 ON
call Retardo ; LLama a la subrutina de nombre Suma
bcf GPIO,0 ; GP0 OFF
call Retardo ; LLama a la subrutina de nombre Retardo


goto Inicio


;**********************************************************************
; *
; Subrutina: Retardo *
; *
;**********************************************************************
; *
; Date: 20-Julio-08 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
;**********************************************************************
; *
; NOTAS: Realiza un pequeño retardo. *
; *
; Retardo = 2 + 1 + 1 + (Numero - 1)·(1 + 2) + 2 + 2 = *
; = 8 + (Numero - 1)·(3) *
; *
; Datos de Entrada: *
; · Numero *
; *
; Datos de Salida: *
; *
;**********************************************************************
Retardo
movlw 0x0F ; Cantidad correspondiente al retardo
movwf Numero

Bucle

decfsz Numero,F ; ¿Numero = 0?
goto Bucle ; NO -> Numero--

retlw 0 ; Fin de la subrutina: W = 0

END ; directiva 'fin de programa'
Para la realización de este programa, se ha empleado una variable definida en memoria RAM. En este caso no se ha usado la instrucción:

cblock---endc

Sino que se a definido mediante EQU y se le ha dado la dirección inicial de la memoria RAM.

Numero EQU 0x10

El propósito de este programa es poder mostrar lo sencillo que es realizar una subrutina. Para este programa, la subrutina que se ha creado responde al nombre de Retardo, y sirve para generar una pequeña pausa cuyo valor depende del valor que se cargue en la variable Numero.

Como el reloj es de 4MHz, y la carga es de 15 a la variable Numero, la pausa que generará desde la llamada de la subrutina hasta que sale de la mima es de:

Retardo = 8 + (Numero - 1)·(3) = 8 + (15 - 1)·(3) = 50 us

Lo que se consigue es mantener a '1' el pin GP0 durante 50us y a '0' mediante otros 50us.

El tiempo se puede modificar simplemente cambiándole el valor de carga a la variable Numero.


Para ver el resultado, compilamos el código y seleccionamos el MPLAB SIM para poder simularlo.

Abrimos la ventana de Watch y seleccionamos en la categoría de Symbol la variable definida como Numero, y el la categoría de SFR, los registros WREG, STATUS y GPIO.

Simulamos el código paso a paso.

Se puede apreciar en la simulación que el programa al llegar a la línea de código de la llamada de la subrutina, salta a dicha subrutina y realiza la tareas que en ella se disponen, una vez terminadas las operaciones de la subrutina, se vuelve al programa principal.



Se puede observar en el siguiente vídeo todo lo explicado anteriormente:





Este proyecto se puede descargar en la siguiente dirección:
Ejemplo 9.
Ejemplo 9.

0 comentarios: