Sei sulla pagina 1di 70

Assambler = Ensamblador

Msc PABLO ANDRES GOMEZ MONSALVE

Microcontrolador Microchip PIC 16F84

Microchip fabrica una serie de microcontroladores llamados PIC. Los hay disponibles de distintas capacidades, desde algunos tipos bsicos con poca memoria, hasta los que tienen convertidores Analgico a Digital (ADC) incluidos o incluso los que llevan dentro PWMs (Pulse Width Modulators = Moduladores de Ancho de Pulso). Una vez que aprendas como programar un tipo de PIC, aprender el resto ser fcil. Hay diversas formas de programar el PIC, - usando BASIC, C, o Lenguaje Ensamblador. Voy a mostrarte el Lenguaje Ensamblador. No se asusten! Solo hay 35 instrucciones que aprender, y es la manera ms econmica de programar los PICs, ya que no necesitas ningn otro software extra que no sea de los gratuitos.

Los pines del 16F84

Pines 1, 2, 3, 17 y 18 (RA0-RA4/TOCKI): Es el PORT A. Corresponden a 5 lneas bidireccionales de E/S (definidas por programacin). Es capaz de entregar niveles TTL cuando la alimentacin aplicada en VDD es de 5V 5%. El pin RA4/TOCKI como entrada puede programarse en funcionamiento normal o como entrada del contador/temporizador TMR0. Cuando este pin se programa como entrada digital, funciona como un disparador de Schmitt (Schmitt trigger), puede reconocer seales un poco distorsionadas y llevarlas a niveles lgicos (cero y cinco voltios). Cuando se usa como salida digital se comporta como colector abierto; por lo tanto se debe poner una resistencia de pull-Up (resistencia externa conectada a un nivel de cinco voltios). Como salida, la lgica es inversa: un "0" escrito al pin del puerto entrega a la salida un "1" lgico. Este pin como salida no puede manejar cargas como fuente, slo en el modo sumidero. Pin 4 (MCLR / Vpp): Es una pin de mltiples aplicaciones, es la entrada de Reset (master clear) si est a nivel bajo y tambin es la habilitacin de la tensin de programacin cuando se est programando el dispositivo. Cuando su tensin es la de VDD el PIC funciona normalmente.

Pines 5 y 14 (VSS y VDD): Son respectivamente las pines de masa y alimentacin. La tensin de alimentacin de un PIC est comprendida entre 2V y 6V aunque se recomienda no sobrepasar los 5.5V. Pin 6, 7, 8, 9, 10, 11, 12, 13 (RB0-RB7): Es el PORT B. Corresponden a ocho lneas bidireccionales de E/S (definidas por programacin). Pueden manejar niveles TTL cuando la tensin de alimentacin aplicada en VDD es de 5V 5%. RB0 puede programarse adems como entrada de interrupciones externas INT. Los pines RB4 a RB7 pueden programarse para responder a interrupciones por cambio de estado. Las pines RB6 y RB7 se corresponden con las lneas de entrada de reloj y entrada de datos respectivamente, cuando est en modo programacin del integrado.

Pines 15 y 16 (OSC1/CLKIN y OSC2/CLKOUT): Corresponden a los pines de la entrada externa de reloj y salida de oscilador a cristal respectivamente.

Recomendaciones

Como estos dispositivos son de tecnologa CMOS, todos los pines deben estar conectados a alguna parte, nunca dejarlos al aire porque se puede daar el integrado. Los pines que no se estn usando se deben conectar a la fuente de alimentacin de +5V, como se muestra en la siguiente figura...

Capacidad de corriente en los puertos

La mxima capacidad de corriente de cada uno de los pines de los puertos en modo sumidero (sink) es de 25 mA y en modo fuente (source) es de 20 mA. La mxima capacidad de corriente total de los puertos es:
PUERTO A Modo Sumidero Modo Fuente 80 mA PUERTO B 150 mA

50 mA

100 mA

As se vera la conexin para ambos modos de funcionamiento

El oscilador externo

Cada vez que el Pic recibe un pulso elctrico del oscilador da un paso para ejecutar una instruccin (4 impulsos para completar una), por lo que podemos decir que es una seal que le recuerda al Pic que tiene que seguir avanzando. Segn esto, el pic puede usar 4 tipos de oscilador: XT: Es un acrnimo que viene de XTAL (o cristal en castellano). Este modo de funcionamiento implica que tendremos que disponer de un cristal de cuarzo externo al Pic y dos condensadores. El valor del cristal generalmente ser de 4Mhz o 10Mhz, y los condensadores sern cermicos de entre 27 y 33 nF. La exactitud de este dispositivo es muy muy alta, por lo que lo hace muy recomendable para casi todas las aplicaciones.

RC: Este es el sistema ms sencillo y econmico. Se basa en un montaje con una resistencia y un condensador. La velocidad a la que oscile el pic depender de los valores del condensador y de la resistencia. En la hoja de caractersticas del Pic estn los valores. HS: Para cuando necesitemos aplicaciones de "alta velocidad", entre 8 y 10Mhz. Se basa tambin en un cristal de cuarzo, como el XT. LP: "Low Power" la velocidad mxima a la que podemos poner el pic con este oscilador es de 200Khz. Al igual que el XT y el HS, necesitaremos de un cristal de cuarzo y unos condensadores

Reset. El PIC 16F84A posee un temporizador interno conectado al pin de reset, que funciona cuando se da alimentacin al microcontrolador.
Esto hace que al encender el sistema el microcontrolador quede en reset por un tiempo mientras se estabilizan todas las seales del circuito. Para tener control sobre el reset se utiliza el siguiente circuito:

Como Programar el PIC

Adems de aprender las instrucciones de cdigo de ensamble, como programas realmente ese cdigo y lo metes en el PIC? Pues hay dos maneras, la sencilla y la "Hazlo tu mismo". La manera sencilla es comprar un programador de PIC, que se conecte a tu PC, que trae un software con el que puedes programar el PIC. La "Hazlo t mismo" se trata de que construyas tu propio programador y utilices software gratuito de Internet y lo programes de ese modo.

Lo siguiente que necesitas es un ensamblador. Este convertir el programa que escribas en un formato que el PIC comprende. El mejor es del propio Microchip, llamado MPLAB. Es un programa de ventanas, que incluye un editor, un simulador y el ensamblador. Este es un software escrito por los propios fabricantes del PIC, y por encima de todo es gratuito !!!

Si escribes un ; (punto y coma) en cualquier punto de tu programa, el compilador ignorar cualquier cosa que haya detrs de l, hasta llegar al retorno de carro. Esto significa que podemos aadir comentarios a nuestro programa que nos recuerden que estbamos haciendo en ese punto. Esta es una buena prctica incluso para los programas ms sencillos. Ahora mismo puede que entiendas completamente qu es lo que hace tu programa, pero dentro de unos meses, puede que te acabes tirando de los pelos. Por tanto, utiliza comentarios donde puedas , no hay lmites.

Segundo, puedes asignar nombres a las constantes va los registros (hablaremos de estos ms adelante). Hace lo que ests escribiendo mucho ms sencillo de leer, para saber de que valor se trata, mas que intentar entender que significan todos esos nmeros. As que utiliza nombres reales como CONTADOR. Date cuenta de que hemos puesto el nombre en letras maysculas. Esto lo hace destacar, y tambin significa (por convencin) que se trata de una constante.

Tercero, aade algn tipo de cabecera en tus programas utilizando los punto y coma. Un ejemplo sera algo as:

Los Registros

Un registro es un lugar dentro del PIC que puede ser escrito, ledo o ambas cosas. Piensa en un registro como si fuese un trozo de papel donde tu puedes ver la informacin o escribirla. La figura de muestra el mapa de registros del interior del PIC16F84. RAM esttica SRAM: donde residen los Registros Especficos (SFR) con 24 posiciones de tamao byte, aunque dos de ellas no son operativas y los Registros de Propsito General (GPR) con 68 posiciones. La RAM del PIC16F84A se halla dividida en dos bancos (banco 0 y banco 1) de 128 bytes cada uno (7Fh).

La primera cosa que notars es que est dividido en dos - Banco 0 y Banco 1. El Banco 1 es utilizado para controlar las propias operaciones del PIC, por ejemplo para decirle al PIC cuales bits del Puerto A son entradas y cuales son salidas. El Banco 0 se utiliza para manipular los datos. Un ejemplo es el siguiente: Digamos que queremos poner un bit del puerto A a nivel alto. Lo primero que necesitamos hacer es ir al Banco 1 para poner ese bit o pin en particular en el puerto A como salida. Despus volvemos al Banco 0 y enviamos un 1 lgico a ese pin. Los registros que vamos a usar mas comunes en el Banco 1 son STATUS, TRISA y TRISB. El primero permite volver al Banco 0, TRISA nos permite establecer los pines que sern entradas y los que sern salidas del Puerto A, TRISB nos permite establecer los pines que sern entradas y los que sern salidas del puerto B.

STATUS Para cambiar del Banco 0 al Banco 1 utilizamos el registro STATUS. Hacemos esto poniendo el bit 5 del registro STATUS a 1. Para cambiar de nuevo al Banco 0, ponemos el bit 5 del registro STATUS a 0. El registro STATUS se localiza en la direccin 03h (la 'h' significa que el nmero es hexadecimal). Contiene el estado aritmtico de la ALU, el estado del Reset y los bits para seleccin de banco.

TRISA y TRISB Estn localizados en las direcciones 85h y 86h respectivamente. Para programar que un pin sea una salida o una entrada, simplemente enviamos un 0 o un 1 al bit en cuestin en el registro. Ahora, podemos hacer esto ya sea en binario o en hexadecimal. Si no ests familiarizado con el paso de binario a hexadecimal y viceversa, utiliza una calculadora cientfica. Entonces en el puerto A tenemos 5 pines, por tanto 5 bits. Si deseamos poner uno de los pines como entrada, enviamos un 1 al bit en cuestin. Si deseamos poner uno de los pines como salida, ponemos un 0 en ese bit. Los bits estn definidos de manera correspondiente con los pines, en otras palabras el bit 0 es el RA0, el bit 1 es el RA1, el bit 2 es el RA2, y as sucesivamente. Vamos a tomar un ejemplo. Si queremos poner RA0, RA3 y RA4 como salidas, y RA1 y RA2 como entradas, enviamos esto: 00110 (06h). Date cuenta de que el bit cero est a la derecha, como se muestra aqu:

PORTA y PORTB Para poner uno de nuestros pines de salida a nivel alto, simplemente ponemos un 1 el bit correspondiente en nuestro registro PORTA o PORTB. El formato es el mismo que para los registros TRISA y TRISB. Para leer si un pin est a nivel alto o nivel bajo en los pines de nuestro puerto, podemos ejecutar un chequeo para ver si el bit en particular correspondiente esta puesto a nivel alto (1) o est puesto a nivel bajo (0).

W El registro W es un registro de propsito general al cual le puedes asignar cualquier valor que desees. Una vez que has asignado un valor a ese registro, puedes sumarle cualquier otro valor, o moverlo. Si le asignas otro valor a W, su contenido es sobrescrito. En resumen, el registro W servir para guardar temporalmente un dato ledo de memoria, y lo usaremos como si del portapapeles del escritorio se tratase. Cuando copiamos algo (texto, un fichero o lo que sea), el contenido se guarda en el portapapeles, y cuando lo pegamos en su destino, este se copia y el contenido todava permanece en el portapapeles hasta que cortemos o copiemos otro objeto.

Un ejemplo de cdigo

Lo primero, necesitamos cambiar del banco 0 al banco 1. Hacemos esto modificando el registro STATUS, que est en la direccin 03h, poniendo el bit 5 a 1.

La instruccin BSF significa en ingles "Bit Set F" (Poner a 1 un bit de la Memoria). La letra F significa que vamos a utilizar una posicin de memoria, o un registro en memoria. Vamos a utilizar dos nmeros despus de esta instruccin - 03h, el cual se refiere a la direccin del registro STATUS, y el nmero 5 que corresponde al nmero de bit. Por tanto, lo que estamos diciendo es "pon a 1 el bit 5 de la direccin de memoria 03h".

Ahora ya estamos en el banco 1.

