jueves, marzo 28, 2013

PROGRAMACION DE PIC EN ASSEMBLER - Nº 1

MANEJO DE PUERTOS DIGITALES

1. REGISTROS PARA EL MANEJO DE PUERTOS DIGITALES

El PIC 16F877A contiene 5 puertos que pueden ser configurados como entrada o salida digitales (A,B,C,D,E). El puerto A contiene 6 bits (RA0-5). El puerto B (RB0-7), el puerto C (RC0-7) y el puerto D (RD0-7) tienen cada uno 8 lineas. El puerto E solo cuenta con 3 lineas (RE0-2)

La operación de configuración de los puertos en general implica la siguiente secuencia:

- Ingresar al banco 1
- Configurar los puertos (registros TRISA, TRISB, TRISC, TRISD y TRISE)
- Regresar al banco 0
- Escribir o leer datos desde los puertos (registros PORTA, PORTB, PORTD y PORTE)

Hemos indicado que la memoria de datos del PIC 16F877A se divide en cuatro bancos: 0, 1,2 y 3. En las posiciones inferiores de ambos bancos se encuentran los registros especiales de función (SFR). En la posición 0x05, 0x06, 0x07, 0x08 y 0x09 respectivamente se encuentran los registros PORTA, PORTB, PORTC, PORTD y PORTE  que se usan para leer o escribir datos en tanto que en las posiciones 0x85, 0x86, 0x87, 0x88 y 0x89 se encuentran los registros TRISA, TRISB, TRISC ,TRISD y TRISE respectivamente, es allí donde se configuran los puertos como entradas o salidas.
Obs: El PORTB también aparece en el banco 2 en la posición de memoria 0x016 y el TRISB en la posición de memoria 0X186.


Cada uno de las lineas de los puertos puede ser configurada como entrada o salida. En los registros TRIS determinamos la configuración de los puertos. Por ejemplo si escribimos un 0 (Output) en el bit 0 del TRISA la linea RA0 se comportara como una linea de salida y si colocamos a 1 (Input) el bit 0 del TRISA, la linea RA0 se comportara como entrada.

La escritura y lectura de valores de los puertos se hace a través de los registros PORT que se encuentran en el Banco 0 (y banco 2 para el puerto B). Desde luego si configuramos un puerto como entrada (lectura) los valores que escribamos en èl no tendrán efecto porque fue configurado como entrada y no como salida. A través de las instrucciones MOV podemos leer o escribir valores.

NOTA.- El puerto A es un puerto multifuncional que se puede configurar como digital o como analógico este modo funcionamiento dependerá del registro ADCON1 (banco 1 posicion 0X1F). 


Un ejemplo seria: ADCON1= b'00000110' = 0x06

2. DESCRIPCION GENERAL DE LAS INSTRUCCIONES

Los programa están compuestos por instrucciones. El PIC 16F877A cuenta con 35 instrucciones. Cada instrucción esta representado por 14 bits. Los 14 bits a su vez se dividen en: 

 - Código de operación (OPCODE), que especifica cual es la instrucción a la que hacemos referencia, por ende cada instrucción tiene un código en partícula.

 - Operadores, cada instrucción es aplicada sobre determinados operadores, parte de los 14 bits están destinados a especificar quienes son los registros o valores que se verán afectados como resultado de la aplicación de la instrucción.

Las instrucciones están divididas en tres clases:

Orientadas a byte: Instrucciones cuya representación es: 


Las operaciones orientadas a byte reservan los 7 bits de menor peso para indicar la dirección del registro que sera operado. Una vez que se lleva a efecto la operación usamos el bit d para indica donde sera almacenado el resultado. Si d es 0 el resultado se almacena en el registro de trabajo W, si d es 1 el resultado sera guardado en el mismo registro(o file) que se opero.

Orientadas a bit: Representada por: 


La operaciones orientadas a bit buscan escribir o leer una posición (bit) dentro de un file o registro. Una vez mas los 7 bits inferiores son destinados para indicar la dirección de registro o file que vamos a trabajar y los siguientes tres bit especifican el bit dentro del registro.

Literales o de control con formato: 


Las instrucciones de control son las que ayudan a formar bucles dentro de los programas asi como sirven para llamar a rutinas o procedimientos(instrucciones CALL o GOTO). En este caso en particular se emplea los 11 bits para enviar la dirección a la cual el contador de programa (PC) saltara. Los bits superiores de la instrucción sirven para identificar a la instrucción.
En ocasiones es necesario cargar constantes a los registros del microcontrolador, las instrucciones literales nos sirven para mover las constantes a un registro en particular, en este caso empleamos los 8 bits inferiores para definir la constantes que deseamos almacenar, en tanto que los bits restantes sirven para identificar la instrucción.

A continuación es un cuadro de resumen de las instrucciones clasificadas en función a las categorías que hemos descrito.


3. LECTURA Y ESCRITURA EN PUERTOS

a) Desarrollar un programa que configure las lineas del puerto A como entrada y las lineas del puerto B como salida. Y que muestre en forma permanente la entrada del puerto A en el puerto B: 

El algoritmo es:
1. Configurar el PORTA como entrada y el PORTB como salida.
2. W = puerto A
3. PORTB = W
4. Ir paso 2.


4. PARTES DE UN PROGRAMA EN ASM

DIRECTIVAS:

Adema de las instrucciones que necesitamos es necesario revisar las directivas de compilación que son comando que permiten mejorar la programación.

Directiva ORG
[<etiqueta>] ORG <exp>

Sirve para indicar la dirección de memoria en la cual sera colocada el código generado a continuación  Si el ORG no es indicado se empieza en la direccion 0.
ejem: 

ORG 0X04
nop

Indica que el siguiente "nop" se colocara en la dirección 0x04 de la dirección del programa.

Directiva EQU
<identificador>EQU<expresion>

Permite asignar el valor de expresión al identificador. En general el identificador es un nombre que le es mas familiar al programador. 
ejem:

CONF_ADCON1 EQU b'00000110'

Crea el identificador CONF_ADCON1 con valor 0x06

END

Es de uso obligatorio y siempre se coloca al final del programa sirve para marcar el final del programa. El MPLAB solo reconoce las lineas que esten escritas previas a la aparición de la directiva END.

Directiva LIST

Sirve para indicarle al MPLAB cual es el formato del archivo *.list dentro de los parámetros esta el tipo de procesador que se va emplear. 
ejem:

list p=16F877

Directiva INCLUDE
include<file>

Sirve para incluir en el ensamblador el archivo indicado por el parámetro "file". Es como si "file" fuera parte del archivo, como si se hubiera en la posición en la cual la directiva aparece. El parámetro "file" puede incluir el path o camino en el cual se encuentra el fichero a incluir. 
ejem:

include<p16f877.inc>

incluye el archivo "p16f877.inc" que contiene las etiquetas genéricas del PIC 16F877A.

5. PRIMERAS INSTRUCCIONES

BSF                           Bit Set f
Sintaxis:                      [label] BSF f,b
Operandos:                 0=< f  =< 127
                                 0=< b =<7
Operación                  1 -> (f<b)
Afecta Status:             No
Descripción:               El bit 'b' del registro 'f' es puerto a 1- logico

BCF                          Bit Clear f
Sintaxis                     [label] BCF f,b
Operandos:                0=< f =< 127
                                 0=< b =< 7
Operacion                  00h -> (f)
                                 1 -> Z
Afecta STATUS:        Z
Descripción:               El contenido del registro "f" es puesto a 0-logicos y el bit Z del STATUS es     
                                 puesto a 1-logico.

CLRF                         Clear f
Sintaxis                       [label] CLRF
Operandos:                 0=< f =< 127
Operación:                  00h -> (f)
                                  1-> Z
Afecta STATUS:          Z
Descripcion:                 El contenido del registro "T" es puesto a 0-logicos y el bit Z del STATUS    
                                   es puesto a 1-logico.

GOTO                       Unconditional Branch
Sintaxis:                      [label] GOTO k
Operandos:                  0<= k =< 2047
Operación:                   k-> PC <10:0>
                                  PCLATH<4:3> -> PC <12:11> STATUS
Afecta STATUS          No
Descripción:                GOTO es un salto incondicional

Los once primeros bits son cargados en el registro PC bits <10:0>. Los bits superiores de PC son cargados de PCLATH<4:3>. GOTO es una instrucción.

MOVLW                   Move Literal to W
Sintaxis:                      [label] MOVLW k
Operandos:                  0<= k =< 255
Operación:                   k-> (W)
Afecta STATUS          No
Descripción:                 Los ocho bits literales de "k" son cargados dentro del registro W.

MOVWF                    Move W to f
Sintaxis:                       [label] MOVWF f
Operandos:                   0<= f =< 127
Operación:                   (W) -> (f)
Afecta STATUS           No
Descripción:                 Mueve el dato del registro W al registro "f".

6. PRINCIPALES REGISTROS DEL PIC 16F877 (STATUS)

El registro de Estado (STATUS)
El STATUS es un archivo o registro que ocupa la posicion 0x03 de los bancos de memoria:

Banco 0                             Banco 1                        Banco 2                            Banco 3
Status 0x03                        Status 0x083                  Status 0x103                     Status 0x183

El STATUS es un registro de microcontrolador que almacena informacion relacionada con:
- La ultima operacion aritmetica realizada en la ALU.
- El estado de reset del microcontrolador
- El banco de memoria que actualmente se tiene en uso


