LENGUAJE ENSAMBLADOR

47
 Ensamblador desde cero Microcontroladores PIC Este tutorial introduce al lector en el conocimiento sobre las instrucciones de los microcontroladores de la firma de Microchip. Podrás aprender cada una de las instrucciones paso a paso y adquirir conocimiento para que sea capaz desarrollar tus propios programas, a la vez, sirve de manual de referencia tanto para aficionados, profesionales o estudiantes. 2009 Leon Pic  www.ucontrol.com.ar 18/03/2009

Transcript of LENGUAJE ENSAMBLADOR

  • Ensamblador desde cero Microcontroladores PIC Este tutorial introduce al lector en el conocimiento sobre las instrucciones de los microcontroladores de la firma de Microchip. Podrs aprender cada una de las instrucciones paso a paso y adquirir conocimiento para que sea capaz desarrollar tus propios programas, a la vez, sirve de manual de referencia tanto para aficionados, profesionales o estudiantes.

    2009

    Leon Pic www.ucontrol.com.ar

    18/03/2009

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 2

    ASM desde 0 (ASM desde cero)

    He comenzado a realiza un tutorial de ASM y lo voy a poner aqu tambin.

    A pesar que mucho le escapan a este lenguaje, hay otros que nos sentimos cmodos con

    l .

    --------------------------------------------------------------------------

    Lo primero que hay que saber para este lenguaje, es que cada lnea de cdigo, es una

    instruccin que realiza el CP o un paso que realiza el CP. A diferencia de otros lenguajes,

    como por ejemplo el C, una lnea de instruccin, puede llevar uno o ms pasos que el CP

    debe realizar. Ms adelante entendern el porqu.

    A esto ltimo dicho, nos explica el porqu de un programa escrito en ASM (assembler) lleva

    menos lnea de instruccin que el mismo programa realizado en otro lenguaje. Esto se

    traduce que, cuanto menos lneas de cdigo, menor consumo de la memoria de programa.

    Nota: Entendemos por el mismo cdigo, al realizar un software para realizar una dicha

    tarea. Una tarea que debe realizar nuestro microcontrolador, puede ser escrito en diferentes

    lenguajes, y es el programa que se utiliz quien lo traduce a formato hex (1 y 0).

    Ahora, Qu es el CP?

    El CP o PC es el Contador de Programa. Es el encargado de leer cada instruccin y realizar la

    accin solicitada por el software.

    Para dar un ejemplo un poco ms claro, digamos que el CP, es una persona. Esta persona se

    le da un papel que tiene diferentes tareas a realizar. Estas tareas, estn una debajo de la

    otra y lee lnea por lnea y hace lo que le dice esa lnea. Cada lnea, posee una instruccin

    que se debe hacer. Cuando termin de hacer esa instruccin, continua con la lnea de abajo.

    Supongamos que tenemos un papel que dice:

    Levantar la mano izquierda.

    Bajar la mano izquierda.

    Saltar tres veces en el mismo lugar.

    Levantar la mano derecha.

    Saltar una vez en el mismo lugar.

    Bajar la mano derecha.

    El CP, har esas tareas sin negarse y lo har fielmente a lo que est escrito. Por lo que, si

    hace una tarea mal, es porque le pusimos una o ms instrucciones mal.

    Si bien, el CP har lo que nosotros le pidamos, el CP nos pide que respetemos algunas cosas.

    Estas cosas, dependern de cada microcontrolador y que debemos saber para poder

    programar en forma correcta al PIC.

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 3

    Cmo es la estructura del lenguaje ASM?

    Es muy fcil, posee 4 columnas bien diferenciadas y que no es problema acordarce.

    * La primer columna se llama ETIQUETA y sirve para darle el nombre a una pocicin de la

    memoria del programa al que se necesita apuntar. Los que no se den cuenta, ya lo haran.

    * La segunda columna, se llama INSTRUCCIN y lo que justamente hace, es una

    instruccin a realizar por el CP.

    * La tercera columna, se llama OPERANDO y es el operando de una instruccin, o sea, de la

    segunda columna. Hay instrucciones que no tienen operando y las veremos ms adelante.

    * Y la cuarta columna, se llama OBSERVACIONES y sirve solo para el programador, o sea,

    el usuario que est programando el PIC. En otras palabras, a nosotros. Siempre comienza

    con ; (punto y coma)

    Si no sirve para el PIC, Para qu complicarla ms? Todo lo contrario, es para ayudar al

    programador de que no se olvide que intent hacer.

    Todos los lenguajes, desde los ms bsicos, hasta los ms avanzados, tienen esta

    caractersticas ya que en el, pondremos que es lo que queremos hacer o explicar el

    programa.

    Si bien, estas observaciones se utilizan en la cuarta columna, no es obligacin colocarla en

    esta columna, si no que puede ir al margen de la planilla en dnde estamos programando. Y

    es aqu dnde explicaremos la porcin de una rutina para entenderlo ms adelante.

    Bien, veremos a continuacin, como se escriben las columnas:

    ETIQUETAS INSTRUCCIN OPERANDO ;OBSERVACIONES

    O, podemos verlo as:

    ;OBSERVACIONES

    ;OBSERVACIONES

    ;OBSERVACIONES (y la cantidad que necesitemos)

    ETIQUETAS INSTRUCCIN OPERANDO ;OBSERVACIONES

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 4

    Antes de empezar a ver las instrucciones, debemos concentrarnos en los registros.

    Qu son los registros?

    Los registros, son posiciones de memoria el cual se utilizan para ir configurando el pic

    mientras se corre el programa, cambiar de bancos para acceder a otras partes de memorias,

    son banderas que nos van diciendo que est pasando con distintas operaciones, son

    habilitaciones o deshabilitaciones para mdulos que trae el PIC. Por ejemplo, conversor

    Analgico/Digital, PWM.

    Estos registros, tienen una ancho de bit de acuerdo al PIC, que hay de 8 bit, 16 bit y 32 bit.

    Excepto la palabra configuracin y que la veremos mas adelante. El tamao de los registro

    depende del tipo de microcontrolador.

    Cada registro, posee un nombre, y cada bit o un grupo de bit, se puede utilizar para lo

    descripto anteriormente (habilitar/deshabilitar, etc).

    A continuacin, ver el archivo adjunto. Es la posicin de la RAM y sus 4 bancos. Este, es del

    PIC16F877

    Como notarn, en las cuatro columnas, hay nombres. Estos nombres son todos los registros

    que posee este PIC. Vern que hay registros que se repiten. No quiere decir que estn

    duplicados, triplicados o cuatriplicados, si no que se puede acceder a ellos no importa en que

    banco estemos trabajando. (Ya lo entendern, no se preocupen).

    Cada vez que se programe el PIC y se necesite trabajar con uno de estos registros, se debe

    acceder al banco que est dicho nombre. Es por eso, que esta tabla es muy importante a la

    hora de trabajar.

    Aprovechando que sub esta tabla del pic, cuando de ejemplo de programacin, ser sobre

    este pic.

    Microchip provee en forma gratuita estos datasheet. Y hay uno por cada PIC. Por lo que si no

    tienen este datasheet, descrgenlo de la pgina de Microchip. Cuando empecemos a

    programar, lo necesitarn.

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 5

    Uno de los registros muy utilizado, es el registro de trabajo W, el cual, se utiliza para

    mover un dato/valor de un registro a otro, cargar valores en un registro, y con la ayuda

    de la ALU puede hacer operaciones matemticas.

    Observen con atencin el diagrama de bloque dnde se encuentra W que est adjuntado.

    Ahora bien, si W es un registro, dnde est ubicado, ya que en el mapa de memoria no lo

    encuentro?

    El registro W no est implementado en la memoria ram en la posicin 0x00 ni en otra

    posicin. W es un registro independiente que tiene un bus directo con la ALU (un

    camino privado). La ALU es la nica entidad que puede leer o escribir este registro de

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 6

    trabajo.

    El direccionamiento indirecto hace uso de los registros FSR e INDF. INDF es

    completamente ajeno a W. Un direccionamiento indirecto usa el registro FSR como

    apuntador al contenido de otros registros. Cualquier instruccin que hace uso de INDF

    (0x00) como direccin invoca un direccionamiento indirecto.

    Los microcontroladores PIC, poseen tres tipos de memorias.

    * Memoria de Programa

    Es la ubicacin fsica dnde se guarda el firmware que hemos creado, o sea, nuestro

    programa. Y tiene un ciclo de 100.000 de lectura y/o escrituras antes de estropearse y es

    del tipo FLASH (pero este es flaco :mrgreen: Es un chiste).

    * Memoria de datos de uso general

    Es la memoria RAM del PIC. Recordemos, que los registros estn sobre la memoria RAM

    y la memoria de uso general, comienza despus de los registros.

    * Memoria de datos EEPROM

    Es la memoria EEPROM que puede almacenar datos mas de 40 aos sin energa y

    1.000.000 de ciclos de escritura y lectura

    El PIC 16F877, tiene una memoria de programa de 8Kb por un ancho de 14 Bits, o sea que

    cada posicin de memoria tiene 14 bit (B'11111111111111', o H'3FFF') Cada lnea de instruccin

    ocupa una posicin en la memoria de programa, as que, podemos poner hasta 8.192

    instrucciones.

    La RAM de uso general (mas los registros) trae 368 bytes con un ancho de 8 bit (B'11111111',

    o H'FF'). Esto quiere decir, que tenemos 368 posiciones para nuestro uso.

    La EEPROM trae 256 bytes con un ancho de 8 bits. Tenemos 256 posiciones para nuestro

    uso.

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 7

    Ahora, vamos a estudiar el registro STATUS y luego continuaremos con las

    instrucciones.

    Registro STATUS

    Si entendieron hasta ac, se acordar que los registros poseen un ancho de 8 bit. Cada

    bit, puede contener un 1 o 0.

    Vemos ahora en detalle el registro STATUS (est adjuntado)

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 8

    Este registro, tiene 3 Bit dedicado para las operaciones matemticas, 3 bit dedicado al

    cambio de banco de memoria y 2 bit dedicado para saber que o quin produjo un Power

    Up (despertar del micro). Y se puede leer y escribir en l (cambiar datos).

    Los analizamos desde el ms significativo (MSB) hasta el menos significativo (LSB).

    BIT 7:

    Se llama IRP y sirve para el direccionamiento indirecto para cambiar el banco de

    memoria.

    1 = Banco 2 y 3

    0 = Banco 0 y 1

    BIT 6 y BIT 5

    Se llaman RP1 y RP0 respectivamente. Sirve para el direccionamiento directo para

    cambiar de banco de memoria.

    00 = Banco 0

    01 = Banco 1

    10 = Banco 2

    11 = banco 3

    BIT 4

    Se llama TO (neg). Este bit se utiliza para saber quin despert al PIC.

    1 = Despus que despierta (power up) o por las instrucciones CLRWDT o SLEEP, se pone

    a 1 este bit.

    0 = Se pone a 0 cuando el wachtdog o en castellano perro guardin (WDT) despierta al

    PIC.

    BIT 3

    Se llama PD (neg). Este bit se utiliza para saber si el pic estaba durmiendo.

    1 = Despus de que despierta (power up) o por la instruccin CLRWDT, se pone a 1

    0 = Se pone a 0 cuando se ejecuta la instruccin SLEEP

    BIT 2

    Se llama Z y al igual que los dos bytes anteriores, es una bandera. Nos indica el resultado

    de una operacin aritmtica y lgica.

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 9

    1 = La operacin aritmtica o lgica dio como resultado 0

    0 = La operacin aritmtica o lgica no dio como resultado 0

    BIT 1

    Se llama DC. Digit carry/borrow (dgito llevar/prestar). Es afectado por las instrucciones

    ADDWF; ADDLW; SUBLW; SUBWF (Para la resta, la polaridad es inversa).

    1 = Hubo un acarreo del 4to bit menos significativo al 5to bit.

    0 = No hubo un acarreo del 4to bit menos significativo al 5to bit.

    BIT 0

    Se llama C carry/borrow. Es afectado por las mismas instrucciones que afectan al bit DC.

    1 = Hubo un acareo del bit ms significativo (Bit 7) o sea cuando se excede de H'FF'

    0 = No hubo acareo del bit ms significativo

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 10

    Breve introduccin de las INSTRUCCIONES

    Cada instruccin tiene una ancho de 14 Bits, es por eso que la memoria de programa

    tiene el mismo ancho. Justamente para poder alojar cada instruccin.

    Las instrucciones, estn divididas en tres grupos. Los cuales son:

    Byte-Oriented operation (Byte-Orientando a la operacin)

    Bit-Oriented operation (Bit-Orientando a la operacin)

    Literal and Control operation (Control y Literal de la operacin)

    Primer grupo Byte-Oriented operation

    Cada instruccin de este grupo est compuesta por:

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 11

    OPCODE (Cdigo)

    DESTINATION (Destino)

    FILE REGISTER ADDRESS (Direccin del archivo de registro)

    El OPCODE o cdigo, es el cdigo de cada instruccin y que es nica para cada

    instruccin. Est formada por los bit del 13 al 8.

    El DESTINATION o el destino, indica en dnde se va a guardar el dato. Por ejemplo, si

    hacemos una suma, tenemos dos opciones dnde guardarlo, una puede ser el registro W

    y la otra opcin puede ser otro registro cualquiera o una posicin de la RAM. Est

    formada por el bit 7.

    La constante que nos indica esto es la letra d. Si esta letra es 0, la operacin se guardar

    en el registro W. EN cambio si vale 1, la operacin se guardar en el registro o posicin

    de memoria que estemos trabajando al momento de usar una instruccin.

    Hay instrucciones, como veremos ms adelante, que no es necesario indicar dnde

    queremos guardar la operacin, ya que se hace en forma automtica. Y hay otras

    instrucciones que si no se indica el destino, nos puede dar un error al compilar o el

    compilador lo elegir el y por ende, nos puede ejecutar mal el programa.

    Y por ltimo, tenemos el FILE REGISTER ADDRESS que se carga con la direccin

    del registro a ser guardado. Est formada por los bit 6 al 0. La constante que nos indica

    esto, es la letra f

    Segundo grupo Bit-Oriented operation

    Cada instruccin de este grupo est compuesta por:

    OPCODE (Cdigo)

    BIT ADDRESS (Bit de direccin)

    FILE REGISTER ADDRESS (Direccin del archivo de registro)

    OPCODE es igual al primer grupo. Est formado por los bits 13 al 10.

    El BIT ADDRESS, se utiliza para direccionar la operacin. Est formado por los bits 9

    al 7. Como pueden observar, se sacrific bit del opcode para drselo al bit address. La

    constante que nos indica esto es la letra b

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 12

    Y por ltimo tenemos FILE REGISTER ADDRESS, que es igual al primer grupo. Est

    formado por los bit 6 al 0. Igual que en el primer grupo. la constante que nos indica esto

    es la letra f.

    Tercer grupo Literal and Control

    Cada instruccin de este grupo, est compuesta por:

    OPCODE

    LITERAL

    OPCODE es igual que en el primer grupo. Est compuesta por los bits 13 al 8. Excepto

    para las instrucciones CALL y GOTO que est compuesta por los bit 13 al 11 (prestar

    mucha atencin a esto, cuando veamos estas dos instrucciones entendern la

    importancia).

    Y el LITERAL que puede ser un valor, por ejemplo para sumar, para restar, para cargar

    al registro W, en fin, un nmero decimal, binario o hexadecimal. O puede ser un valor

    de direccin a dnde apuntar para las instrucciones CALL y GOTO.

    Est compuesta por los bits 7 al 0. Excepto para las instrucciones CALL y GOTO que

    est compuesta por los bit 10 al 0 (prestar mucha atencin a esto, cuando veamos estas

    dos instrucciones entendern la importancia).

    Est adjuntado las 35 instrucciones agrupadas por los tres grupos

    Si alcanzan a ver en la imagen, vern que algunas instrucciones afectan al registro

    STATUS y otras no.

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 13

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 14

    Las instrucciones

    Les voy a arruinar el momento de alegra. Las instrucciones hay que estudiarlas de

    memoria. Si, leyeron bien, de memoria. Lo que tienen que saber sobre las instrucciones,

    es como se escriben, que hace cada instruccin y lo ms importante que bit del

    REGISTRO afecta.

    Vamos a ir vindolo por orden alfabtico. Y otra cosita ms, como es de esperarse, estn

    en INGLES o son abreviaturas pero en INGLES.

    Recordemos que: .123 o D'123' es en decimal; 0x7B o 7Bh o H'7B' es en Hexadecimal;

    B'01111011' es en binario.

    ADDLW

    Suma un valor designado por el programador al registro W

    Ejemplo ADDLW .128

    Si W tena cargado un valor = .5, despus de la instruccin W tiene cargado el valor .133

    Para recordar, ADD es sumar, L es Literal y W es el registro W

    Afecta a:

    Z Se pone a 1 si la operacin es 0

    DC Se pone a 1 si hubo un acarreo del bit 3 al 4

    C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'

    ADDWF

    Suma el valor del registro W con el valor de un registro cualquiera. El destino de esta

    suma, lo elige el programador.

    Ejemplo: ADDWF TEMP,W

    Si W tena guardado .133 y la posicin de la RAM llamada TEMP tena el valor cargado

    con .2, W vale .135 y TEMP contina valiendo .2

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 15

    Ahora si hubiera puesto as: ADDWF TEMP,F

    TEMP valdra .135 y W valdra .133

    Para recordar, F, es File Register Address.

    NOTA: Para indicar la direccin de dnde se guarda, tambin se puede poner 0 o 1 en vez

    de W o F. 0, corresponder guardarlo en el registro W y 1 en el registro TEMP (para este

    caso).

    Afecta a:

    Z Se pone a 1 si la operacin es 0

    DC Se pone a 1 si hubo un acarreo del bit 3 al 4

    C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'

    ANDWF

    Realiza la operacin AND entre W y un registro designado por el programador. El

    destino de esta operacin lo elije el programador.

    Ejemplo: ANDWF TEMP,F

    Si antes de la instruccin W vale B'11100011' y TEMP vale B'00111010' Despus de la

    instruccin TEMP vale B'00100010' y W vale B'11100011'

    Afecta a:

    Z Se pone a 1 si la operacin es 0

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 16

    BCF

    Pone a 0 el bit de un registro. El bit debe ser indicado por el programador.

    Ejemplo: BCF TEMP,2

    Antes de la instruccin TEMP vale B'11111111'. Despus de la instruccin TEMP vale

    B'11111011'

    Para recordar, Bit Clear es borrar File es archivo o registro

    No afecta ningn bit del registro Status.

    BSF

    Pone a 1 el bit de un registro. El bit debe ser indicado por el programador.

    Ejemplo: BSF TEMP,0

    Antes de la instruccin TEMP vale B'01110110'. Despus de la instruccin TEMP vale

    B'01110111'

    Para recordar, Bit Set es poner a 1 File Archivo o registro

    No afecta a ningn Bit del registro Status.

    BTFSC

    Salta un lnea si el bit de un registro es cero. El bit debe ser indicado por el programador.

    Ejemplo: BTFSC TEMP,5

    BCF PORTA,0

    BSF PORTB,0

    Caso 1:

    TEMP vale B'00011110'. El CP analizar solo el Bit 5 del registro TEMP, como es 0, salta la

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 17

    instruccin BCF PORTA,0 y ejecuta la siguiente lnea que es BSF PORTB,0 y continua

    haciendo la instruccin.

    Caso 2:

    TEMP vale B'00111000'. El CP analizar solo el Bit 5 del registro TEMP, como es 1 no salta

    la instruccin y har la instruccin BCF PORTA,0 y luego continua con la instruccin

    BSF PORTB,0

    Para recordar Bit Test es chequear File Skip es salto Clear

    No afecta a ningn Bit del registro Status.

    BTFSS

    Salta una lnea si el bit de un registro es 1. EL bit debe ser indicado por el programador.

    Ejemplo: BTFSS TEMP,3

    ADDWF PORTC

    ANDWF NODO

    Caso 1:

    TEMP vale B'01101100'. El CP analizar solo el Bit 3 del registro TEMP, como es 1, salta la

    instruccin ADD PORTC y ejecuta la siguiente lnea que es ANDWF NODO y continua

    haciendo la instruccin.

    Caso 2:

    TEMP vale B'11110000'. El CP analizar solo el Bit 3 del registro TEMP, como es 0 no salta

    la instruccin y har la instruccin ADD PORTC y luego contina con la instruccin

    AND NODO.

    Para recordar Bit Test es chequear File Skip es salto Set

    No afecta a ningn Bit del registro Status.

    Normalmente, continuando las instrucciones BTFSS y/o BTFSC va un GOTO o CALL

    pero no la he puesto porque an no se explicaron estas instrucciones.

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 18

    CALL

    Se dirige a una direccin de la memoria de programa designado por el programador. En

    otras palabras, se utiliza para dirigirse a una rutina o tarea. Su principal ventaja es que

    una vez que finaliz la tarea, vuelve al punto siguiente desde dnde se llamo.

    Ejemplo : CALL ESC_PORTB

    Para recordar, CALL es llamada.

    No afecta ningn bit del registro Status.

    -----------------------------------------------------------------------------------------------------------

    -------------------

    Hacemos una excepcin con respecto a ver las instrucciones por orden alfabtico y

    veremos la instruccin GOTO.

    -----------------------------------------------------------------------------------------------------------

    -------------------

    GOTO

    Se dirige a una direccin de la memoria de programa designado por el programador. En

    otras palabras, se utiliza para saltar instrucciones que no queremos que se ejecuten. A

    diferencia de la instruccin CALL, no hay forma de volver cuando se ejecuta la

    instruccin.

    Ejemplo: GOTO INICIO

    Para recordar GO TO es ir a.

    No afecta a ningn bit del registro Status.

    Extendiendo la explicacin.

    Vamos a hablar del PC para entender bien sobre estas instrucciones. La excelente

    explicacin que continua, por desgracia no es ma (ojal fuera mi explicacin), son de las

    personas Maunix y BrunoF (del foro todopic)

    En la siguiente imagen, vemos el diagrama de bloques del PC o CP.

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 19

    El PC es de 13 bits en este caso (8kwords). 14 son los bits de cada "word" o instruccin

    que se graban en cada posicin de la FLASH (memoria de programa).

    El PC se reparte en: sus 8 bits de menor peso en el registro PCL, y los 5 restantes en el

    registro PCLATH.

    Los pics al tener un set de instrucciones reducido no puede en una sola instruccin

    meter todos los bits necesarios para direccionar toda su memoria.

    EL program counter son 2 registros, el PChigh y PCLow . Cuando haces un CALL o un

    GOTO, solo se rellenan 11 bits (los 8 del PClow y 3 del PChigh) y los restantes 2 las

    rellenas con el PCLATH (para completar los 13bits).

    El STACK (pila) tiene toda la direccin, no solo parcial. Si haces un call desde la pagina 0

    a la pgina 3 y luego un return el cdigo SI volver a la pgina 0, pero el PCLATH sigue

    apuntando a la pgina 3, entonces si usas otro goto o call, debes tener en cuenta de

    modificar el PCLATH.

    Entonces, dijimos que:

    El PC = ProgramCounter o CP = Contador de Programa, tiene 13 bits; del 0 al 12.

    Al ejecutar un call o un goto, se copian del 0 al 10, y los otros 2 bits se copian del registro

    PCLATH. El pclath solo estar all para esa situacin.

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 20

    En un return o retfie la microelectrnica del PIC, pega la direccin del PC que estaba

    guardada.

    Lo vemos con un ejemplo

    1.

    STACK = vaco

    PC = 0x00A0

    PCLATH = 0b000011000

    Ejecutas un CALL 0x230

    2. El STACK tiene en su posicin 0 la direccin 0x00A0.

    PC = 111000110000

    3. Se ejecuta la subrutina y en ese punto el PC ya qued en

    PC = 111000110111

    4. Viene un RETURN.

    La microelectrnica del PIC copiar el stack tal cual en el program counter + 1

    Valor STACK 0x00A0 + 1 --> PC = 0x00A1

    5. EL cdigo sigue ejecutndose en la pgina 0 pero hay que tener en cuenta que el

    PCLATH apunta a la pgina 3 por ello si hars otro CALL o GOTO, debers cambiar de

    nuevo el PCLATH si la subrutina no est en la pgina 3.

    Para cerrar el tema

    Vamos a entrar a todo detalle en el Program Counter(PC) para que se vayan todas las

    dudas ya que es muy importante. Vayamos al tema tema del PC, computed goto(lo que

    algunos llaman "tabla"), call, returns y goto.

    El Program Counter(PC) est conformado en esta familia de uC(y refirindonos a la

    familia 16F, las otras poseen ms o menos bits implementados) por 13 bits repartidos

    entre dos registros: PCH y PCL.

    El PCL es legible/escribible directamente a travs del registro fsico PCL (valga la

    redundancia). En cambio, el PCH no es directamente accesible. No puede ser ledo, y

    slo puede se grabado mediante un buffer que contiene el valor temporalmente (oh! aqu

    aparece nuestro famoso PCLATH). Entonces, recordar: El PCLATH es slo un buffer

    temporal que almacena los 5 bits de mayor peso del PC para ser escritos cuando se

    ejecute una instruccin que lo requiera.

    Ahora, hay dos situaciones posibles en las que el PC debe ser cargado de manera distinta:

    una es cuando queremos trabajar con tablas y otra cuando realizamos un call o un goto

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 21

    que no est en el mismo banco.

    1era situacin: Tabla (Comuted Goto)

    La tabla es una situacin de uso del PC en la que se afecta directamente al registro PCL.

    Cuando se afecte directamente al PCL mediante una instruccin, es necesario que el

    usuario asegure que PCLATH tenga sus 5 bits pre-cargados adecuadamente.

    Hago un ejemplo:

    Mal:

    org 0x000

    movlw 0x01

    call tabla

    org 0x300

    tabla

    addwf PCL,F

    retlw 0x03

    retlw 0x01

    retlw 0x0F

    .....

    Bien:

    org 0x000

    movlw 0x03

    movwf PCLATH

    movlw 0x01

    call tabla

    org 0x300

    tabla

    addwf PCL,F

    retlw 0x03

    retlw 0x01

    retlw 0x0F

    .....

    Mejor:

    org 0x000

    pageselw tabla

    movlw 0x01

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 22

    call tabla

    org 0x300

    tabla

    addwf PCL,F

    retlw 0x03

    retlw 0x01

    retlw 0x0F

    .....

    Pageselw es una instruccin del MPASM que genera dos instrucciones: un movlw literal

    y un movwf PCLATH. El valor del literal es automticamente seleccionado por el

    ensamblador segn la etiqueta(o posicin de memoria) que se le especifique. En el caso

    anterior pageselw tabla generara estas dos instrucciones:

    movlw 0x03

    movwf PCLATH

    Si no aseguramos que los 5 bits del PCLATH estn correctamente seteados al momento

    de afectar al PCL mediante alguna instruccin (generalmente es la addwf, pero puede

    usarse subwf y muchas otras) entonces el programa saltar a una posicin indeseada.

    2da situacin: CALL y GOTO

    En esta familia de uC, cada instruccin es codificada en 14 bits. En el caso de las

    instrucciones CALL y GOTO, su estructura es la siguiente:

    F2 F1 F0 K10 K9 K8 K7 K6 K5 K4 K3 K2 K1 K0

    Donde las F indican cul instruccin es la que debe ejecutarse (100 para la CALL 101 para

    la GOTO), y las k corresponden a la direccin a la cual queremos llamar (con un CALL) o

    saltar(con un GOTO).

    Aqu se ve claramente un problema. Podemos ver que un CALL o un GOTO slo

    almacena 11 bits de la direccin a la cual debe ir. 11 bits es un mximo 2048 posiciones.

    Qu pasa cuando un C posee ms de 2k de memoria Flash entonces? Por ejemplo, un

    16F877A posee 8k de memoria Flash. Cmo hara para llamar a una subrutina que est

    ms all de la posicin 2047 de la flash?

    La solucin nuevamente se encuentra en el PCLATH (y es nuevamente el usuario el que

    tiene el deber de pre-cargar el valor adecuado).

    Entonces, dijimos que el PC contiene 13 bits de longitud. 13 bits son hasta 8kwords (una

    word es en esta familia un conjunto de 14 bits que conforman una instruccin la cual se

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 23

    aloja en la memoria FLASH del C). Un CALL o un GOTO slo contienen los 11 bits de

    menor peso de la direccin a la cual ir, por lo que los 2 bits restantes debern ser pre-

    cargados en los bits 4 y 3 del registro PCLATH por el usuario programador.

    Cuando se ejecuta una instruccin CALL o GOTO, es imprescindible que el registro

    PCLATH est correctamente precargado. La instruccin a la que el C ir estar

    conformada por 13 bits y ellos sern:

    PCLATH,4 PCLATH,3 K10 K9 K8 K7 K6 K5 K4 K3 K2 K1 K0

    Cabe mencionar que el C carga a PC con el valor pasado por los 11 bits de K, y a

    PC con el valor de los bits PCLATH. El registro PCLATH no es modificado de

    ninguna manera. Slo se leen esos dos bits.

    Por ejemplo, en un C de 8kWords hay 4 pginas. Una pgina cada 2048 words. Si se est

    en una pgina y se quiere ir a otro es necesario precargar antes dichos bits del PCLATH

    para poder hacerlo.

    El usuario no debe preocuparse por precargar el PCLATH en dos situaciones:

    Si el C no posee ms de 2kWords de memoria Flash;

    O si en el cdigo creado por el usuario, no se utiliza la memoria FLASH ms all de la

    posicin 2047(0x7FF).

    Si ocurre al menos uno de esos dos casos, es suficiente con asegurar que los bits

    PCLATH se encuentren ambos en cero.

    Vamos con un par de ejemplos:

    Mal:

    org 0x000 ;Esto es pgina0

    call cruzo

    org 0x800 ;Esto ya es el pgina1

    cruzo

    retlw 0xFF

    .....

    Bien:

    org 0x000 ;Esto es pgina0

    movlw 0x08

    movwf PCLATH

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 24

    call cruzo

    org 0x800 ;Esto ya es el pgina1

    cruzo

    retlw 0xFF

    .....

    Mejor:

    org 0x000 ;Esto es pgina0

    pagesel cruzo ;automticamente seleccionar banco

    call cruzo

    org 0x800 ;Esto ya es el pgina1

    cruzo

    retlw 0xFF

    .....

    Pagesel es una instruccin del MPASM que genera dos instrucciones: un bcf/bsf

    PCLATH,3 y un bcf/bsf PCLATH,4. El software ensamblador selecciona automticamente

    la instruccin bcf o bsf segn el banco en el cual se encuentra la etiqueta(o posicin de

    memoria) que se le especifique. En el caso anterior pagesel cruzo generara estas dos

    instrucciones:

    bsf PCLATH,3

    bcf PCLATH,4

    Ya que la subrutina cruzo se encuentra en la pgina1.

    Finalmente, cuando se ejecuta una instruccin CALL, se carga en el STACK el valor de la

    posicin actual ms 1(es decir, se guarda en el STACK el valor PC+1). Se guardan los 13

    bits, por lo que durante las instrucciones RETURN,RETLW y RETFIE no es necesario

    precargar al PCLATH.

    Para ms informacin, ver el esquema seccin 2.3 del datasheet de los PIC16F87XA que

    habla de cmo cargar al PC segn cada situacin.

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 25

    CLRF

    Borra el contenido de un registro seleccionado por el programador. La forma en que lo

    hace, pone en 0 los 8 bit del registro. Este registro, puede ser cualquiera de la posicin de

    la RAM.

    Ejemplo: CLRF PORTB

    Antes de la instruccin PORTB vale B'11000111'. Despus de la instruccin PORTB vale

    B'00000000'

    Para recordar CLeaR es limpio File es archivo o registro.

    Afecta a:

    Z Se pone a 1

    CLRW

    Borra al registro W. La forma en que lo hace, pone en 0 los 8 bit del registro.

    Ejemplo: CLRW

    Antes de la instruccin W vale B'00000111'. Despus de la instruccin W vale

    B'00000000'.

    Para recordar CLeaR es limpiar Work es trabajo.

    Afecta a:

    Z Se pone a 1

    CLRWDT

    Borra al WDT. La forma en que lo hace, pone en 0 al mismo.

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 26

    Ejemplo: CLRWDT

    Antes de la instruccin WDT vale B'11111110'. Despus de la instruccin vale B'0000000'.

    Para recordar CLeaR es limpiar Watch Dog es perro guardin Timer es contador.

    Afecta a:

    TO (neg) Se pone a 1

    PD (neg) Se pone a 1

    NOTA: El WDT o el contador perro guardin, sirve para destrabar al PIC. Cada vez que

    se desborda, o sea, cada vez que pasa de H'FF' a H'00', produce un reset, y como es un

    reset, se dirige a la posicin 0h de la memoria de programa.

    La forma de trabajar con el, es ir poniendo en lugares estratgicos la instruccin ya

    explicada, de esta manera evitamos el desborde del contador. Si el CP se traba en algn

    bucle o algo similar, al no limpiar el contador, el WDT desbordar y llevar al CP a la

    posicin 0h de la memoria de programa.

    Muchas veces se evita de usar esta herramienta por no tener que calcular por todo el

    programa dnde y cuando limpiar al WDT. Es recomendable su uso.

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 27

    COMF

    Realiza el complemento de un registro. COMF TEMP,F

    Si TEMP tena guardado B'00111101' luego de ejecutar la instruccin TEMP vale

    B'11000010'. Ntese, que aqu tambin podemos elegir el destino y esto nos deja guardarlo

    en el registro W si as lo requerimos.

    Para recordar COMlement es complemento File es registro.

    Afecta a:

    Z Se pone a 1 si la operacin da 0

    DECF

    Decrementa en una unidad, o lo que es lo mismo, resta 1 el contenido de un registro

    DECF DECENA,W

    Si antes de la instruccin DECENA vale .255, despus de la instruccin W vale .254 y

    DECENA vale .255 Si por el contrario, hubiramos elegido el destino F, despus de la

    instruccin DECENA vale .254

    Para recordar DECrement es decremento File es registro.

    Afecta a:

    Z se pone a 1 si la operacin es 0

    DECFSZ

    Decrementa en uno, o lo que es lo mismo, resta en 1 el contenido de un registro y cuando

    este vale 0, el CP salta una instruccin

    LOOP DECFSZ TEMP

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 28

    GOTO LOOP

    BCF PORTB,0

    El CP descontar en 1 el registro TEMP y evala el valor, si no es cero, ejecuta lnea

    siguiente que es GOTO LOOP, el cual se dirige de nuevo a la lnea LOOP DECFSZ TEMP

    el cual volver a descontar en 1 y evala el valor, si es cero salta la lnea GOTO LOOP y

    ejecuta la instruccin BCF PORTB. Esta ltima lnea, el programador pondr la

    instruccin que necesite ejecutar.

    Este pequeo programa que acabamos de ver, es un temporizador o un retardo que

    tardar en salir del bucle dependiendo de la frecuencia de reloj y el valor cargado en

    TEMP.

    NOTA: Esta instruccin, tambin hay que elegirle el destino. En el caso que no se

    exprese, como en este caso, el MPLAB dar por sentado que el resultado se guardar en

    el registro F y no en W.

    Para recordar DECrement es decremento File es registro Skip es salto Zero que es cero.

    No afecta ningn bit del registro STATUS.

    INCF

    Incrementa en 1, o suma 1, el contenido de un registro elegido por el programador.

    INCF INDF,F

    Si antes de la instruccin INDF vale H'29', despus de la instruccin INDF vale H'2A'.

    Ntese que tambin podemos elegir el destino. Si hubiramos elegido W, despus de la

    instruccin W vale H'2A' y INDF vale H'29'.

    Para recordar INCrement es incremento File es registro.

    Afecta a:

    Z se pone a 1 si el resultado es 0

    INCFSZ

    Incrementa en 1, o suma en 1, el contenido de un registro elegido por el programador y

    cuando este es 0, el CP salta una instruccin.

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 29

    VOLVER INCFSZ CONTADOR

    GOTO VOLVER

    INCF PORTA

    El CP descontar en 1 el registro CONTADOR y evala el valor, si no es cero, ejecuta

    lnea siguiente que es GOTO VOLVER, el cual se dirige de nuevo a la lnea VOLVER

    INCFSZ CONTADOR el cual volver a descontar en 1 y evala el valor, si es cero salta la

    lnea GOTO VOLVER y ejecuta la instruccin INCF PORTA. Esta ltima lnea, el

    programador pondr la instruccin que necesite ejecutar.

    Este pequeo programa que acabamos de ver, es un temporizador o un retardo que

    tardar en salir del bucle dependiendo de la frecuencia de reloj y el valor cargado en

    CONTADOR. Normalmente, se utiliza el retardo con DECFSZ pero este tambin es

    vlido.

    NOTA: Esta instruccin, tambin hay que elegirle el destino. En el caso que no se

    exprese, como en este caso, el MPLAB dar por sentado que el resultado se guardar en

    el registro F y no en W.

    Para recordar INCrement es decremento File es registro Skip es salto Zero que es cero.

    No afecta ningn bit del registro STATUS.

    IORLW

    Realiza la operacin OR entre W y un literal elegido por el programador. El resultado se

    guarda en W. La operacin es W OR L.

    Si antes de la instruccin W vale B'01110100' y el literal elegido es B'00011111', despus de la

    instruccin W vale B'01111111'.

    Para recordar Inclusive es inclusivo OR es la operacin binaria OR Literal es literal W es

    el registro trabajo.

    Afecta a:

    Z se pone a 1 si la operacin da 0

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 30

    IORWF

    Realiza la operacin lgica OR entre el registro W y un registro elegido por el

    programador. La operacin es W OR F.

    IORWF PORTC,F

    Si antes de la instruccin W vale B'01111111' y PORC vale B'00001111' despus de la

    instruccin PORTC vale B'01111111' y W vale B'01111111'. Ntese que podemos elegir el

    destino y la otra opcin, como ya se dieron cuenta por las instrucciones pasadas, puede

    ser W.

    Para recordar Inclusive es inclusivo OR es la operacin binaria OR W es el registro

    trabajo y File es registro.

    Afecta a:

    Z se pone a 1 si el resultado es 0

    MOVLW

    Carga al registro W con un literal elegido por el programador para luego hacer una

    operacin matemtica o moverlo a otro registro como veremos ms adelante. Sin duda

    alguna, una de las instrucciones ms usadas en la programacin ASM.

    MOVLW .255

    Si antes de la instruccin W vale .15, despus de la instruccin W vale .255.

    Para recordar MOVe es mover Literal es literal [b]W[/b] es el registro trabajo.

    Como es de esperar, no afecta ningn bit del registro STATUS.

    MOVF

    Mueve el contenido de un registro a otro registro elegido por el usuario.

    MOVF RETARDO,W

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 31

    Si antes de la instruccin W vale H'2A' y RETARDO vale H'FF', despus de la instruccin

    W vale H'FF'. Ntese que aqu podemos elegir el destino, y tenemos la posibilidad de

    elegir el destino al propio registro RETARDO. Al principio parece innecesario, pero se

    puede tomar como una verificacin, ya que se ve afectado el registro STATUS bit Z.

    Para recordar MOVe es mover y File es registro.

    Afecta a:

    Z Se pone a 1 si la operacin es 0

    Anteriormente, habamos dicho que esta instruccin se la puede tomar como

    verificacin, para saber si se guard con el mismo valor que tena, el bit Z se pone a 1 si el

    valor es igual al que tena cargado.

    MOVWF

    Mueve el contenido del registro W a un registro cualquiera elegido por el programador.

    Sin duda alguna, esta instruccin, es otra muy usada en la programacin ASM

    MOVWF ADCON0

    Si antes de la instruccin W vale B'10000001' y ADCON0 vale 0x0, despus de la

    instruccin ADCON0 vale 0x81.

    Para recordar MOVe es mover W es el registro W y File es registro.

    No afecta ningn bit del registro STATUS.

    NOP

    No realiza ninguna operacin. Solo consume un ciclo de instruccin.

    NOP

    Para recordar No es no y OPeration es operacin.

    No afecta ningn bit del registro STATUS.

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 32

    RETFIE

    Carga al CP con el valor de la parte alta de la pila para volver al lugar dnde se

    encontraba el CP antes de atender la interrupcin. Al mismo tiempo, pone a 1 el bit GIE

    para activar de nuevo las interrupciones.

    RETFIE

    Para recordar REturn es retornar From es de la IntErrupt es interrupcin.

    No afecta ningn bit del registro STATUS.

    RETLW

    Carga al CP con el valor de la parte alta de la pila para volver al lugar dnde se

    encontraba el CP desde dnde se llam a la subrutina y al retornar, lo hace con un literal

    cargado en W especificado por el programador. Esta instruccin, se utilizan en las tablas

    (para ms detalle, ver la explicacin del GOTO y CALL).

    Ejemplo: RETLW 'L'

    En este ejemplo, el MPLAB, carga en W el cdigo ASCII correspondiente a la letra L

    Extendiendo el ejemplo:

    PAGESELW TABLA ;CONFIGURA AL PCLATH PARA

    VOLVER AL LUGAR CORRECTO

    MOVFW contador ;CARGA A W LA POCICIN A

    LEER EN LA TABLA POR EJEMPLO 3

    CALL TABLA ;LLAMA A LA RUTINA

    TABLA

    CALL LCD_DATO ;LLAMA A LA RUTINA PARA

    MOSTRA AL LCD

    NOP

    ;

    ;

    TABLA ADDWF PCL,F ;SUMA AL PCL CON EL

    CONTENIDO DE W POR EJEMPLO 3

    RETLW '1' ;RETORNA CON 1 ASCII

    RETLW '2' ;RETORNA CON 2 ASCII

    RETLW '3' ;RETORNA CON 3 ASCII

    RETLW 'T' ;RETORNA CON 4 ASCII

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 33

    Este es un ejemplo sencillo de como utilizar RETLW. Para interpretar este cdigo

    empezamos desde PAGESELW, supongamos que el CP est en esta instruccin (que est

    explicado que hace) luego pasa a la instruccin MOVFW contador y suponemos que

    tiene cargado 3 en decimal, por lo que W pasar a tener 3 en decimal. El CP continua con

    CALL TABLA, el CP saltar por encima a todas las dems instrucciones y se dirige a la

    etiqueta TABLA y ejecuta la instruccin ADDWF PCL,F En el cdigo hablamos que le

    suma 3 al PCL, por lo que saltar al RETLW '3' cargando a W con el cdigo ASCII 3.

    Retorna justo debajo del CALL TABLA, o sea retorna a CALL LCD_DATO y ejecuta la

    rutina correspondiente, cuando termina, regresa al NOP (que puede ser cualquier

    instruccin que necesite el programador.

    Si en cambio, contador hubiera tenido cargado 4 en decimal cuando llegue a la tabla y le

    sume al PCL este apuntar a RETLW 'T' cargando en W el cdigo correspondiente ASCII.

    No afecta ningn bit del registro STATUS.

    RETURN

    Carga al CP con el valor de la parte alta de la pila para volver al lugar dnde se

    encontraba el CP cuando se llam a la rutina o subrutina.

    La diferencia con RETLW es que RETURN regresa sin cambiar a W. Este se utiliza para

    terminar una rutina y no se necesite ningn dato. Por ejemplo en la rutina CALL

    LCD_DATO no nos sirve que vuelva con ningn valor ya que es una rutina para enviar

    datos a un LCD, as que esta rutina tendr implementada RETURN

    Por ejemplo: RETURN

    No afecta ningn bit del registro STATUS

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 34

    RLF

    Rota hacia la izquierda los bit de un registro seleccionado por el programador. El destino

    de la operacin se puede elegir. Cada rotacin equivale a multiplicar por 2 si el bit C del

    registro STATUS es 0.

    Ejemplo: RLF PORTC,F

    Si antes de la instruccin PORTC vale B'00001000', despus de la instruccin vale

    B'00010000'. Si se hubiera elegido como destino W, PORTC despus de la instruccin

    continua valiendo B'00001000' y W vale B'00010000'

    Para recordar Rotate es rotar Left es izquierda File es el registro.

    Afecta a:

    C se pone a 1 si hubo acarreo

    RRF

    Rota hacia la derecha los bits de un registro seleccionado por el programador. El destino

    de la operacin se puede elegir. Cada rotacin equivale a dividir por 2 si el bit C del

    registro STATUS es 0.

    Ejemplo RRF PORTB,F

    Si antes de la instruccin PORTB vale B'10000000' despus de la instruccin PORTB vale

    B'0100000'. Si se hubiera elegido como destino W, PORTB despus de la instruccin

    continua valiendo B'10000000' y W vale B'01000000'

    Para recordar Rotate es rotar Right es derecha File es el registro.

    Afecta a:

    C se pone a 1 si hubo acarreo

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 35

    Extendiendo la explicacin de las instrucciones RRF y RLF

    A la hora de utilizar estas dos instrucciones, hay que prestarle atencin al bit C del

    registro STATUS. La razn de esto, es porque la rotacin se hace a travs del bit C.

    Supongamos que tenemos lo siguiente:

    BIT C = 0

    TEMP = B'00010000'

    Ejecutamos la instruccin RRF y TEMP vale B'00001000'. O si ejecutamos la instruccin

    RLF TEMP vale B'00100000'

    Pero si ahora tenemos:

    BIT C = 1

    TEMP = B'00010000'

    Ejecutamos la instruccin RRF y TEMP vale B'10001000'. O si ejecutamos la instruccin

    RLF TEMP vale B'00100001'

    Vemos como rota los bit dependiendo del valor del bit C. Pero anteriormente, h abamos

    dicho que estas dos instrucciones afectan al bit C. La actualizacin del bit C, lo hace

    despus de la rotacin. Lo vemos con un ejemplo:

    MOVLW B'10001001'

    MOVWF temp

    BCF STATUS,C ;PONEMOS A 0 AL BIT C

    RLF temp,F ;ROTAMOS A LA IZQUIERDA

    Al ejecutar este programa, nos dar lo siguientes resultados:

    TEMP = B'00010010'

    BIT C = 1

    Y para ver la diferencia vemos lo siguiente:

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 36

    MOVLW B'00000001'

    MOVWF temp

    BCF STATUS,C ;PONEMOS A 0 AL BIT C

    RLF temp,F ;ROTAMOS A LA IZQUIERDA

    Al ejecutar este programa, nos dar lo siguientes resultados:

    TEMP = B'00000010'

    BIT C = 0

    Algo que me haba olvidado de mencionar pero que MIGSANTIAGO del foro de

    TODOPIC estuvo atento es que ests dos instrucciones, nos sirve para enviar datos en

    forma serial utilizando el bit C que lo veremos ms adelante.

    Recordemos que, para utilizar estas instrucciones para multiplicar o dividir, debemos

    asegurarnos de que el bit C, est en 0.

    SLEEP

    Pone al microcontrolador en bajo consumo.

    SLEEP

    Para recordar SLEEP es dormir.

    Afecta a:

    TD se pone a 1

    PD se pone a 1

    SUBLW

    Resta el contenido de W con un literal de hasta 8 bit (.255). El resultado se guarda en W.

    SUBLW .20

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 37

    Si antes de la instruccin W vale .23 despus de la instruccin W vale .3 Para saber si el

    resultado es negativo o positivo, hay que chequear el bit C del registro Status. Si hay

    acarreo, el resultado es negativo, y por el contrario, si no hay acarreo es positivo.

    Para recordar SUBtraction es restar Literal es literal y W es el registro W.

    Afecta a:

    Z se pone a 1 si el resultado es 0

    DC se pone a si hay acarreo del bit del 4 al 5 bit del registro (recordemos que en

    la resta, es distinto a la suma, por eso, se pone a 0 si hubo acarreo).

    C se pone a 0 si hubo acarreo (recordemos que en la resta, es distinto a la suma,

    por eso, se pone a 0 si hubo acarreo).

    SUBWF

    Resta el contenido de un registro seleccionado por el programador con el contenido del

    registro W. La frmula es F - W = d. d es la direccin elegida por el programador en

    dnde se guardar el resultado que puede ser el registro W o el registro elegido por el

    programador.

    Ejemplo:

    SUBWF MINUENDO,W

    Si antes de la instruccin W vale .55 y MINUENDO vale .56, despus de la instruccin,

    MINUENDO vale .56 y W vale .1

    Para recordar SUBtraction es resta W es el registro W y File es el registro elegido.

    Afecta a:

    Z se pone a 1 si el resultado es 0

    DC se pone a 0 si hubo un acarreo del 4 bit al 5 bit (recordemos que en la resta,

    es distinto a la suma, por eso, se pone a 0 si hubo acarreo).

    C se pone a 0 si hubo acarreo del 7 bit. (recordemos que en la resta, es distinto a

    la suma, por eso, se pone a 0 si hubo acarreo).

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 38

    SWAPF

    Intercambia los bits de un mismo registro elegido por el programador. Los 4 bit de

    menor peso, pasan a ser lo 4 bits de mayor peso, y los 4 bits de mayor peso, pasan a ser

    los 4 bits de menor peso. El destino puede ser seleccionado.

    Cabe pensar que puede ser una instruccin de muy poco uso, pero todo lo contrario si se

    utilizan con las interrupciones. Microchips recomienda su utilizacin a la hora de salvar

    el contexto y restaurarlo en una interrupcin ya que no modifica el registro STATUS.

    Cuando trabajemos con las interrupciones, se ver que es muy recomendable salvar el

    registro STATUS y W en la RAM para luego restaurarlos. Si utilizamos la instruccin

    MOVF, es afectado el bit Z, perdiendo su estado original en el momento de la

    interrupcin. Esto se soluciona, utilizando la instruccin SWAPF. No se preocupen si no

    lo entiende por ahora. Lo entendern cuando veamos ejemplo de interrupciones.

    Ejemplo:

    SWAPF STATUS,W

    Si antes de la instruccin W bale H'55' y el registro STATUS vale B'00100100', despus de

    la instruccin el registro STATUS vale H'24' y el registro W vale B'01000010'

    Para recordar SWAP es intercambiar NIBBLE es porcin File es el registro.

    No afecta ningn bit del registro STATUS.

    XORLW

    Realiza la operacin lgica XOR entre un literal o valor y el registro W. El resultado

    queda guardado en el registro W.

    Ejemplo:

    XORLW B'11000101'

    Si antes de la instruccin W vale B'11111000', despus de la instruccin W vale B'00111101'.

    Para recordar XOR es la operacin lgica XOR Literal es un valor W es el registro W.

    Afecta a:

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 39

    Z se pone a 1 si la operacin es 0

    XORWF

    Realiza la operacin XOR entre un registro elegido por el programador y el registro W.

    La operacin es F XOR W = d. El resultado se puede elegir dnde ser guardado.

    Ejemplo:

    XORWF PORTB,F

    Si antes de la instruccin PORTB vale B11111110' y W vale B'00000001', despus de la

    instruccin W vale .1 y PORTB vale B'11111111'.

    Para recordar XOR es la operacin lgica XOR W es el registro W y File es el registro

    elegido.

    Afecta a:

    Z se pone a 1 si la operacin es 0

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 40

    Una vez que vimos todas las instrucciones y asumiendo que ya se la saben de

    memoria (tiempo tuvieron de sobra) y si no lo han echo, es hora de hacerlo,

    empecemos a escribir programas muy sencillos. Pero cmo?. Si se estn asiendo

    esta pregunta, es hora de leer desde el primer mensaje. Tienen que acordarse las

    posiciones de las cuatro columnas.

    Recuerden que vamos a escribir los programas en el MPLAB, por lo que si an no

    lo tienen, es hora de descargarlo de la pgina de Microchip en forma gratuita e

    instalarlo en la PC. Lamentablemente, este programa trabaja solo bajo Windows,

    por los que tienen Mac o Linux, no lo podrn hacer si no es por un emulador de

    Windows y an as, no se si funcione correctamente.

    Empezaremos bien desde el principio y para ello, voy a explicar cosas nuevas.

    Todo programa tiene un encabezado que se repite en cada programa nuevo y que

    vara segn el PIC a utilizar y las prestaciones del programa a escribir. Muchas de

    las personas crean plantillas nuevas para ahorrarse el trabajo. Yo soy una de ellas

    y aqu les doy una plantilla que pueden utilizar sin problemas y modificarlas

    segn su necesidad.

    He aqu la plantilla que tambin est adjuntado.

    LIST P=16F877A

    INCLUDE

    __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

    ;

    ;---------------------------------------------------------------

    ;VARIABLES.

    ;---------------------------------------------------------------

    ;

    CBLOCK H'20'

    ENDC

    ;

    RESET ORG H'00'

    GOTO INICIO

    ORG H'04' ;VECTOR INTERRUPCIN

    INTERRUP

    ;

    INICIO

    ;

    END

    Primera lnea:

    LIST P=16F877A

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 41

    Esta lnea, sirve solo para el MPLAB y le indica que el PIC a utilizar es el 16F877A.

    Se debe actualizar segn sea necesario.

    Segunda lnea:

    INCLUDE

    Esta lnea sirve a la hora de compilar ya que dentro de este archivo que viene

    incluido dentro del MPLAB, le indica al ensamblador dnde estn ubicados cada

    registro y el nombre de cada bits del PIC a utilizar as, nos ahorra de hacerlo

    nosotros mismos. Si desean abrir el archivo, lo pueden hacer con el notepad o

    cualquier editor de texto. Se debe actualizar segn sea necesario.

    Tercera lnea:

    __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

    Lnea muy importante pero se puede omitir. Aqu se configura la palabra de

    configuracin del PIC y que est en el datasheet del pic correspondiente.

    En mi caso, yo la omito y luego lo configuro desde el ICPROG a la hora de pasar

    el archivo .hex al pic. Es por eso que esta lnea est incompleta para el pic a

    utilizar pero completa para el PIC 16F84.

    Vemos en ms detalle esta lnea: __CONFIG Directiva para el ensamblador de

    que debe generar la palabra de configuracin correspondiente de acuerdo a:

    _CP_OFF la proteccin de lectura del PIC deshabilitado.

    _PWRTE_ON Reset de encendido habilitado

    _WDT_OFF Perro guardin deshabilitado.

    _XT_OSC Oscilador a cristal.

    El carcter & sirve para unir una directiva con otra.

    Plantilla.asm

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 42

    LIST P=16F877A

    INCLUDE

    __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

    ;

    ;---------------------------------------------------------------

    ;VARIABLES.

    ;---------------------------------------------------------------

    ;

    CBLOCK H'20'

    ENDC

    ;

    RESET ORG H'00'

    GOTO INICIO

    ORG H'04' ;VECTOR

    INTERRUPCIN

    INTERRUP

    ;

    INICIO

    ;

    END

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 43

    Cuarta lnea:

    ;

    ;---------------------------------------------------------------

    ;VARIABLES.

    ;---------------------------------------------------------------

    ;

    Este no es ms que un pequeo encabezado. El ensamblador omitir estas lneas y solo

    porque empieza con ";". Recuerden que, toda lnea que empiece con ";" es comentario y

    el ensamblador la omitir.

    Justo por debajo de este encabezado, penemos las variables. a que le llamo variables? a

    posiciones de memorias o nombre de bit que yo quiera darle personalmente.

    Por ejemplo, dentro del archivo P16F877A.INC a la posicin de memoria 0x05 le llama

    PORTA pero si yo quiero llamarlo PUERTO_A, es aqu dnde le indico al ensamblador.

    Cmo se hace?

    Es muy fcil y con la instruccin "EQU"

    PUERTO_A EQU H'05'

    Si al Bit RA6 lo quiero llamar LED6 lo hacemos as:

    LED6 EQU 6

    Supongamos que quiero encender el LED 6 que est en el Puerto a bit 6, y este se activa

    con un 1 lgico, ponemos esta instruccin:

    BSF PUERTO_A,LED6

    Y el ensamblador lo traducir as: BSF 0X05,0X06

    Quinta lnea:

    CBLOCK H'20'

    ENDC

    A estas dos lneas las unifique porque van juntas. Entre ellas van los nombres de cada

    posicin de la RAM que nosotros queramos nombrar, o cada Registro que queramos

    renombrar.

    Recuerden que los registros estn implementados en la RAM y que la posicin de la RAM

    que puede utilizar el usuario para guardar cosas, empieza desde una posicin que est

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 44

    indicada en el datasheet. Para el caso de 16F877 empieza desde la posicin 0x20 como lo

    ven en la figura siguiente.

    (Ver archivo adjunto)

    La directiva CBLOCK H'20' indica que empezamos a nombrar posiciones de memoria

    desde la ubicacin 0x20. Por ejemplo

    CBLOCK H'20'

    temperatura

    demora1

    demora2

    ENDC

    La posicin 0x20 se llama temperatura, la posicin 0x21 se llama demora1 y as

    sucesivamente. Tambin existe otra forma de nombrar o renombrar posiciones de

    memoria o registro, y ya lo vimos que es con la directiva EQU. por ejemplo:

    temperatura EQU H'20'

    demora1 EQU H'21'

    demora2 EQU H'22'

    Sexta lnea:

    RESET ORG H'00'

    GOTO INICIO

    ORG H'04' ;VECTOR INTERRUPCIN

    INTERRUP

    He unificado estas lneas porque por lo general as se escribe en la mayora de nuestros

    programas. Vemos con ms detalles estas lneas.

    RESET ORG H'00'

    Aqu es en dnde empieza el CP cuando se enciende al PIC. Y estos se debe, porque

    cuando hay un reset por el pin MCLR o un reset interno producido por, encendido del

    PIC o, por ejemplo, del perro guardin, el vector reset se ubica en la posicin 0x00 de la

    memoria de programa.

    Como pueden apreciar, hemos llamado a la posicin 0x00 con el nombre de RESET, ya

    que la primer columna es una etiqueta. Las etiquetas sirven para nombrar posiciones de

    memoria de programa.

    ORG H'00' indica que se empieza a escribir desde la posicin 0x00 por lo que la siguiente

    instruccin, quedar alojada en la posicin 0x00. ORG es una directiva, y solo sirve para

    el ensamblador. Esta lnea, SIEMPRE debe estar y no se puede modificar, salvo la

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 45

    etiqueta.

    Siguiente lnea es GOTO INICIO, esta instruccin queda alojada en la posicin 0x00 y es

    un salto a la etiqueta INICIO. Este salto tiene que estar, porque en las siguientes

    posiciones de memoria de programa, est la interrupcin, externa e interna del PIC. Por

    eso es necesario hacer el salto.

    Siguiente lnea nos encontramos con ORG H'04', como se dieron cuenta, es una

    directiva. Esta posicin de memoria, indica el vector de interrupcin. Cuando estn

    habilitadas las interrupciones y una de ella se activa, el CP apuntar aqu, a la posicin

    0x04.

    Siguiente lnea nos encontramos con la etiqueta INTERRUP. Si trabajamos con las

    interrupciones, aqu es donde escribiremos lo que necesitamos hacer con ellas.

    Sptima lnea:

    ;

    INICIO

    ;

    Vemos la etiqueta INICIO. Aqu vendr el CP cuando halla un reset gracias al GOTO

    INICIO ubicado en la posicin 0x00 de la memoria de programa. De esta manera,

    saltamos un montn de instrucciones que no debemos ejecutar antes. Como por ejemplo

    las interrupciones si hubiese.

    Por ende, a partir de esta etiqueta, estar nuestro programa principal. Configuraremos

    los puertos, las interrupciones y empezaremos a darle trabajo al CP.

    Octava lnea:

    END

    Esta es una directiva y solo sirve para el ensamblador indicando que despus de esta

    directiva, se termin el programa. Instrucciones que estn por debajo de esta lnea, no

    ser tenido en cuenta. Y esta directiva es obligatoria colocarla.

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 46

    Banco de memoria RAM del 16F877.jpg.jpg

  • [ENSAMBLADOR DESDE CERO] 18 de marzo de 2009

    w w w . u c o n t r o l . c o m . a r

    Pgina 47

    Tutorial creado por Leon Pic.

    Versin 1.16

    http://www.ucontrol.com.ar/wiki/index.php/Curso_de_ASM_para_PICs_desde_cero

    Portado a PDF por Meta.

    http://electronica-pic.blogspot.com

    Cualquier sugerencia, dudas o cualquier comentario, puedes realizarlas en el foro aqu.

    http://www.ucontrol.com.ar/forosmf/programacion-en-asm/asm-desde-cero-

    comentarios-y-opiniones/

    Puede haber futuras actualizaciones, mejoras y contenidos.

    www.ucontrol.com.ar