sábado, marzo 30, 2013

PROGRAMACION DE PIC EN ASSEMBLER - Nº1

MANEJO DE PUERTOS DIGITALES (PRACTICA)

Continuando con el tema de "Manejo de puertos digitales" empezaremos creando nuestro primer programa para luego pasar a ensamblar nuestros primeros ejercicios.

1. PRIMER PROGRAMA EN ENSAMBLADOR
Las instrucciones de escritura en puertos siempre son precedidas de una operacion de lectura. Es decir ponemos el valor del registro PORTA o PORTB en el registro de trabajo W. Alli modificamos su valor (podemos variar uno o mas bits) y luego llevamos el valor de W al registro del puerto. Esto se hace por ejemplo en la ejecucion de las instrucciones BCF y BSF. Por tanto debemos tener cuidado con aquellos puertos cuyas lineas son configuradas como entrada y salida a las vez. Si obervamos el diagrama de tiempo de las instrucciones de escritura en los puertos podemos observar que se llevan a cabo al final del ciclo de instruccion, entano que la lecutra se lleva a cabo al incio del ciclo de instruccion. Por otra parte los dispositivos disicos que se conforman los puertos son semiconductores con un tiempo de respuesta pequeño, es decir existe un perido de tiempo en el cual la señal esta pasando de 1 a 0 y viceversa (transitorio). 
Por tanto hemos de ser cuidadosos en la aplicacion de instrucciones sucesivas de escritura en el puerto porque lo que hacemos es aplicar una lectura luego una escritura(primera instruccion) inmeditatamente volvemos a leer el puerto y aplicamos una escritura(segunda instruccion). Note como la escritura de la primera instruccion esta seguida inmediatamente de la lectura. Si ese periodo no es suficientemente frande podriamos estar leyendo valores erroneos en la segunda instruaccion debido a que el transitorio aun no ha finaliza. Para evitar el problema es recomendable colocar instrucciones nop( no operacion) de por medio.
Las instruccion de "no operacion" (nop) no hacen mas que crear un espacio de tiempo para leer el dato despues que el transitorio ha finalizado. Si la frecuencia de funcionamiento del clock es muy alta conviene ubicar mas intrucciones nop a fin de evitar la perdida de data.
Para un mejor entendimiento recomendamos el siguiente enlace:

2. PROBLEMAS

A) Suponga una lampara que debe ser prendida o apagada desde tres puntos. Diseñe un programa que la encienda si y solo si hay dos interruptores activados. 

Tenemos el esquema en PROTEUS.


Para desarrollarlo tenemos que plantear una tabla de verdad  en la que los tres interruptores dispuestos en el PORTB (RB0, RB1 y RB2) son entradas y la linea RB3 como salida.

Algoritmo: 
1. Configurar RB0-2 como entrada digital y RB3 como salida digital
2. W = PORTB
3. Si (W = 0x03) o (W=0x06) RB3 = 1 
4. sino RB3 = 0
5. Ir paso 2

DEFINICIONES PREVIAS:
Como se puede apreciar en el algoritmo anterior es necesario contar con instrucciones que nos permitan realizar bifurcaciones en el programa. Para ello revisaremos las instrucciones de control de salto y bifurcacion.

BTFSS Bit Test f, Skip if Set
            Sintaxis            [etiqueta]  BTFSS f,d
            Operando:        0<= f <= 127
                                    0<= b <= 7
            Operacion        Salta si es (f<b<=1)

Bits afectados en el STATUS: None
Descripcion: Si el bit 'b' del registro "f" es 0 entonces la siguiente instruccion es ejecutada. SI el bit 'b' del registro "f" es 1 la siguiente instruccion es descartada y una intruccion NOP es ejecutada en su lugar lo que ocasiona que esta instruccion ocupe 2 ciclos de intruccion,
Ejemplo:        AQUI       BTFSS    FLAG,1
                     FALSO    GOTO     PROCESS_CODE
                     VERDAD ..........

Antes de la instruccion:                                      PC= la direccion de la etiqueta AQUI.
Despues de la instruccion: si FLAG<1>=0         PC= direccion de la etiqueta FALSO
                                        si FLAG<1>=1         PC= direccion de la etiqueta VERDAD

BTFSC Bit Test f, Skip if Clear
Es la instruccion complementaria a la anterior, la sintaxis y demas.valores son exactamente los mismos solo que en este caso el salto de produce cuando el bit 'b' del registro "f" es 0.

SUBWF Substrae W de f
                Sintaxis             [etiqueta]      SUBWF f,d
                Operandos:       0 <= f <= 127 d= [0,1]
                Operacion:        (f)- (W) -> (destino)

Bits afectados en el STATUS: C, DC, Z
Descripcion: Substrae (usa en metodo de complemento a 2) el registro W del registro 'f''. Si 'd' es 0 el resultado es almacenado en W. Si 'd' es el 1 resultado es almacenado devuelta en el registro 'f'.

Creacion de una variable

La mayor parte de los programas manejan datos, los datos son guardados en variables. Las variables siempre se crean en una zona de memoria tipo RAM. En el caso del PIC 16F877A disponemos de espacio en todos los bancos de memoria a partir de la posicion 20H. En el programa podemos crear una variable en la posicion la 0x20 para almacenar datos o efectuar operaciones aritmetico logicas en ella.

            movwf    20H         ; RAM[0x20] = W
            bsf          20H,5      : RAM[0x20] bit 5 = 1

Pese a que el manejo es correcto este no resulta el mas apropiado sobre todo si el programa es extenso.
Para hacerlo simple nos apoyamos en la directiva de compilacion EQU que permite definir equivalencias:

VARIABLE EQU 20H

         movwf   VARIABLE             ; VARIABLE = W
         bsf         VARIABLE,5          ;VARIABLE bit 5 = 1

Ahora tenemos el programa.

B) Diseñar un programa que simule un comparador de 4 lineas

Esquema en PROTEUS


Planteamos la tabla de verdad en donde las lineas de entrada son:

                                                 Dato B                                        Dato A
                                   RB7   RB6   RB5   RB4               RB3   RB2   RB1   RB0
                                     B3     B2      B1     B0                 A3      A2     A1     A0 

Considerando las lineas de salida:

                                        Condicion        RA2    RA1   RA0
                                           A<B                0         0        1
                                           A=B                0         1        0
                                           A>B                1         0        0

DEFINICIONES PREVIAS:
Para solucionar el problema nos apoyeremos en el uso de la instruccion SUBWF. La definicion de la instruccion es la siguiente:

SUBWF Substrae W de f
               Sintaxis:                 [etiqueta]           SUBWF f,d
               Operandos:            0<= f <=127 d=[0,1]
               Operacion:             (f) -(W) -> (destino)

Bits afectados en el STATUS: C,DC, Z
Descripcion: Substrae (usa en metodo de complemento a 2) el registro W del registro 'f'. Si 'd' es 0 el resultado es almacenado en W. Si 'd' es 1 el resultado es almacenado devuelta en el registro 'f'

Ejemplo:                   SUBWF REG1.1

DISEÑO DEL PROGRAMA
Al aplicar la instruccion SUBWF sobre dos numeros (REG1 y W) podemos identificar cual de los dos numeros es mayor. El resultado de la diferencia se almacena en REG1 y los bits C y Z nos indican la relacion de desigualdad.
Los numeros a comparar comparten el mismo registro (PORTB). Por tanto antes de aplicar la subtraccion sera ncesario separarlos. Por eso copiaremos el valor de PORTB a dos registros (o files) libres. En el caso del dato A (nible bajo) bastara una Y-logica con el valor 0x0F para separar el valor. En el caso del dato B (nible alto) primero debemos aplicar un instruccion SWAP (que invierte el orden de lo nibles) y despues una Y-logica con 0x0F. El formato de ambas instrucciones se muestra a continuacion.

SWAPF Intercambia los nibles de f
              Sintaxis:             [etiqueta]                     SWAPF f,d
              Operandos:        0<= f <= 127 d[0,1]
              Operacion:        (f<3:0>) -> (destino<7:4>) -> (destino<3:0>)
Bits afectado en el STATUS: Ninguno
Descripcion: El nible superior e inferior del registro 'f' son intercambiados. Si 'd' es 0 el resultado es almacenado en el registro W. Si 'd' es 1 el resultado es almacenado en el registro 'f'
Ejem: SWAP REG,0 
Antes de la instruccion:                 REG1 = 0xA5
Despues de la instruccion:             REG1 = 0xA5, W = 0x5A

ANDWF Y-logica de W con f
              Sintaxis:            [etiqueta]                   ANDWF f,d
              Operandos:       0<= f <= 127 d[0,1]
              Operacion:        (W) AND (f) -> (destino)
Bits afectados en el STATUS: Z Codificacion: 00 0101 dfff ffff
Descripcion: Y-logica del registro W con el registro 'f'. Si 'd' es 0 el resultado es almacenado en W. Si 'd' es 1 el resultado es almacenado en el registro 'f'.
Ejem: ANDWF FSR,1
Antes de la instruccion:     W = 0x17 FSR = 0xC2
Despues de la instruccion: W = 0x17 FSR = 0x02

DIAGRAMA DE FLUJO


Ahora tenemos el programa:



No hay comentarios: