domingo, marzo 31, 2013

PROGRAMACION DE PIC EN ASSEMBLER - Nº 1

MANEJO DE PUERTOS DIGITALES (PRACTICA 2)

Ahora pasaremos a dar la entrega de dos de los ejercicios restantes, pertenecientes al curso de "Programacion de PIC en Assembler".

C) Se tiene tres valvulas (A,B y C) que alimenta un tanque, el tanque a su vez tiene una salida. Existen 3 sensores de nivel (X,Y y Z). Cuando el tanque esta vacio los 3 sensores estan a 0-logico y es necesario activar el trabajo de las tres bombas. Cuando se llena 1/3 del tanque el sensor X pasa a 1-logico y la bomba  A deja de funcionar.Cuando se llenan 2/3 del tanque el sensor Y esta activado y la bomba B deja de funcionar. Cuando esta lleno el tanque el sensor Z se activa y la bomba C deja de funcionar. Una vez que el tanque esta lleno este empieza a expulsa el liquido acumulado. Cuando los 3 sensores pasan a 0-logico la secuencia antes descrita se repite antes NO.

A continuacion presentamos el esquema en proteus: 


Para una mejor resolucion del problema imaginemos los siguientes graficos:


Algoritrmo:

1. Configurar el PORTB como entrada y PORTC como salida
2. Si PORTB !=0 entonces ir paso 2
3. Abrir las 3 valvulas (PORTC = 0x07)
4. Si PORTB !=0x01entonces ir paso 4
5. Abrir 2 valvulas (PORTC = 0x06)
6. PORTB != 0x03 entonces Ir paso 6
7. Abrir 1 valvula (PORTC = 0x04)
8. si PORTB != 0x07 entonces ir paso 8
9. Cerrar todas las valvulas (PORTC = 0x00)
10. Ir paso 2


Ahora tenemos el codigo: 


D) Diseñar un programa que lea los 4 bits inferiores del puerto A y muestre el dato en un display de 7 segmentos que se encuentra en el puerto C

El esquema en PROTEUS es el siguiente:


Ahora nos ayudaremos del siguiente gráfico:


Algoritmo:
1. Ir banco 0
2. Configurar RA0-3 como entrada digital
3. Configurar RC0-7 como salida digital
4. Ir banco 1
5. W=0x0F
6. W = PORTA AND W
7. W = TABLA[W]
8. PORTC = W
9. Ir paso 5

Diagrama de flujo:


Definiciones previas:

CALL Llamada a una rutina
Sintaxis        [etiqueta]    CALL k
Operandos   0<= k <= 2047
Operacion:    (PC)+1 -> TOS (Sumamos 1 al valor acutal del PC y lo guardamos en la cima de la pila)
                     k -> PC <10:0>
                     PCLATH<4:3> -> PC <12:11>
Bits afectados en el STATUS: No aplica
Descripcion: CALL se usa para llamar a una rutina. Primer suma 1 al valor actual del PC y lo guarda en la cima de la pila (primera posicion libre en la pila). Los 11 bits definitivos por k (o el valor de esa etiqueta) es almacenada en el PC en los bits 0-10. Los bits superiores son cargados desde el PCLATH. La instruccion CALL ocupa dos ciclos de instruccion.

Ejemplo:  AQUI: CALL ALLA 


Diseño del programa: 

Al inicio configuramos las lineas del puerto A como entradas en tanto que las lineas del puerto C seran configuradas como salida. Luego entramos a un bucle infinito que empieza explorando el valor del puerto A (PORTA), tomaremos los 4 bits menos significativos que representa el indice de la tabla, entraremos a la tabla a buscar el contenido señalado por el indice, ese valor sera depositado el puerto C (PORTC).

Ahora tenemos el programa en MPLAB.: 


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

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:



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 


miércoles, marzo 27, 2013

PROGRAMACION DE PIC EN ASSEMBLER

GENERALIDADES
1) CARACTERÍSTICAS GENERALES DEL PIC 16F87XX

*Procesador de arquitectura RISC avanzada.
El objetivo de esta arquitectura es facilitar la segmentación y el paralelismo en la ejecución de instrucciones y reducir los accesos a memoria. Actualmente son la base de la mayoría de los microprocesadores. Existen otro tipo de arquitectura llamada CISC, usada en la mayoría de las PCs.
*Juego de 35 instrucciones con 14 bits de longitud. Todas ellas se ejecutan en un ciclo de instrucción
*Frecuencia de 20MHz

*Hasta 368 bytes de memoria RAM (Random Access Memory - Memoria de datos)
*Hasta 256 bytes de memoria EEPROM (Electrically Erasable Programmable Read Only Memory)
Es un tipo de ROM que puede ser programada, borrada y reprogramada electricamente, son memorias volátiles.
*Hasta 14 fuentes de interrupción internas y externas
*Pilas con 8 niveles
*Perro guardián (WDT)
El Watch Dog Timer es un artificio para evitar que los micro se queden colgados, lo que hace fundamentalmente es resetear el micro tras un periodo de tiempo determinado. Su funcionamiento es similar a la interrupción por desbordamiento de un Timer, que se produce cuando un Timer que es incrementado continuamente pasa de su valor máximo al mínimo para comenzar de nuevo a contar. En el caso del WDT en lugar de saltar un interrupcion se genera un reset automático en el momento de producirse dicho desbordamiento.
* Código de protección programable
*Voltaje de alimentación comprendido entre 2 y 5.5 voltios
Fabricado con tecnología CMOS
*Bajo consumo (menos de 2mA a 5V y 5MHz)

2) DIAGRAMA DE LOS PINES DEL PIC 16F874A/877A.- El encapsulado mas común tipo DIP (Dual In-Line Pin) :


- DESCRIPCION DE LOS PINES:

º OSC1/CLKIIN (9) : Entrada para el oscilador o cristal externo
º OSC2/CLOCKOUT (10): Salida del oscilador. Este pin debe conectarse al cristal o resonador. En caso de usar una red RC este pin se puede usar como un tren de pulsos o reloj cuya frecuencia es 1/4 de OSC1.
º MCLR/VPP/THV (1) : Este pin es el reset del microcontrolador, también se usa como entrada o pulso de grabación al momento de programar el dispositivo.
º RA0/AN0 (2) : Puede actuar como linea digital de E/S como entrada analógica del conversor AD (canal 0)
º RA1/AN1 (3) : Puede actuar como linea digital de E/S como entrada analogica del conversor AD (canal 1)
º RA2/AN2/VREF- (4) : Puede actuar como linea digital de E/S o como entrada analogica del conversor AD (canal 2) o entrada negativa de voltaje de referencia
º RA3/AN3/VREF+ (5) : Puede actuar como linea digital de E/S o como entrada analogica del conversor AD (canal 3) o entrada positiva de voltaje de referencia
º RA4/T0CKI (6) : Linea digital de E/S o entrada del reloj de timer 0. Salida con colector abierto (Esta salida tiene como peculiaridad, que tenemos que incluir una resistencia de carga externamente para que el CI nos proporcione un nivel alto)
º RA5/SS#/AN4 (7) : Line digital de E/S, entrada analogica o seleccion como esclavo de la puerta serie sincrona
º RB0/INT (21) : Puerto B pin0, bidireccional. Este pin puede ser la entrada para solicitar un interrupcion
º RB1 (22) : Puerto B pin 1, bidireccional
º RB2 (23) : Puerto B pin 2, bidireccional
º RB3/PGM (24) : Puerto B pin 3, bidireccional o entrada de voltaje para programacion
º RB4 (25) : Puerto B pin 4, bidireccional. Puede programarse como petición de interrupción cuando el pin cambia de estado.
º RB5 (26) : Puerto B pin 5, bidireccional. Puede programarse como petición de interrupción cuando el pin cambia de estado.
º RB6/PGC (27) : Puerto B pin 6, bidireccional. Puede programarse como petición de interrupcion cuando el pin cambia de estado. En la programación serie recibe señales.
º RB7/PGD (28) : Puerto B pin 7, bidireccional. Puede programarse como peticion de interrupcion cuando el pin cambia de estado. En la programacion serie actúa como entrada de datos.
º RC0/T10S0/T1CKI (11) : Linea digital de E/S o salida del oscilador del timer 1 o como entrada de reloj del timer 1.
º RC1/T10SI/CCP2 (12) : Linea digital de E/S o entrada del oscilador del timer 1 o entrada al modulo captura 2/salida comparacion 2/salida del PWM2.
º RC2/CCP1 (13) : E/S digital. Tambien puede actuar como entrada captura 1/salida comparacion 1/ salida del PWM 1.
º RC3/SCK/SCL (14) : E/S digital o entrada de reloj serie sincrona/ salida de los modulos SPI e I2C
º RC4/SDI/SDA (15) : E/S digital o entrda de datos en modo SPI o I/O datos en modo I2C
º RC5/SD0 (16) : E/S digital o salida digital en modo SPI (Maestro-esclavo).
º RC6/TX/CK (17) : E/S digital o pin de transmision USART asincrono o como datos en el sincrono.
º RC7/RX/DT (18) : E/S digital o receptor del USART asincrono o como datos en el sincrono.
º RD0/PSP0-RD7/PSP7 : Los ocho pines de esta puerta pueden actuar como E/S digital o como lines para la transferencia de informacion en la comunicacion de la puerta paralela esclava. Solo estan disponibles en los PIC 16F874/7.
º RE0/RD#/AN5 (8) : E/S digital o señal de lectura para la puerta paralela esclava o entrada analogica canal 5.
º RE1/WR#/AN6 (9) : E/S digital o señal de escritura para la puerta paralela esclava o entrada analogica canal 6.
º RE2/CS#/AN7 (10) : E/S digital o señal de activacion/desactivacion de la puerta paralela esclava o entrada analogica canal 7.
º VSS (12,31) : Tierra
º VDD (11,32) : Fuente (5V)

3) ARQUITECTURA DEL 16F87XA: El tipo de procesador RISC emplea un arquitectura Harvard lo que significa que trabaja las zonas de memoria de programa y datos en forma separada.



4) ARQUITECTURA INTERNA DEL PIC 16F87XA
  Aquí encontramos el procesador, la memoria de programa, memoria de datos, periféricos, contadores, etc.


5) ORGANIZACIÓN DE LA MEMORIA
La memoria se divide en memoria de datos y programa. La de datos a su vez se divide en:

  * SFR (Special Function Register) Registro de propósito general, son registros que ayudan a configurar el hardware interno asi como sirven para escribir o leer valores de los diferentes componentes que constituyen el microcontrolador. Por ejemplo el registro "trisa" que nos permite configurar el modo de trabajo de las lineas del puerto A.

 * GFR (General Function Register) Registros de proposito general, son posiciones de memoria que podemos usar para almacenar valores que emplean nuestros programa.

A su vez la memoria de datos se divide en cuatro bancos (esto es para el caso especifico del 16F87XA). Las posiciones bajas siempre estan reservadas para los SFR en tanto que las altas para los GFR.



6) HERRAMIENTAS

Para programar necesitamos:

MPLAB: Es un entorno de desarrollo es decir un recipiente que incluye varias herramientas como un editor de textos que nos permite ingresar el programa expresado en codigos, simular, etc. El MPLAB es un software de libre distribucion que se encuentra disponible en www.microchip.com

PICKIT2: Es un herramienta de desarrollo de desarrollo de bajo costo con un interfaz facil de usar para programar y depurar las familias de Microchip Flash de microcontroladores

Por ultimo dejamos un diagrama que nos ayudara a comprender mejor los pasos a seguir cuando tenemos que programar y depurar un PIC.



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