lunes, 14 de julio de 2008

Baseline. ProgBasico 6.

En este programa, se mostrará el uso de la instrucción:

Pero sobre todo, lo que pretende este programa es manejar los registros de direccionamiento indirecto: FSR e INDF.


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


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 veracidad de su autor. *
; *
; El autor no se responsabiliza de las consecuencias que pueda *
; ocasionar éste código debido a un uso inadecuado del mismo. *
;**********************************************************************
; *
; Filename: Ejemplo6.asm *
; Date: 14-Julio-08 *
; File Version: vs0.0 *
; *
; Author: Manuel Caballero *
; Company: Hades *
; *
; *
;**********************************************************************
; *
; Files Required: P12F510.INC *
; *
;**********************************************************************
; *
; Notes: En este programa se muestra la utilización de las *
; instrucciones FSR e INDF. *
;**********************************************************************

list p=12F510 ; Directiva para definir el procesador
#include < p12F510.inc > ; Registros especificas del procesador

__CONFIG _IOSCFS_ON & _MCLRE_ON & _CP_OFF & _WDT_OFF & _IntRC_OSCZ


; _IOSCFS_ON: Frecuencia de reloj interno a 8MHz.
; _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
cblock 0Ah ; Inicio RAM
Var
endc

;**********************************************************************
ORG 0x03FF ; Dirección del 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 0x000 ; Inicio de código
movwf OSCCAL ; Actualiza el valor del oscilador interno

movlw b'11011111'
OPTION ; Transición Timer interna
bcf CM1CON0,C1ON ; Comparador OFF
andlw b'00111111'
andwf ADCON0 ; ADC OFF
clrf GPIO
clrw
TRIS GPIO ; GP0-GP2 Salidas digitales

clrf Var ; Var = 0

Inicio
movlw 0x0A ; Dirección de memoria de Var
movwf FSR ; FSR apunta a Var

movf INDF,W ; W = Var
incf Var,F ; Var++

movlw 0x06 ; Dirección de memoria de GPIO
movwf FSR ; FSR apunta a GPIO

movf INDF,W ; W = GPIO
incf GPIO,F ; GPIO++

goto Inicio


END ; directiva 'fin de programa'

Ya que la instrucción encargada de realizar el intercambio trabaja con registros, se ha definido una variable en la memoria RAM, para ello, se usa la siguiente instrucción:

cblock------endc

En este caso, el inicio para el PIC12F510 es la dirección 0x0A en el primer banco de memoria.

También se va a usar los pines del puerto GPIO del microcontrolador, exactamente GP0, GP1 y GP2, que son los únicos que pueden ser configurados como salidas digitales.

Para ello, se deben configurar adecuadamente. Lo primero que haremos, es que la transición del Timer sea interna, así se podrá configurar el pin GP2 como salida. Se debe poner a '0' el bit T0CS del registro OPTION.

movlw   b'11011111'
OPTION..............
.............................
Posteriormente, habrá que "apagar" el periférico del comparador, para ello, realizamos la siguiente instrucción:

bcf  CM1CON0,C1ON

Y por último, se debe "apagar" también el periférico del convertidor A/D.
.......
         andlw   b'00111111'
andwf ADCON0

Para ello, los bits ANS1 y ANS0 deben ser puestos a '0' en el registro ADCON0 como se muestra en las instrucciones anteriores.

Una vez configurados todos los periféricos de tal manera que se puedan usar los pines como entrada o salida digitales, se realiza el último paso de configuración, los pines cómo salida digitales.
clrw  
TRIS GPIO
Para ello, usamos la instrucción siguiente:
TRIS

Que se encarga de configurar si los pines son de entrada o salida. Para ser de entrada, debe escribirse un '1' y para ser de salida un '0' en el bit correspondiente al pin a configurar.

Una vez configurado todo, usaremos el direccionamiento indirecto para poder manejar registros por sus direcciones de memoria.

Estos registros pueden ser registros propios del microcontrolador o variables definidas en memoria.


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

Buscamos en la ventana Watch, en la parte Symbol la variable definida, en este caso la llamada Var y la agregamos a la ventana de inspección, y en la parte de SFR, agregamos los registros OPTION_REG, CM1CON0, ADCON0, FSR, WREG y GPIO.



El interés de este programa, es mostrar como se pueden manejar registros o variables definidas en memoria simplemente con su dirección de memoria.

Para ello, existen los registros FSR e INDF. El FSR es el puntero que apunta a la dirección de memoria que s ele cargue.

En este caso, se va a manejar tanto una variable definida en RAM como un registro interno propio del PIC que es el puerto GPIO.

La variable definida en RAM es la denominada Var, que su dirección de memoria es 0x0A. Para poder acceder a ella a través del direccionamiento indirecto, se debe cargar en el puntero, FSR, con la dirección de memoria de la variable Var.

movlw 0x0A
movwf FSR


Se puede observar, que en las instrucciones anteriores se carga el registro FSR con el valor 0x0A, que es justamente la dirección que ocupa la variable Var en memoria RAM.

Una vez ejecutada la instrucción anterior, el registro FSR apuntará a Var, por lo que para obtener su valor, simplemente tenemos que leer el registro INDF y guardar el resultado en el registro de trabajo W.

movf INDF,W

Con esta instrucción, se carga el registro de trabajo con el valor de la variable Var.

Para trabajar con un registro propio del microcontrolador, en este caso tal como el registro GPIO que controla los pines del PIC, simplemente se debe cargar el FSR con la dirección de dicho registro, en este caso la dirección 0x06.

Así, se accederá al registro GPIO con una lectura de INDF y guardándo el resultado en el registro de trabajo W.

En este programa, se va cargando el puntero FSR con la dirección de la variable Var, posteriormente se lee el contenido y se guarda en el registro W y finalmente, se incrementa la variable Var en una unidad, para posteriormente observar que en la lectura del registro INDF está el contenido de la variable Var.

Lo mismo se realiza para el registro GIPO propio del PIC.



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





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

0 comentarios: