martes, abril 02, 2013

PROGRAMACION DE PIC EN ASSEMBLER - Nº 2

MANEJO DE TIMERS

El PIC16F877A ademas de manejar puertos de entrada y salida, también posee muchos periféricos de ayuda que hace que este dispositivo sea muy potente para muchas aplicaciones embebidas. Entiéndase por periféricos a chips que se encuentran dentro del microcontrolador y que funcionan en forma paralela a la ejecución de las instrucciones del microcontrolador.

Los TIMERs son periféricos de gran uso en las aplicaciones con microcontroladores. Sus características y funcionamiento varían de acuerdo a su estructura interna, en nuestro caso los timers del PIC posee 3 modos de funcionamiento:

- Modo Temporizador
- Modo Contador Asíncrono (Modo contador)
- Modo Contado Sincrono (Modo oscilador)

El PIC16F877A posee tres timers, los cuales tienen estructuras internas diferentes, por consiguiente funcionan de forma diferente, no todos poseen los modos descritos arriba:


EL TIMER 0

El modulo Timer0 puede ser usado para generar periodos de tiempo (si funciona como temporizador) o puede ser usado para registrar eventos (contador). Al igual que en el modulo anterior existen registro que controlan el funcionamiento del modulo TIMER0.


La operación implica la siguiente secuencia:
- Ingresar al banco 1
- Configurar el modulo TIMER= (como contador o temporizador)
- Regresar al banco 0
- Cargar el valor del TMR0 (inicilizarse la cuenta)
Las principales carateristicas del modulo Timer 0 son:
- Puede ejecutar hasta 256 cuentas (0 -255) ya que el registro TMR0 es de 8 bits
- El registro TMR0 puede ser leído para saber cual es el valor actual de las cuentas o puede ser escrito para colocar un valor inicial.
- Posee un bloque de pre-escaler que permite ampliar el rango de las cuentas
- Selector interno para definir si trabaja como temporizador o como contador.
- Genera una señal de interrupción cuando se produce un desborde en el registro TMR0 (cuando pasa de 0xFF a 00). Bit T0IF del registro INTCON.
- Selector para indicar si detecta flanco de subida o bajada cuando opera como contador. Bit T0SE del registro OPTION_REG.

Ahora tenemos el diagrama de bloques del Timer 0:

Como se aprecia en la parte superior derecha esta presente un MUX (Multiplexor). El MUX es controlado por el bit T0CS, si es 0 el modulo opera como temporizador; si es 1 actúa como contador. El bit T0CS pertenece al registro OPTION_REG y es el bit 5. Cuando el modulo actúa como temporizador el registro TMR0 se incrementa en cada ciclo de instrucción (siempre y cuando el pre-escaler este deshabilitado). Cuando el registro TMR0 es escrito el microcontrolador debe esperar 2 ciclos de instrucción para comenzar la cuenta.
Cuando trabajamos como contador el registro TMR0 incrementa su valor cada vez que aparece un flanco en el pin RA4/T0CKI. La selección del tipo de flanco (subida o bajada) dependerá de la programación del bit T0SE (registro OPTION_REG bit4). Si T0SE es 0 trabaja como flanco de subida. pero si trabaja con 1 es flanco de bajada.

El pre-escaler es un modulo compartido por el WATCHDOG (WTD) y el TIMER 0. El pre-escaler es como un divisor de frecuencia programable. Como se aprecia puede conectarse en serie al modulo timer 0 (dependiendo de los valores de T0CS y PSA). Supongamos que el modulo timer 0 funciona como contador y el pre-escaler esta habilitado. El valor de 1:1, eso significa que cada pulso que ingrese incrementara el valor en el registro TMR0 (el valor máximo de cuentas sera 256). Si el pre-escaler esta en 1:8, entonces por cada 8 eventos que sucedan solo aumentara una cuenta en el registro TMR0 (el valor máximo de cuentas sera 8x256). El valor del pre-escaler depende de los bits PS2 (bit2), PS1 (bit1) y PS0 (bit0) del registro OPTION_REG. El bit PSA (bit3) del registro INTCON define si el pre-escaler funciona con el WTD o con el TIMER0.

En el siguiente grafico veremos los detalles del registro OPTION_REG:


bit 7:  RBPU (Pull up)
bit 6:  INTEDG (para habilitar los flancos)
bit 5:  T0CS, Bits selector de fuente para el TMR0
          1 = Clock externo, pin RA4/T0CKI
          0 = Clock interno(CLOCKOUT)
bit 4:  T0SE, Bit selector de flanco
          1 = Incrementa en flanco de bajada en pin T0CKI
          0 = Incrementa en flanco de subida en pin T0CKI
bit3:   PSA Bits de asignacion del pre-escaler
          1 = Pre-escaler es asignado al WATCHDOG
          0 = Pre-escaler es asignado al modulo TIMER0
bit 2-0 PS2-PS0, Bits selectores de trabajo


La gran mayoría de micro poseen al timer 0, por ejemplo el PIC 16F84A, un pic básico  posee entre sus escasos periféricos al timer 0.
El timer 0 posee un registro de 8 bits, este al tener desbordamiento (overflow) puede activar un salto de interrupción habilitando el bit T0IE del registro INTCON.

EL TIMER 1

EL timer 1 es un periférico mas profesional que el timer0, pues posee un registro contador de 16 bits, representado en 2 bytes: TMR1H y TMR1L. Sus mejoras se reflejan en su arquitectura interna que vemos a continuación:
Como ya se menciona antes el Timer1 tiene tres formas de funcionamiento:
a) Temporizador
b) Contador Asíncrono (Modo Contador)
c) Contador Sincrono (Modo Oscilador)

Los bits de control del timer1 se encuentran alojado en el registro T1CON:


Bit 7-6  Bits no implementados. Leido como 0
Bit 5-4 T1CKPS1:T1CKPS0: El pre-escaler es un divisor de la frecuencia de los impulsos que se aplican al      TIMER 1
            11 = 1:8 Valor de Pre-escaler
            10 = 1:4 Valor de Pre-escaler
            01 = 1:2 Valor de Pre-escaler
            00 = 1:1 Valor de Pre-escaler
Bit 3    T1OSCEN: Control de habilitación para el oscilador del TIMER1
            1 = El oscilador el habilitado (RC0 y RC1 = entradas del oscilador externo)
            0 = El oscilador trabaja en otro modo (RC0 = entrada del oscilador externo)
Bit 2    T1SYNC: Determina la posible sincronizacion o no de los impulsos del reloj externo con los del reloj interno
           TMR1CS = 1
           1 = No sincronizacion con un reloj externo
           0 = Sincronizacion con un reloj externo
           TMR1CS = 0
           Este bit es ignorado cuando el TIMER1 usa reloj interno
Bit 1   TMR1CS: Selecciona la fuente de los impulsos del contaje
           1 = Reloj externo desde el pin RC0/T10S0/T1CKI (en el flanco)
           0 = Reloj interno (FOsc/4)
Bit 0   TMR1ON: Gobierna el permiso o la prohibición de funcionamiento del TImer1
           1 = Habilitar el Timer 1
           0 = Detener el Timer 1
No todos los microcontroladores de Microchip poseen el Timer1, por el ejemplo el PIC16F84A no tiene el time1, mientras el PIC16F628A si lo tiene.
El timer 1 posee un registro contador de 16 bits. este al tener desbordamiento (overflow) puede activar un salto de interrupcion habilitando el bit TMR1IE del registro PIE1, mientras su flag TMR1IF se encuentra en el registro PIR1

EL TIMER 2

EL TIMER2 es un timer con un registro contador de 8 bits. Este timer, a diferencia del TIMER0 y TIMER1 no posee un pin para ingresar pulsos externo, esto quiere decir que solo cuenta con pulsos interno del oscilador. Sus características se aprecian en el siguiente gráfico:


Los bits de control del TIMER2 se encuentran alojado en el resgistro T2CON


Bit 7  Bit no implementado. Leído como 0.
Bit 6-3 T0UTPS3:t0UTPS0: EL post-escaler es un divisor de frecuencia de los impulsos que salen del comparador (TMR2 vs PR2_REG)
           0000 = 1:1 Valor de Pos-escaler
           0001 = 1:2 Valor de Post-escaler
           0010 = 1:3 Valor de Post-escaler
           ...
           1111 = 1:16 Valor de Post- escaler
Bit 2  TMR2ON: Gobierna el permiso o la prohibición de funcionamiento del TIMER2
Bit 1-0 T2CKPS1-T2CKPS0: El pre-escaler es un divisor de la frecuencia de los impulsos que se aplican al TIMER1
            00 = Pre-escaler es 1
            01 = Pre-escaler es 4 
            11 = Pre-escaler es 16

El TIMER2 posee un registro contador de 8 bits, este es comparado con el valor alojado en el registro PR2(92H), cada vez que estos registros sean iguales se le dara un pulso al post-escaler, ademas reseteara al contador del TIMER2. Cuando el post-escaler termina de contabilizar el valor configurado puede generar un salto de interuupcion habilitando el bit TMR2IE del registro PIE1(8CH), mientras su flag TMR2IF se encuetra en el registro PIR1(0CH).

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

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