Este programa es una modificación del Programa 6.
Lo que se pretende, es profundizar en el manejo de las instrucciones FSR e INDF. En el Programa 6 se hacía una lectura del contenido de una variable definida en memoria RAM llamada Var y del registro GPIO propio del PIC mediante el direccionamiento indirecto.
En este programa, se realizará la lectura tal y como se hizo en el anterior programa, y la novedad será de que se hará una escritura en ambos registros con el direccionamiento indirecto.
;**********************************************************************
;                      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:      Ejemplo7.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    INDF,F        ; Var++
   movlw   0x06          ; Dirección de memoria de GPIO
   movwf   FSR           ; FSR apunta a GPIO
   movf    INDF,W        ; W = GPIO
   incf    INDF,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..............bcf  CM1CON0,C1ONY por último, se debe "apagar" también el periférico del convertidor A/D.
.......
         andlw   b'00111111'
    andwf   ADCON0Para 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    GPIOTRIS
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.
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.
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
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 guardando 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 mediante el uso del direccionamiento indirecto.
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 7. | 
|  |  | Ejemplo 7. | 
 
 








0 comentarios:
Publicar un comentario