curso de asm para pics desde cero.pdf

Upload: mauricio-castro-gonzalez

Post on 03-Apr-2018

230 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    1/26

    Curso de ASM para PICs desde cero

    Introduccin

    ASM para PICs desde cero

    El presente tutorial es una recopilacin de los excelentes posts publicados en el ForouControl dentro del hilo ASM desde cero. Periodicamente iremos agregando aqui lasnovedades que surjan en el foro. No obstante, es muy recomendable que pases por all paraplantear tus dudas o consultas.

    Tabla de contenidos

    [esconder]

    1 Introduccin 2 Qu es el CP? 3 Cmo es la extructura del lenguaje ASM? 4 Qu son los registros?

    o 4.1 Registro de trabajo (W)o 4.2 Registro de estado (STATUS)

    5 Las instrucciones ASMo 5.1 Primer grupo: Byte-Oriented operationo 5.2 Segundo grupo: Bit-Oriented operationo 5.3 Tercer grupo: Literal and Control

    6 Set de instruccioneso 6.1 ADDLWo 6.2 ADDWFo 6.3 ANDWFo 6.4 BCFo 6.5 BSFo 6.6 BTFSCo 6.7 BTFSS

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    2/26

    o 6.8 CALLo 6.9 GOTOo 6.10 CLRFo 6.11 CLRWo 6.12 CLRWDT

    7 Temas relacionados 8 Autor

    Lo primero que hay que saber para comprender este lenguaje, es que cada lnea decdigo es una instruccin que realiza el CP o un paso que realiza el CP. Esto es diferenteen otros lenguajes, como por ejemplo el [CCS|C], en el que una lnea de instruccin puededemandar uno o ms pasos que el CP debe realizar. Ms adelante entendern el porqu.

    Esto nos explica el porqu en un programa escrito en ASM (assembler) se emplean menoslneas de instruccines que el mismo programa realizado en otro lenguaje. Esto esbueno, yaque cuanto menos lneas de cdigo se usen, menor ser el monto la memoria de programaque utilizaremos.

    Nota: Entendemos por el mismo cdigo el software necesario para realizar una tarea enparticular. Una tarea que debe realizar nuestro microcontrolador puede ser escrito endiferentes lenguajes, y es el compliador que se utiliza quien lo traduce a formato "hex" (0 y1).

    Qu es el CP?

    El CP (o PC) es el Contador de Programa (Program Counter, en ingls). Es el encargadode leer cada instruccin y realizar la accin solicitada por el software.

    Para dar un ejemplo un poco ms claro, podemos pensar en el CP como si fuese unapersona. Esta persona se le da un papel que tiene diferentes tareas a realizar. Estas tareas,estn una debajo de la otra y la persona lee lnea por lnea y hace lo que le indica esa lnea.Cada lnea, posee una instruccin que se debe hacer. Cuando termin de hacer esainstruccin, continua con la lnea de abajo.

    Supongamos que tenemos un papel que dice:

    [pre] Levantar la mano izquierda. Bajar la mano izquierda. Saltar tres veces en el mismolugar. Levantar la mano derecha. Saltar una vez en el mismo lugar. Bajar la mano derecha.[/pre]

    El CP, har esas tareas sin negarse y har exactamente lo que est escrito, por lo que sihace una tarea mal, es porque le pusimos una o ms instrucciones mal.

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    3/26

    Si bien el CP har lo que nosotros le pidamos, nos pide que respetemos algunas cosas.Estas cosas, dependern de cada microcontrolador y que debemos saber para poderprogramar en forma correcta al PIC.

    Cmo es la extructura 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 unapocicin de la memoria del programa al que se necesita apuntar. Los que no se dencuenta, ya lo haran.

    La segunda columna, se llama INSTRUCCIN y lo que justamente hace, es unainstruccin a realizar por el CP.

    La tercera columna, se llama OPERANDO y es el operando de una instruccin, osea, de la segunda columna. Hay instrucciones que no tienen operando y lasveremos ms adelante.

    Y la cuarta columna, se llama OBSERVACIONES y sirve solo para elprogramador, o sea, el usuario que est programando el PIC. En otras palabras, anosotros. Siempre comienza con ; (punto y coma)

    Si no sirve para el PIC, Para qu complicarlo ms? En realidad de trata de todo locontrario: 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 estacaractersticas ya que en l pondremos que es lo que queremos hacer o explicar elprograma.

    Si bien, estas observaciones se utilizan en la cuarta columna, no es obligacin colocarla enesta columna, si no que puede ir al margen de la planilla en dnde estamos programando. Yes 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

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    4/26

    O, podemos verlo as:

    ;OBSERVACIONES

    ;OBSERVACIONES;OBSERVACIONES (y la cantidad que necesitemos)ETIQUETAS INSTRUCCIN OPERANDO ;OBSERVACIONES

    Qu son los registros?

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

    Los registros sonposiciones de memoria que se utilizan para ir configurando al PIC

    mientras se corre el programa, para cambiar de bancos y acceder a otras partes dememorias. Podemos pensar que son banderas que nos van diciendo que est pasando condistintas operaciones. tambien son capaces de proporcionar la habilitacin o desabilitacinde los mdulos que trae el PIC (conversor Analgico/Digital, PWM, etc.).

    Estos registros, tienen una ancho (en bits) que varia de acuerdo al PIC que tengamos entremanos. Los hay de 8 bit, 16 bit y 32 bit. La palabra configuracin es una excepcin, y laveremos ms adelante.

    Cada registro posee un nombre, y cada bit o un grupo de bits se puede utilizar para lodescripto anteriormente (habilitar/desabilitar, etc).

    A continuacin, veremos una pocicin de la RAM y sus 4 bancos. Este es del PIC16F877:

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    5/26

    Registros del PIC16F877

    Como notarn, en las cuatro columnas hay nombres. Estos nombres son todos los registrosque posee este PIC. Vern que hay registros que se repiten. No quiere decir que estanduplicados, triplicados o cuatriplicados, si no que se puede acceder a ellos no importa enque banco estemos trabajando (ya lo entendern, no se preocupen).

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    6/26

    Cada vez que se programe el PIC y se necesite trabajar con uno de estos registros, se debeacceder al banco que est dicho nombre. Es por eso que esta tabla es muy importante a lahora de trabajar.

    Aprovechando que sub esta tabla del PIC, cuando de un ejemplo de programacin sersobre l.

    Microchip provee en forma gratuita estos datasheet. Y hay uno por cada PIC. Si an no lohan hecho, [pueden descargarlo gratuitamente de la pgina de Microchip. Cuandoempezemos a programar, lo necesitaremos.

    Registro de trabajo (W)

    Uno de los registros ms utilizados es el registro de trabajoW, el cual se utiliza paramover un dato/valor de un registro a otro, para cargar valores en un registro y con la ayudade la ALU puede hacer operaciones matemticas. Observen con atencin el diagrama debloques siguiente, dnde puede verse en que lugar se encuentra W: Registro de trabajo (W)

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    7/26

    Ahora bien: si W es un registro, dnde est ubicado? Porqu en el mapa de memoria nolo encuentro?

    Est en la pocicin 00h y figura como indirect addr. Esto es, porque el registro W, no esuna pocicin de memoria fsica (hay otros registros en las mismas condiciones, pero no nosdesviemos por ahora). El registro W es muy usado, y recuerden que se utiliza para mover ocargar datos en distintas posiciones de la RAM y EEPROM.

    Los microcontroladores PIC, poseen tres tipos de memorias.

    * Memoria de Programa Es la ubicacin fsica dnde se guarda elfirmware que hemoscreado, o sea, nuestro programa. Y tiene un ciclo de 1.000 de lectura y/o escrituras antes deestropearce y es del tipo FLASH

    * Memoria de datos de uso general Es la memoria RAM del PIC. Recordemos, que losregistros estn sobre la memoria RAM y la memoria de uso general, comienza despus delos registros.

    * Memoria de datos EEPROM Es la memoria EEPROM que puede almacenar datos masde 40 aos sin energa y 1.000.000 de ciclos de escritura y lectura

    El PIC16F877 tiene una memoria de programa de 8 KBytes por un ancho de 14 Bits, o seaque cada pocicin de memoria tiene 14 bits (B'11111111111111', o H'3FFF') Cada lnea deinstruccin ocupa una pocicin en la memoria de programa, asi que, podemos poner hasta8.192 instrucciones.

    La RAM de uso general (ms los registros) incluye 368 bytes con un ancho de 8 bits(B'11111111', o H'FF'). Esto quiere decir, que tenemos 368 posiciones para nuestro uso.

    La EEPROM tiene 256 bytes con un ancho de 8 bits. Tenemos 256 pociciones para nuestrouso.

    Registro de estado (STATUS)

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    8/26

    Si haz seguido este curso hasta aqu, recordars que los registros poseen un ancho de 8 bits.Cada bit, puede contener un 1 o 0.

    Vemos ahora en detalle el registro STATUS:

    Registro de estado (STATUS)

    Este registro tiene 3 bits dedicado para las operaciones matemticas, 3 bits dedicados alcambio de banco de memoria y 2 bits para saber que o quin produjo un Power Up(despertar) del micro. Y se puede leer o escribrir en l (cambiar datos).

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

    BIT 7:

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    9/26

    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 5Se llaman RP1 y RP0 respectivamente. Sirve para el direccionamiento directo paracambiar de banco de memoria.

    00 = Banco 0 01 = Banco 1 10 = Banco 2 11 = banco 3

    BIT 4Se 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 ponea 1 este bit. 0 = Se pone a 0 cuando el wachtdog o en castellano perro guardan (WDT)despierta al PIC.

    BIT 3Se 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 = Sepone a 0 cuando se ejecuta la instruccin SLEEP

    BIT 2Se llama Z y al igual que los dos bits anteriores, es una bandera. Nos indica el resultado deuna operacin aritmtica y lgica.

    1 = La operacin aritmtica o lgica di como resultado 0 0 = La operacin aritmtica olgica no di como resultado 0

    BIT 1

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    10/26

    Se llama DC, porDigit carry/borrow (dgito llevar/prestar). Es afectado por lasinstrucciones ADDWF; ADDLW; SUBLW; y SUBWF (Para la resta, la polaridad esinversa).

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

    BIT 0Se llama Ccarry/borrow. Es afectado por las mismas instrucciones que afectan al bit DC.

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

    No hubo accareo del bit ms significativo

    Las instrucciones ASM

    A continuacin, una breve instroduccin a las nstrucciones ASM:

    Cada instruccin tiene una ancho de 14 Bits, es por eso que la memoria de programa tieneel mismo ancho, justamente para poder alojar cada instruccin.

    Las instrucciones, estn divididas en tres grupos, a saber:

    Byte-Oriented operation (Operacines orientadas a los Bytes) Bit-Oriented operation (Operacines orientadas a los Bits) Literal and Control operation (Literales y operaciones de control)

    Primer grupo: Byte-Oriented operation

    Cada instruccin de este grupo est compuesta por:

    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 cadainstruccin. Est formada por los bit del 13 al 8.

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    11/26

    El DESTINATION o el destino, indica en dnde se va a guardar el dato.Por ejemplo, sihacemos una suma, tenemos dos opciones dnde guardarlo, una puede ser el registro W yla otra opcin puede ser otro registro cualquiera o una pocicin 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 enel registro W. EN cambio si vale 1, la operacin se guardar en el registro o pocicin dememoria que estemos trabajando al momento de usar una instruccin.

    Hay instrucciones, como veremos ms adelante, en las que no es necesario indicar dndequeremos guardar la operacin, ya que se hace en forma automtica. Y hay otrasinstrucciones en las que si no se indica el destino, nos puede dar un error al compilar o elcompilador lo eligir por su cuenta y por ende, nos puede ejecutar mal el programa.

    Y por ltimo, tenemos el FILE REGISTER ADDRESS, que se carga con la direccin delregistro a ser guardado. Est formada por los bit 6 al 0. La constante que nos indica esto, esla 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 lo mismo que en el 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 el bit del opcode para drcelo al bit address. Laconstante que nos indica esto es la letra b.

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

    Est formado por los bit 6 al 0. 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

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    12/26

    OPCODE es lo mismo que en el primer y segundo grupo. Est compuesta por los bits 13 al8. 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 laimportancia).

    Y el LITERAL que puede ser un valor, por ejemplo para sumar, para restar, para cargar alregistro W, en fin, un nmero decimal, binario o hexadecimal. O puede ser un valor dedireccin a dnde apuntar para las instrucciones CALL y GOTO.

    Est compuesta por los bits 7 al 0. Excepto para las instrucciones CALL y GOTO , queest compuesta por los bit 10 al 0.

    A continuacin, vemos las 35 instrucciones agrupadas por los tres grupos:

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    13/26

    Instrucciones del PIC16F877

    Como puede verse en la imagen, algunas de las instrucciones afectan al registro STATUSy otras no.

    Les voy a arruinar el momento de alegra. Las instrucciones hay que estudiarlas dememoria. Si, leyeron bien, de memoria. Lo que tienen que saber sobre las instrucciones, escomo se escriben, que hace cada instruccin y lo ms importante que bit de que registrosafectan. Y eso es lo que vamos a hacer a continuacin.

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    14/26

    Set de instrucciones

    Vamos a ir estudiandolas 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 bti 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 pocicin de la RAM llamada TEMP tena el valor cargadocon .2, W vale .135 y TEMP contina valiendo .2

    Ahora si hubiera puesto as:

    ADDWF TEMP,F

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    15/26

    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 vezde 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 bti 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 destinode 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 lainstruccin TEMP vale B'00100010' y W vale B'11100011'

    Afecta a:

    Z Se pone a 1 si la operacin es 0

    BCF

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    16/26

    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 valeB'11111011'

    Para recordar:Bit Cleares 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 valeB'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,5BCF PORTA,0BSF PORTB,0

    Caso 1: TEMP vale B'00011110'. El CP analizar solo el Bit 5 del registro TEMP, como es

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    17/26

    0, salta la instruccin BCF PORTA,0 y ejecuta la siguiente lnea que es BSF PORTB,0 ycontinua haciendo la instruccin.

    Caso 2: TEMP vale B'00111000'. El CP analizar solo el Bit 5 del registro TEMP, como es1 no salta la instruccin y har la instruccin BCF PORTA,0 y luego continua con lainstruccin BSF PORTB,0

    Para recordar:Bit Testes 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,3ADDWF PORTCANDWF NODO

    Caso 1:TEMP vale B'01101100'. El CP analizar solo el Bit 3 del registro TEMP, como es1, salta la instruccin ADD PORTC y ejecuta la siguiente lnea que es ANDWF NODO ycontinua haciendo la instruccin.

    Caso 2:TEMP vale B'11110000'. El CP analizar solo el Bit 3 del registro TEMP, como es0 no salta la instruccin y har la instruccin ADD PORTC y luego continua con lainstruccin AND NODO.

    Para recordar:Bit Testes chequear File Skip es salto Set

    No afecta a ningn Bit del registro Status.

    Normalmente a continuacin de las instrucciones BTFSS y/o BTFSC va un GOTO oCALL pero no la he puesto porque an no se explicaron estas instrucciones.

    CALL

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    18/26

    Se digire a una direccin de la memoria de programa designado por el programador. Enotras palabras, se utiliza para dirigirse a una rutina o tarea. Su principal ventaja es que unavez que finaliz la tarea, vuelve al punto siguiente desde dnde se llam.

    Ejemplo :

    CALL ESC_PORTB

    Para recordar: CALL es llamada.

    No afecta ningn bit del registro Status.

    GOTO

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

    la instruccin GOTO.

    Se dirigee a una direccin de la memoria de programa designado por el programador. Enotras palabras, se utiliza para saltar instrucciones que no queremos que se ejecuten. Adiferencia de la instruccin CALL, no hay forma de volver cuando se ejecuta la

    instruccin.

    Ejemplo:

    GOTO INICIO

    Para recordar: GOTO es ir a.

    No afecta a ningn bit del registro Status.

    Vamos a hablar del PC para entender bien sobre estas instrucciones. La excelenteexplicacin que continua, por desgracia no es ma (ojal fuera mi explicacin), son de laspersonasMaunix yBrunoF(del foro todopic)

    En la siguiente imagen, vemos el diagrama de bloques del PC (o CP):

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    19/26

    Diagrama de bloques del PC

    El PC es de 13 bits en este caso( 8K words). 14 son los bits de cada "word" o instruccinque 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 metertodos los bits necesarios para direccionar toda su memoria.

    EL program counter son 2 registros, el PChigh y PCLow. Cuando haces un CALL o unGOTO, solo se rellenan 11 bits (los 8 del PClow y 3 del PChigh) y los restantes 2 losrellenas con el PCLATH (para completar los 13bits).

    El STACK (pila) tiene toda la direccin, no solo parcial. Si haces un CALL desde la pagina0 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 demodificar el PCLATH.

    Entnces, dijimos que:

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

    Al ejecutar un GOTO o CALL, se copian del 0 al 10, y los otros 2 bits se copian delregistro PCLATH. El PCLATHsolo estar all para esa situacion.

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    20/26

    En un return o retfie la microelectronica del PIC, pega la direccin del PC que estabaguardada.

    Lo vemos con un ejemplo:

    1.

    STACK = vacoPC = 0x00A0PCLATH = 0b000011000Ejecutas 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 + 1Valor STACK 0x00A0 + 1 --> PC = 0x00A1

    5. EL cdigo sigue ejecutandose en la pgina 0 pero hay que tener en cuenta que elPCLATH apunta a la pgina 3 por ello si hars otro CALL o GOTO, debers cambiar denuevo 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 lasdudas ya que es muy importante. Vayamos al tema tema del PC, computed goto(lo quealgunos llaman "tabla"), call, returns y goto.

    El Program Counter(PC) est conformado en esta familia de uC(y refiriendonos a la familia16F, las otras poseen ms o menos bits implementados) por 13 bits repartidos entre dosregistros: PCH y PCL.

    El PCL es legible/escribible directamente a traves del registro fsico PCL(valga laredundancia). En cambio, el PCH no es directamente accesible. No puede ser ledo, y slopuede se grabado mediante un buffer que contiene el valor temporalmente(oh! aqu aparecenuestro famoso PCLATH).

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    21/26

    Entonces, recordar:El PCLATH es slo un buffer temporal que almacena los 5 bits demayor 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 distnta:una es cuando queremos trabajar con tablas y otra cuando realizamos un call o un goto queno est en el msmo banco.

    1era situacin: Tabla(Comuted Goto)La tabla es una situacin de uso del PC en la que seafecta directamente al registro PCL. Cuando se afecte directamente al PCL mediante unainstruccin, es necesario que el usuario asegure que PCLATH tenga sus 5 bits pre-cargadosadecuadamente.

    Hago un par de ejemplosejemplo:

    Mal:

    org 0x000movlw 0x01call tablaorg 0x300

    tablaaddwf PCL,Fretlw 0x03retlw 0x01retlw 0x0F

    .....

    Bien:

    org 0x000movlw 0x03movwf PCLATHmovlw 0x01call tablaorg 0x300

    tablaaddwf PCL,Fretlw 0x03retlw 0x01retlw 0x0F.....

    Mejor:

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    22/26

    org 0x000pageselw tablamovlw 0x01

    call tablaorg 0x300

    tablaaddwf PCL,Fretlw 0x03retlw 0x01retlw 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 elensamblador segn la etiqueta(o posicin de memoria) que se le especifique. En el casoanteriorpageselw tabla generara estas dos instrucciones:

    movlw 0x03movwf 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 usarsesubwfy muchas otras) entonces el programa saltar a una posicin indeseada.

    2da situacin: CALL y GOTO En esta familia de uC, cada instruccin es codificada en14 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 parala GOTO), y las K corresponden a la direccin a la cual queremos llamar(con un CALL) osaltar(con un GOTO).

    Aqu se ve claramente un problema. Podemos ver que un CALL o un GOTO slo almacena11 bits de la direccin a la cual debe ir. 11 bits es un mximo 2048 posiciones. Qu pasacuando un uC posee ms de 2k de memoria Flash entonces? Por ejemplo, un 16F877Aposee 8k de memoria Flash. Cmo hara para llamar a una subrutina que est ms all dela posicin 2047 de la flash?

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    23/26

    La solucin nuevamente se encuentra en el PCLATH(y es nuevamente el usuario el quetiene el deber de pre-cargar el valor adecuado).

    Entonces, dijimos que el PC contiene 13 bits de longitud. 13 bits son hasta 8kwords(unaword es en esta familia un conjunto de 14 bits que conforman una instruccin la cual sealoja en la memoria FLASH del uC). Un CALL o un GOTO slo contienen los 11 bits demenor 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 registroPCLATH est correctamente precargado. La instruccin a la que el uC ir estarconformada 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 uC carga a PC con el valor pasado por los 11 bits de K, y aPC con el valor de los bits PCLATH. El registro PCLATH no esmodificado de ninguna manera. Slo se leen esos dos bits.

    Por ejemplo, en un uC de 8kWords hay 4 pginas. Una pgina cada 2048 words. Si se esten una pgina y se quiere ir a otro es necesario precargar antes dichos bits del PCLATHpara poder hacerlo.

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

    Si el uC 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 bitsPCLATH se encuentren ambos en cero.

    Vamos con un par de ejemplos:

    Mal:

    org 0x000 ;Esto es pgina0call cruzoorg 0x800 ;Esto ya es el pgina1

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    24/26

    cruzoretlw 0xFF.....

    Bien:

    org 0x000 ;Esto es pgina0movlw 0x08movwf PCLATHcall cruzoorg 0x800 ;Esto ya es el pgina1

    cruzoretlw 0xFF

    .....

    Mejor:

    org 0x000 ;Esto es pgina0pagesel cruzo ;automaticamente seleccionar bancocall cruzoorg 0x800 ;Esto ya es el pgina1

    cruzoretlw 0xFF

    .....

    Pagesel es una instruccin del MPASM que genera dos instrucciones: un bcf/bsfPCLATH,3 y un bcf/bsf PCLATH,4. El software ensamblador selecciona automticamentela instruccin bcfo bsfsegn el banco en el cual se encuentra la etiqueta(o posicin dememoria) que se le especifique. En el caso anteriorpagesel cruzo generara estas dosinstrucciones:

    bsf PCLATH,3bcf 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 laposicin actual ms 1(es decir, se guarda en el STACK el valor PC+1). Se guardan los 13

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    25/26

    bits, por lo que durante las instrucciones RETURN,RETLW y RETFIE no es necesarioprecargar al PCLATH.

    Para ms informacin, ver el esquema seccin 2.3 del datasheet de los PIC16F87XA quehabla de cmo cargar al PC segn cada situacin.

    CLRF

    Borra el contenido de un registro seleccionado por el programador. La forma en que lohace, pone en 0 los 8 bit del registro. Este registro, puede ser cualquiera de la pocicin de laRAM.

    Ejemplo: CLRF PORTB

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

    Para recordar: CLeaR es limpio File es archivo o registro.

    Afecta a:

    Z Se pone a 1

    CLRW

    Borra el registro W. La forma en que lo hace es poniendo en 0 los 8 bit del registro.

    Ejemplo:

    CLRW

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

    Para recordar: CLeaR es limpiar; Workes trabajo.

    Afecta a:

    Z Se pone a 1

  • 7/28/2019 Curso de ASM para PICs desde cero.pdf

    26/26

    CLRWDT

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

    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 guardian; Timeres contador.

    Afecta a:

    TO (neg) Se pone a 1 PD (neg) Se pone a 1

    NOTA:El WDT o el contador perro guardian, sirve para destrabar al PIC. Cada vez quese 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 pocicin 0h de la memoria de programa. La forma de trabajar con el, esir 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 elcontador, el WDT desbordar y llevar al CP a la pocicin 0h de la memoria de programa.

    Muchas veces se evita de usar esta herramienta por no tener que calcular por todo elprograma dnde y cuando limpiar al WDT. Es recomendable su uso.