Estamos poniendo el valor binario 00110 (la letra 'b' significa que el nmero est en binario) en nuestro registro de propsito general W. Podramos haber hecho esto en hexadecimal, en cuyo caso nuestra instruccin hubiese sido:

Cualquiera de las dos funcionar. La instruccin MOVLW significa en ingles "Move Literal Value into W", en castellano, mover un valor literal directamente al registro W.

Ahora necesitamos poner este valor en el registro TRISA para configurar el puerto:

Esta instruccin significa "poner los contenidos de W en el registro cuya direccin viene a continuacin", en este caso la direccin 85h, que apunta a TRISA. Nuestro registro TRISA ahora tiene el valor 00110 o mostrado grficamente :

Ahora tenemos configurados los pines del Puerto A.

Esta instruccin hace lo contrario a BSF. Significa en ingles "Bit Clear F" (en castellano, poner a 0 un bit de la memoria). Los dos nmeros que le siguen son la direccin del registro, en este caso del registro STATUS, y el nmero de bit, es este caso el 5. As que lo que hemos hecho ahora es poner a 0 el bit 5 del registro STATUS. Ya estamos de vuelta en el Banco 0. Aqu est el cdigo en un solo bloque:

Nota: De momento ya hemos visto 4 instrucciones. Solo nos quedan 31 para terminar!

Cmo escribir en los puertos

Encender y apagar un LED Primero, pongamos el bit 2 del puerto A como salida:

Configuramos todos los pines del Puerto A como salidas, poniendo 0h en el registro tri-estado (TRISA). Para encender un LED, enviamos un 1 al pin donde esta conectado.

Para apagarlo

As que lo que hemos hecho ha sido encender y apagar el LED una vez. Lo que queremos es que el LED se encienda y se apague continuamente. Para hacer esto tenemos que volver al principio del programa. Para conseguir esto lo primero que hacemos es poner una etiqueta al comienzo de nuestro programa, y dicindole al programa que vaya a ese punto constantemente.

Definimos una etiqueta muy simple. Escribimos un nombre, digamos INICIO, entonces el cdigo queda:

Como se ve, primer decimos la palabra 'Inicio' justo al comienzo del programa. Despus, justo al final del programa decimos simplemente 'goto Inicio', ves a Inicio. La instruccin 'goto' significa en ingles 'ir a', y eso es lo que hace. Este programa encender y apagar el LED constantemente, desde el momento que le demos alimentacin al circuito, y se detendr cuando le quitemos la alimentacin.

observe que todo esta en instrucciones y nmeros ?

La instruccin "equ" simplemente significa que algo equivale a algo [Nota de la traduccin: "equ" viene del termino ingles "equivalence", en castellano "equivalencia"]. No es una instruccin del PIC, sino para el ensamblador. Con esta instruccin podemos asignar un nombre a la direccin de localizacin de un registro, o en trminos de programacin asignar una constante. Vamos a establecer algunas constantes para nuestro programa, y vers que sencillo es de leer.

Los valores constantes deben ser definidos antes de que se usen. Por eso se ponen siempre al comienzo del programa.

Bucles de Retardo

Pregunta Que inconveniente tiene el programa del LED parpadeante?

Existe un ligero inconveniente con el programa del LED parpadeante. Cada instruccin necesita un ciclo de reloj para ser completada. Si utilizamos un cristal de 4 Mhz, cada instruccin tardar 1/4 Mhz o 1 microsegundo en ser completada. Como solo estamos usando 5 instrucciones, el LED se encender y apagar en 5 microsegundos. Esto es demasiado rpido para que lo podamos ver, y parecer que el LED est permanentemente encendido. Lo que necesitamos hacer es introducir un retardo entre el momento de encendido y apagado y viceversa. El principio para retardo es el de contar hacia atrs desde un nmero previamente establecido y cuando llegue a cero, paramos de contar. El valor cero indica el fin del retardo y continuamos nuestro camino a travs del programa.

1. Definimos una constante que se usara como contador(CONTADOR). 2. Decidir el tamao del nmero desde el que contar. El nmero mayor que podemos tener es 255 o FFh en hexadecimal. Importante: la instruccin equ asigna una palabra a una localizacin de un registro. Esto significa que cualquiera que sea el nmero que asignemos a CONTADOR, ser igual al contenido de un registro.

Si lo probamos y asignamos el valor FFh, el compilador entender que estamos asignando la direccin de memoria FFh a la constante, y obtendremos un error cuando vayamos a compilar el programa. Esto es debido a que la localizacin FFh est reservada, y por tanto no podemos acceder a ella. As que, como hacemos para asignar un nmero real ?

Si asignamos a nuestro CONTADOR, por ejemplo, a la direccin 0Ch, este apuntar a un registro de propsito general. Las posiciones de memoria tienen un valor por defecto de FFh. De este modo, si CONTADOR apunta a 0Ch, tendr un valor de FFh la primera vez que lo pongamos en marcha. mover' un valor a esta posicin. Por ejemplo, si queremos que CONTADOR tenga un valor de 85h, no podemos decir 'CONTADOR equ 85h' porque esta es la localizacin del registro tri-estado del puerto A (TRISA).

As que lo primero definimos nuestra constante:

Disminuir este CONTADOR en 1 hasta que alcance cero.

Esta instruccin dice "resta 1 al registro (en esta caso CONTADOR). Si llegamos a cero, salta 2 lugares hacia delante"[Nota de la traduccin: El valor que le sigue a la coma, indica donde debe almacenarse el resultado de la operacin. Si es 1, como en el ejemplo anterior, el resultado se almacena en el mismo registro indicado en la instruccin, y si es 0 el resultado se almacena en el registro w.]

Lo que hemos hecho es primero poner nuestra constante CONTADOR a 255. La siguiente linea pone una etiqueta, llamada ETIQUETA seguida de nuestra instruccin decfsz. La instruccin decfsz CONTADOR,1 disminuye el valor de CONTADOR en 1, y almacena el resultado de vuelta en CONTADOR. Tambin comprueba si CONTADOR tiene un valor de 0. Si no lo tiene, hace que el programa salte a la siguiente linea. Aqu tenemos una instruccin de 'goto' que nos enva de vuelta a nuestra instruccin decfsz. Si el valor de CONTADOR es igual a cero, entonces la instruccin decfsz hace que el programa salte dos lugares hacia adelante, y se site donde hemos escrito "Continua por aqu". As que, como puedes ver, hemos hecho que el programa permanezca en un lugar durante un tiempo predeterminado antes de seguir adelante. Esto se llama bucle de retardo.

Subrutinas

Una subrutina es una seccin de cdigo o programa, que puede ser llamada como y cuando la necesites. Las subrutinas se usan si vas a ejecutar la misma funcin funcin ms de una vez, por ejemplo para crear un retardo. Las ventajas de utilizar una subrutina son que har ms sencillo modificar el valor una vez dentro de la subrutina,tambin te ayudar a reducir el total de memoria que ocupa tu programa dentro del PIC.

Primero tenemos que dar un nombre a la subrutina, y en este caso hemos elegido RUTINA. Despus escribimos el cdigo que queramos como hacemos normalmente. En este caso, hemos elegido el cdigo del retardo para el programa de parpadeo de nuestro LED. Finalmente, terminamos la subrutina tecleando la instruccin RETURN.

Vamos a ver esto con algo ms de detalle. Cuando alcanzamos la parte de nuestro programa que dice CALL xxx, donde xxx es el nombre de nuestra subrutina, el programa salta a donde quiera que resida la subrutina xxx. Las instrucciones dentro de la subrutina se ejecutan. Cuando se alcanza la instruccin RETURN, el programa salta de vuelta a nuestro programa principal, justo a la instruccin que va inmediatamente despus de nuestra instruccin CALL xxx.

Se puedes llamar a la misma subrutina tantas veces como quieras, esa es la razn por la que utilizar subrutinas reduce el tamao total de nuestro programa. Sin embargo, hay dos cosas que debes tener en cuenta. La primera, igual que en tu programa principal, cualquier constante debe ser declarada antes de utilizarla. Pueden ser declaradas dentro de la subrutina misma, o justo al comienzo del programa principal. Recomendaramos que declarases todo al comienzo del programa principal, para que as sepas que todo se encuentra en el mismo sitio. Lo segundo, te debes asegurar de que el programa principal pasa por alto la subrutina. Lo que queremos decir con esto es que si pones la subrutina justo al final del programa principal, a menos que uses una instruccin 'goto' para saltar la subrutina, el programa seguir y ejecutar la subrutina tanto si quieres como si no. El PIC no diferencia entre una subrutina y el programa principal.

Importante: Mediante el uso de la subrutina, hemos reducido el uso de memoria del PIC

Cmo leer de los puertos E/S

Hasta este punto, hemos estado escribiendo en el Puerto A para poder encender y apagar el LED. Ahora vamos a ver como podemos leer los pines de E/S de los puertos. Esto es para que podamos conectar un circuito externo y actuar sobre cualquier salida que este. Si recuerdan las clase vista para configurar los puertos de E/S, tenemos que cambiarnos del Banco 0 al Banco 1.

Ahora, para configurar el pin de un puerto para que sea una salida, enviamos un 0 al registro TRISA. Para poner el pin como entrada, ponemos un 1 en el registro TRISA.

Conmutador en ingles el trmino original es "switch"


Ahora hemos puesto el bit 0 del puerto A como entrada. Lo que necesitamos hacer ahora es comprobar si el pin est a nivel alto o a nivel bajo. Para ello, podemos usar una de estas dos instrucciones: BTFSC y BTFSS. La instruccin BTFSC significa "Haz una comprobacin de bit en el registro y bit que especificamos. Si es un 0, entonces sltate la siguiente instruccin". La instruccin BTFSS significa "Haz una comprobacin de bit en el registro y bit que especificamos. Si es un 1, entonces sltate la siguiente instruccin". La que usemos depender de como queramos que nuestro programa reaccione cuando lea la entrada. Por ejemplo, si simplemente estamos esperando que la entrada sea 1, entonces podramos utilizar la instruccin BTFSS de este modo:

El programa solo se mover hacia 'Continua por aqu' si el bit 0 del puerto A se pone a 1.

Lo que hemos hecho aqu es encender el LED. Despus comprobar si el conmutador est cerrado. Si est cerrado, entonces hacemos una llamada a nuestra subrutina de retardo. Esto nos da el mismo retardo que anteriormente, pero ahora la estamos llamando dos veces. Lo mismo pasa cuando el LED est apagado. Si el conmutador no est cerrado, entonces tenemos nuestros tiempos de encendido y apagado como antes.

Nota: ahora llevan aprendidas 10 de 35 instrucciones para el PIC 16F84 ! Y todas ellas las has aprendido simplemente con el encendiendo y apagando de un LED.

Hasta ahora hemos hecho que el PIC haga parpadear un LED. Despus fuimos capaces de interactuar con nuestro PIC aadiendo un conmutador, para modificar el ritmo de parpadeo. El nico problema es que el programa es muy largo y desperdicia mucha memoria. Era aceptable ya que introducamos comandos por primera vez.

Examinamos como estbamos haciendo el parpadeo del LED realmente.

Primero cargamos nuestro registro w con 02h, despus lo pusimos en nuestro registro del puerto A para encender el LED. Para apagarlo, cargamos w con 00h y despus lo pusimos en nuestro registro del puerto A. Entremedias de estas rutinas tenamos que llamar a una subrutina para que pudiramos ver el LED parpadear. As que hemos tenido que mover dos conjuntos de datos dos veces (una vez al registro w y despus al PORTA) y llamar a la subrutina dos veces (una vez para el encendido y otra para el apagado).

XORWF

Instruccin XORWF ejecuta una funcin OR Exclusiva entre el registro w y el registro que le pasamos como dato. Si tenemos dos entradas, y una salida, la salida solo ser 1 si, y solo si, las dos entradas son diferentes. Si son iguales, la salida ser 0. la tabla de verdad: A 0 0 1 1 B 0 1 0 1 Salida 0 1 1 0

Si mantenemos el valor de A igual a 1, y hacemos OR exclusiva entre l y el valor de la salida anterior, la salida resultante conmuta. Para los que no lo vean de este modo en la tabla de verdad, aqu est utilizando binario: Valor de salida actual => 0 OR-Ex con l y con 1 => 1 ; 1 es el nuevo valor de salida. OR-EX con l y con 1 => 0 ; 0 es el nuevo valor de salida. OR-Ex con l y con 1 => 1 ; 1 es el nuevo valor de salida. .... as sucesivamente.

Lo que estamos haciendo aqu es cargar nuestro registro w con 02h. Despus le hacemos una OR exclusiva a este nmero que hay en w con lo que quiera que est en nuestro registro del puerto A. Si el bit 1 es 1, cambiar a 0. Si el bit 1 es 0, cambiar a 1. [Nota de la traduccin: El nmero que va despus del registro especificado en la instruccin XORWF, indica donde debe de ser almacenado el resultado de dicha operacin OR exclusiva. Si, como ocurre en este ejemplo anterior, ponemos un 1, el resultado se almacenar de vuelta en el registro de memoria especificado. Si ponemos un 0, el resultado de la operacin OR exclusiva se almacenara en el registro w]

PORTA 00010 xorwf 00000 xorwf 00010 xorwf 00000 xorwf 00010

w 00010

Operadores Lgicos y Aritmticos

AND La funcin AND simplemente compara dos bits y produce un 1 si son iguales, y 0 si son diferentes. Por ejemplo, si decimos 1 AND 1, el resultado es 1, mientras que si decimos 1 AND 0 el resultado ser 0. Por supuesto, podemos comparar palabras (o bytes) tambin, y la funcin AND hace esta comparacin de ambas bit a bit. El ejemplo de ms abajo muestra dos palabras de 8 bits a las que se aplica AND con el siguiente resultado: 11001011 AND 10110011 Igual a 10000011

tabla de verdad de esta funcin A 0 0 1 1 B 0 1 0 1 Resultado de AND 1 0 0 1

El PIC nos da dos modalidades para AND. Estas son ANDLW y ANDWF.

ANDLW nos permite hacer una funcin AND con los contenidos del registro W, y un nmero que nosotros especifiquemos. Las sintaxis es: ANDLW <nmero> ; donde <nmero> es con el que haremos AND a los contenidos de W. El resultado de la funcin AND sern almacenamos de vuelta en el registro W. [Nota de la traduccin: El valor de <nmero> tiene que estar comprendido entre 0 y 255]]

ANDWF nos permite hacer una funcin AND con los contenidos del registro W y otro registro, como por ejemplo un puerto. Las sintaxis es: ANDWF <registro>,d ; donde <registro> es el registro en el que estamos interesados, por ejemplo PORTA, y d dice al PIC donde almacenar el resultado. Si d=0, el resultado se almacena en el registro W, y si d=1 el resultado se almacena en ese registro especificado.

OR Ya vimos una funcin OR, llamada XOR. Esta produce un 1 si dos bits son diferentes, pero no si son iguales. Hay una segunda funcin OR llamada IOR, la cual es OR inclusiva. La funcin produce un 1 si cualquiera de los dos bits es 1, pero tambin si ambos bits son 1. tabla de verdad A B Resultado de OR 0 0 0 0 1 1 1 0 1 1 1 1

ADD Esta funcin exactamente lo que dice [Nota de la traduccin: "Add" en ingles significa sumar] Suma dos nmeros! Si el resultado de sumar dos nmeros excede de 8 bits [Nota de la traduccin: 8 bits pueden contener un valor mximo de 255 en decimal], entonces se activar un flag llamado CARRY [Nota de la traduccin: "flag" en castellano se podra traducir por bandern, y normalmente se trata de 1 bit que se ubica en un registro en concreto de la memoria del PIC. "CARRY" en castellano puede traducirse como "llevar", podra ser como cuando hacemos una cuenta a mano y utilizamos la expresin "me llevo una".]. El flag de CARRY est localizado en el bit 0 de la direccin de memoria 03h. Si este bit se activa, quiere decir que la suma de esos 2 nmeros excedi de 8 bits. Si es 0, entonces el resultado queda dentro de los 8 bits. De nuevo, el PIC nos da dos modalidades de ADD, que son ADDLW y ADDWF. Como puedes suponer, es muy similar a la funcin anterior.

Potrebbero piacerti anche