Bit 7: IRP - Register Bank Select Bit (Es un bit que se usa para las operacion de direccionamiento indirecto)

        0 = Si se trabaja sobre el banco 0 o 1 (posiciones de memoria que van desde 00h hasta FFh)
        1 =Si trabajamos con el banco 2 o 3 (posiciones de memoria que van desde 100h hasta 1FFh)

Bit 6-5: RP1-RP0 Register Bank (Bits usando en el direccionamiento directo)

        00 = Banco 0 (posiciones de memoria 00-7Fh)
        01 = Banco 1 (posiciones de memoria 80-FFh)
        10 = Banco 2 (posiciones de memoria 100-17Fh)
        11 = Banco 3 (posiciones de memoria 180-1FFh)
Los bancos pueden cotener hasta 128 posiciones.

Bit 4: T0 Time out bit

        1 = Asume el valor de 1 despues de enceder el PIC o por la aplicacion de la instruccion                                    CLRWDT o por la aplicacion de la instruccion SLEEP
        0 = Cuando se ha vencido el periodo programado en el Watchdog.

Bit 3: PD Power Down Bit

        1 =Despues de encender el microcontrolador o por la aplicacion de una instruccion CLRWDT
        0 =Cuando se ejecuta la instruccion SLEEP

Bit 2: Z Zero Bit

        1 = Cuando el resultado de una instruccion aritmetica logica da por resultado 0
        0 = Si el resultado de la operacion aritmetica o logica da por resultado distinto de 0

Bit 1: DC Digit Carry/ borrow bit (usado como acarreo en instruccion de suma como ADDWF y ADDWL, en caso se lleve a cabo de una operacion de resta se procede a tomarlo como bit de prestamo). Este bit trabaja con los 4 bits inferioes o nible bajo

        1 = Si se ha producido el acarreo en nible bajo
        0 = No se ha producido acarreo en el nible bajo

Bit 0: C Carry/borrow bit (Similar al anterior con la diferencia que toma el acarreo de todo el registro es decir trabaja con 8 bits)

         1 = Si se ha producido el acarreo en el nible bajo
         0 = No se ha producido acarreo en el nible bajo

Los tres bits que se encuentran en la parte inferior son bits que reportan el estado de la ALU tras la ejecucion de una instruccion. Estos bits son de lectura. Los bits pueden ser de escritura si y solo si la instruccion no afecta el estado de los bits Z,DC y C. Las instrucciones que no afectan al STATUS son BCF, BSF, SWAP y MOVWF. Si quisieramos colocar todos los bits del STATUS a 0 logico la aplicacion de la instruccion CLRF STATUS fallaria porque la instruccion afecta a los bits Z, DC y C. De hecho los bits C y DC conservarian el valor previo a la aplicacion de la instruccion CRLF STATUS en tanto que el bit Z se colocaria a 1 porque el resultado de la ultima operacion fue un 0.

Los bits que se encuentran en medio (-T0 y -PD) son usados para registrar si el microcontrolador esta trabajando y cual es el modo de operacion. Los bits tambien reportan el estado del WATCHDOG, cuando el periodo de tiempo del WTD se ha vencido el bit- T0 se coloca a 1. Es necesario indicar que ambos bits son solo de lectura y se modifican en funcion al modo de operacion del microcontrolador. Los bits localizados en la parte superior del registro STATUS son relacionados al uso de los bancos, la combinacion de la combianacion de los mismos determina cual es el banco actual con el que estamos trabajando. Las instrucciones recomendables para manipular son BSF y BCF. Los bits superiores son de lectura y escritura.

Cuando se aplican las instrucciones de rotacion de bits a la izquierda o derecha (RLF o RRF) el bit de C es el valor que se emplea para llenar el agujero producido por la instruccion, motivo por el cual es necesario colocar el bit C a cero o uno logico dependiendo si deseamos que la posicion libre sea cubierta por uno de los valores.

LA instruccion SWAPF  no modifica el estado de los bits Z, DC y C pero eso no implica que la aplicacion de la instruccion sobre el STATUS vaya a lograr el intercambio de los nibles. Al aplicar las instrucciones seguramente los bits IRP, RP1, RP0, Z, DC y C se intercambiaran uno a uno pero los bits -T0 y -PD no seran intercambiados ya que son de lectura.

La instruccion lleva el contenido desde el file REGISTRO hacia el W (registro de trabajo) y nuevamente lo deja donde lo encontro (REGISTRO).






El ejemplo y la aplicación de este modulo sera en la próxima entrega... Esperennos!! 

©Copyrigth Bach. Ing. Mishell Sanchez Guevara         cell: 985 653 382 


No hay comentarios: