1-Intrucciones del microcontrolador PDF

Title 1-Intrucciones del microcontrolador
Author Eric Simancas
Course Arquitectura De Computadoras
Institution Instituto Politécnico Nacional
Pages 52
File Size 3.1 MB
File Type PDF
Total Downloads 48
Total Views 133

Summary

Documento que muestra la arquitectura interna del microcontrolador y todas las instrucciones para programarlo....


Description

Arquitectura interna del microcontrolador Revisar la estructura de las diversas marcas y modelos de microcontroladores sería una labor que saldría de las metas de éste curso, por lo que, a manera de ejemplo, nos concentraremos en una marca, Microchip, y en su modelo PIC16F84A. El nombre verdadero de este microcontrolador es PICmicro (Peripheral Interface Controller), conocido bajo el nombre PIC. Su primer antecesor fue creado en 1975 por la compañía General Instruments. Este chip denominado PIC1650 fue diseñado para propósitos completamente diferentes. Diez años más tarde, al añadir una memoria EEPROM, este circuito se convirtió en un verdadero microcontrolador PIC. Todos los microcontroladores PIC utilizan una arquitectura Harvard, lo que quiere decir que su memoria de programa está conectada a la CPU por más de 8 líneas. Hay microcontroladores de 12, 14 y 16 bits, dependiendo de la anchura del bus.

Tabla 2.1. Gamas de microcontroladores PICmicro. Entre sus ventajas: Eficiencia del código, permiten una gran compactación de los programas.

Rapidez de ejecución, a frecuencia de 20MHz->5 millones de instrucciones/segundo. Seguridad en acceso por la separación de memoria de datos y de programa. Juego reducido de instrucciones y de fácil aprendizaje. Compatibilidad de pines y código entre dispositivos de la misma familia o sin reducción de las prestaciones internas (muy versátiles). Gran variedad de versiones en distintos encapsulados (desde 8 hasta 84 pines) sin reducción de las prestaciones internas (muy versátiles). Posibilidad de protección del código muy fiable. Herramientas de desarrollo software y hardware abundantes y de bajo coste. Hasta hace algunos años el PIC16F84A era más frecuentemente utilizado en el aprendizaje de estos dispositivos, hoy día es considerado obsoleto, aunque aún existe una amplia documentación respecto a aplicaciones del mismo.

Figura 2.1. Microcontrolador PIC16F84A Refiriéndonos a él sus principales características son: Memoria flash del programa: 1 kB. Memoria de datos RAM: 68 bytes. Memoria de datos EEPROM: 64 bytes. Pila (STACK): 8 niveles. Interrupciones: 4 tipos diferentes (pata externa RB0/INT, exceso del temporizador TMR0, interrupción al cambio PORTB y al completar la escritura del EEPROM de datos). Juego de instrucciones: 35. Frecuencia de trabajo: 20 MHz máxima. Temporizadores: sólo uno, el TMR0 de 8 bits con preescaler (divisor de frecuencia) programable de 8 bits. También tiene perro guardián (WDT).

Líneas de E/S digitales: 13 (5 Puerto A y 8 Puerto B) con control individual de dirección. Voltaje de alimentación: 2 a 6 V DC. Registros de hardware de funciones especiales: 15. Extensión de instrucciones:14 bits. Extensión de datos: 8 bits. Modos de acceso: directo, indirecto y relativo. Ciclo de instrucción: 2 para saltos y 1 para el resto. Memoria de programa de 1000 ciclos de escritura/borrado de flash reforzado. Memoria de datos EEPROM de 10,000,000 de ciclos de borrado/escritura típica. Retención de datos de EEPROM de >40 años. Programación en serie dentro del circuito (ICSP = In Circuit Serial Programming) mediante dos pines. Power-On Reset (POR), Power-up Timer (PWRT), Oscillator Start-up Timer (OST). WatchDog Timer (WDT) con su propio oscilador rc incorporado en el chip para un funcionamiento confiable. Protección de códigos. Modo SLEEP para economizar consumo. Opciones seleccionables de oscilador. Tecnología CMOS con flash reforzado y EEPROM. Tecnología de baja potencia y alta velocidad. Diseño estático completo. Rango amplio de tensiones de funcionamiento comercial e industrial: 2.0 Volts a 5.5 Volts. Consumo muy bajo: o Menor a 2 mA típico de corriente a 5 Volts, 4 MHz. o Menor a 0,5 A típico de corriente en reposo a 2 Volts. En la figura 2.2 mostramos la arquitectura básica del 16F84A, en el que veremos diversos elementos que al momento de la programación resultarán vitales en el funcionamiento correcto de nuestras aplicaciones. Otro microcontrolador muy útil en el aprendizaje, pero con más recursos y prestaciones es el PIC16F877A, que en general es una mejora del 84A, contando con cinco puertos de entrada y salida optimizadas para comunicación serial, conversiones analógica-digital entre otras prestaciones. El fabricante en fechas recientes informa que este dispositivo será descontinuado proponiendo el uso del PIC16887.

Figura 2.2. Arquitectura del PIC16F84A.

2.2.

Tipos y distribución de las memorias internas

En un microcontrolador PIC de gama media como el PIC16F84A podemos distinguir tres bloques de memoria: Memoria de programa. Posee 8192 posiciones para instrucciones de 14 bits de longitud y está organizada en páginas de 2,048 posiciones, sin embargo, en el 16F84A sólo se han implementado las primeras 1000 . Es memoria de tipo FLASH no volátil y es en donde se almacenan las instrucciones que gobiernan la aplicación. Memoria de datos RAM. Es una memoria volátil que guarda variables y datos. Los registros que maneja son de 8 bits. Memoria de datos EEPROM. Es una memoria de datos de lectura y escritura no volátil que permite garantizar que determinada información estará siempre disponible al reinicializarse el programa. Se gestiona de manera distinta a la memoria de datos RAM.

Figura 2.3. Diagrama a bloques del PIC16F84A mostrando las memorias. 2.2.1. Memoria de programa El microcontrolador está diseñado para que en su memoria de programa se almacenen todas las instrucciones del programa de control. Como éste siempre es el mismo, debe estar grabado de forma permanente. Existen algunos tipos de memoria adecuados para soportar estas funciones, de las cuales se citan las siguientes: ROM con máscara, se graba mediante el uso de máscaras. Sólo es recomendable para series muy grandes debido a su elevado coste. EPROM: se graba eléctricamente con un programador controlador por un PC. Disponen de una ventana en la parte superior para someterla a luz ultravioleta, lo que permite su borrado. Puede usarse en fase de diseño, aunque su coste unitario es elevado. OTP: su proceso de grabación es similar al anterior, pero éstas no pueden borrarse. Sus bajos costes las hacen idóneas para productos finales.

EEPROM: también se graba eléctricamente, pero su borrado es mucho más sencillo, ya que también es eléctrico. No se pueden conseguir grandes capacidades y su tiempo de de escritura y su consumo es elevado. FLASH: se trata de una memoria no volátil, de bajo consumo, que se puede escribir y borrar en circuito al igual que las EEPROM, pero que suelen disponer de mayor capacidad que estas últimas. Son recomendables aplicaciones en las que es necesario modificar el programa a lo largo de la vida del producto. Por sus mejores prestaciones, está sustituyendo a la memoria EEPROM para contener instrucciones. Con anterioridad Microchip comercializaba dos microcontroladores prácticamente iguales que sólo se diferencian en que la memoria de programa de uno de ellos es tipo EEPROM y la del otro tipo Flash, hablamos trata del PIC16C84 y el PIC16F84, respectivamente. La memoria de programa almacena todas las instrucciones de la aplicación en ejecución, la cual estará grabada de forma permanente. La información contenida en esta memoria se graba previamente mediante un equipo físico deno minado programador o grabador (figura 2.4). Esta memoria es denominada ROM Flash y admite unas 1000 grabaciones durante la vida útil del circuito integrado. Todas las instrucciones ocupan una posición de memoria (figura 2.5).

Figura 2.4. Grabador de PIC K150.

Existen dos posiciones de memoria que son de particular importancia: la dirección 0 que es la posición de reinicio del microcontrolador (RESET) y a la posición 4 que es una posición de redirección a la que se apunta tras una interrupción de programa cualquiera.

Figura 2.5. Mapa de la memoria de programa.

A la memoria de programa de los PIC16 se accede mediante un registro de 13 bits que actúa como puntero de la instrucción que se debe ejecutar en el siguiente ciclo de instrucción. Este registro de 13 bits se denomina Contador de Programa (Program Counter) y su acrónimo es PC (ver figura 2.5). Con este contador de programa de 13 bits se pueden direccionar 8K posiciones de memoria. Debido a que la codificación de las instrucciones es de 14 bits y para aprovechar las ventajas de la arquitectura Harvard, cada una de esas 8K posiciones corresponde a una instrucción y por tanto, el contador de programa es capaz de direccionar 8K x 14 posiciones o 8000 instrucciones. Como cada instrucción ocupa una posición de memoria resulta mucho más fácil saber si un dispositivo tiene memoria de programa suficiente para una aplicación. Los 8K de memoria de programa disponible están divididos en 4 páginas de 2K cada una (0h 7FFh, 800h-FFFh, 1000h-17FFh y 1800h-1FFFh). Esto es debido a que las instrucciones de salto y llamada a subprograma permiten cargar sólo 11 bits en el PC (desplazamiento en 211 = 2K), tal como se muestra en la figura 2.6. Si se están ejecutando instrucciones secuencialmente, el contador de programa pasará de una página a otra sin necesidad de intervención por parte del usuario o programador. Para saltar entre páginas de la memoria de programa los 2 bits más altos del PC deben modificarse. Esto se realiza escribiendo en el registro PCLATH (registro situado en la memoria de datos). La instrucción CALL y las interrupciones originan la carga del contenido del PC en el nivel superior de la pila y con las instrucciones RETURN, RETLW y RETFIE se saca el contenido del nivel superior de la misma.

Figura 2.6. Paginado de memoria de programa.

2.2.2. Memoria de Datos Los microcontroladores PIC funcionan con datos de 8 bits por lo que las posiciones de la memoria de datos tienen esa longitud. La memoria de datos se organiza en "bancos", pudiendo existir hasta cuatro en los modelos de mayor capacidad (figura 2.7).

El banco 0 tiene un tamaño de 32 bytes, mientras que todos los demás sólo disponen de 16. El banco 0 ocupa las 32 primeras posiciones de la memoria y lo poseen todos los modelos de PIC16XXX. Las 16 posiciones de menos peso de los bancos 1, 2 y 3 no son accesibles y cuando se direcciona desde el valor 00h al 0Fh, siempre se acude al banco 0. Cuando la dirección está comprendida entre la 10h y la 1Fh, hay que seleccionar a cuál de los cuatro posibles bancos corresponde con los bits 6 y 5 del registro FSR. La memoria de datos funciona de forma similar al "banco de registros" de un procesador por lo cual sus posiciones implementan registros de propósito especial y de propósito general. Las ocho primeras posiciones del banco 0 soportan registros específicos. En un PIC16F84A tenemos dos zonas de memoria de datos: RAM estática o SRAM, donde residen los Registros Específicos (SFR) con 24 posiciones de tamaño byte, aunque dos de ellas no son operativas y los Registros de Propósito General (GPR) con 68. La RAM del PIC16F84A se halla dividida en dos bancos (banco 0 y banco 1) de 128 bytes cada uno. EEPROM, de 64 bytes donde, opcionalmente, se pueden almacenar datos que no se pierden al desconectar la alimentación.

Figura 2.7. Mapa de memoria de datos.

En el 16F84A se toman 9 bits para seleccionar una localidad en la memoria de datos (figura 2.8). Figura 2.8. Direccionamiento de memoria.

Existen 2 modos de direccionamiento para acceder a cualquiera de las posiciones de la memoria de datos: Direccionamiento directo: La posición de memoria con la que se trabaja viene directamente definida en el código de la instrucción. Direccionamiento indirecto: La posición de memoria con la que se trabaja viene definida por el contenido del registro FSR (Posición 04h, 84h, 104h o 184h), es decir, el registro FSR actúa como puntero de la posición de memoria con la que se pretende operar.

Figura 2.9. Direccionamiento directo e indirecto en un PIC. Tanto para el direccionamiento directo como el indirecto la dirección completa (9 bits) no se puede obtener del código de la operación (7 bits) o del registro FSR (8 bits), por lo que: Para direccionamiento directo, la dirección a operar se obtiene completando la dirección incluida en el código de la instrucción con los bits RP1:RP0 del registro STATUS. Para direccionamiento indirecto, la dirección se obtiene completando el contenido del registro FSR con el bit IRP del registro STATUS. Tabla 2. Modos de direccionamiento.

Banco accedido 0 1 2 3

Directo (RP1:RP0) 0 0 0 1 1 0 1 1

Indirecto (IRP) 0 1

2.2.3. Registros especiales Los registros de propósito general son las áreas de la RAM donde el usuario puede alojar datos de manera temporal mediante la creación de variables. Los registros especiales en cambio sirven para evaluar y controlar el funcionamiento del dispositivo, por lo que merecen especial atención. Estos registros están repartidos en dos bancos, el 0 y el 1, y situados en las 12 primeras posiciones o registros de cada uno (00h-0Bh, y 80h-8Bh). La figura 2.10 muestra los registros especiales del 16F84A clasificados por banco.

Figura 2.10. Registros especiales en la memoria de datos del 16F84A. Revisamos ahora la descripción de los registros especiales más comúnmente usados. Registro INDF (00h y 80h). El registro INDF (Indirect File) que ocupa la posición 00 no tiene existencia física, por lo que no se podrá acceder a él. En realidad, este registro sirve únicamente para especificar la utilización del direccionamiento indirecto junto con el registro FSR. Registro TMR0 (01h). El registro TMR0 (Timer 0) almacena el valor del contador TMR0, que como ya sabemos, está funcionando continuamente e incrementando el

valor que tiene almacenado. Las opciones que controlan este contador residen en el registro OPTION. El registro TMR0 se incrementa en una unidad con cada impulso de reloj seleccionado mediante el registro OPTION. Cada vez que llega al valor FF, vuelve a 00 generando una interrupción, si se ha autorizado, y continúa su ciclo indefinidamente. El registro TMR0 se puede leer o escribir directamente con cualquier instrucción, con el fin de conocer su posición actual, o para inicializarlo en un estado determinado. Es importante saber que después de cualquier escritura en este registro, es necesario un retardo de dos ciclos de instrucción para que se retome la incrementación, independientemente de la fuente de reloj usada. Las instrucciones concernidas son MOVF TMR0 o CLRF TMR0. El reloj interno deja de funcionar en el modo SLEEP, por lo que no se puede contar con sus interrupciones en este modo ni por consiguiente, que salga de este modo de funcionamiento por medio de dicha interrupción. Obsérvese que todas las instrucciones que escriben en el TMR0 ponen a cero al prescaler (divisor), cuando éste está asignado al temporizador. Contador de programa PC (02h y 82h). Este registro, normalmente denominado PC (Program Counter), es equivalente al de todos los microprocesadores y contiene la dirección de la próxima instrucción a ejecutar. Se incrementa automáticamente al ejecutar cada instrucción, de manera que la secuencia natural de ejecución del programa es lineal, una instrucción después de la otra. Algunas instrucciones (que llamaremos de control) cambian el contenido del PC alterando la secuencia lineal de ejecución. Otras instrucciones de control como los saltos condicionales, que producen un incremento adicional del PC si se cumple una condición específica, haciendo que el programa salte, sin ejecutar, la instrucción siguiente. El PC está implementado por dos registros, PCLATH (5 bits) y PCL (8 bits) o Los 8 bits de menor peso del PC los proporciona el registro PCL (02h) y a diferencia de la mayoría de los microprocesadores convencionales, es también un registro accesible al programador como registro de memoria interna de datos. Es decir que cualquier instrucción común que opere sobre registros puede ser utilizada para alterar el PCL y desviar la ejecución del programa. o Los 5 bits de mayor peso del PC que no pueden leerse ni escribirse directamente proceden del registro PCLATH en la dirección 0Ah y 8Ah. En la instrucción de salto relativo, el resultado de las mismas sólo afecta a los 8 bits de menor peso. Los 5 bits de mayor peso se suministran desde PCLATH (figura 2.11 (a)). En las instrucciones GOTO y CALL se efectúa la misma operación teniendo presente que el PC se codifica mediante 11 bits y se suministran en la propia instrucción, desde el código OP. Los dos bits de más peso del PC de cargan con los bits 4 y 3 del registro PCLATH (figura 2.11 (b)). Dado que la memoria de programa se organiza en páginas de 2 K, la posición de la memoria la indican los 11 bits de menor peso del PC y los 2 bits de mayor peso

indican la página. El reset pone a 0 todos los bits de PCL y PCLATH haciendo que el reinicio comience en la dirección 0000h.

(a) (b) Figura 2.11. Carga del PC: (a) Por salto relativo; (b) Por salto absoluto. Los ocho registros de pila no están situados en el mismo espacio de memoria que los demás (figura 2.12). Son registros de trece bits capaces de contener íntegramente al PC. Su utilización es automática, ya que el PC se introduce en la pila durante la ejecución de una instrucción CALL o de una interrupción, y se extrae de la pila durante la ejecución del retorno correspondiente.

Figura 2.12. Posición del STACK o pila, círculo verde. Cuando los datos contenidos en el PC son almacenados o extraídos de la pila el registro PCLATH no se ve modificado. Estos registros de pila deben considerarse como un buffer de memoria circular, lo que significa que, si se introduce más de 8 valores del PC, el noveno valor tomará la posición del primero, y así sucesivamente. Ningún bit de registro indica que la pila está llena, por lo que debemos tener cuidado de que no se desborde. Registro de Estado (03h y 83h). El registro de Estado (STATUS) contienen varios bits de estado de la unidad central, el estado aritmético de la ALU, el estado del reset y un par de bits de selección de página denominados RP1 y RP0. Ocupa la posición 03h del banco 0 y la 83h del banco 1. Algunos de estos bits los podemos cambiar manualmente a través del programa. Otros no los activamos nosotros, sino que los activa automáticamente el PIC cuando se dan ciertos procesos. Estos bits se llaman flags (banderas). Para hacernos una idea práctica una bandera se levanta (se

pone a 1) cuando ha pasado algo, al igual que ocurre en el fútbol con los linieres. El registro STATUS está formado por 8 bits (figura 2.13).

Figura 2.13. Organización del registro STATUS. R/W significa que el bit correspondiente se puede leer y escribir, mientras que R significa que solamente puede ser leído. También se indica el estado que se establece tras un reset. Dada la importancia del registro, listamos a continuación las características de cada bit. o Bit 7, IRP: Selección del banco en direccionamiento indirecto. Este bit junto con el de más peso del registro FSR sirven para determinar el banco de la memoria de datos seleccionado. En el PIC16X84 al disponer de dos bancos no se usa y debe programarse como 0. o Bit 6 y 5, RP0 y RP1: Register Bank Select. Selección de página o banco de la memoria con direccionamiento directo. Cada página contiene 128 bytes. Como el PIC16X84 sólo tiene dos bancos únicamente se emplea RP0 de forma que cuando vale 0 se accede al banco 0 y cuando vale 1 se accede al banco 1. Después de un reset, RP0 se pone automáticamente a 0. RP1 debe mantenerse a 0. El bit RP1 deberá ser puesto a cero, ya que si no nos saldríamos del rango de memoria.

Figura 2.14. Configuración de bits para selección de bancos. o Bit 4 (flag), TO: Time Out. Tiempo de término o acabado, es una bandera o señalador: 1. Se pone a 1 tras conectar la alimentación o al ejecutar CLRWDT o SLEEP. 0. Se pone a 0 por desbordamiento del Perro Guardián WDT. o Bit 3 (flag), PD: Power Down. Apagado, también es una bandera: 1. Se pone automáticamente a 1 tras conectar la alimentación V DD o ejecutar CLRWDT, que resetea el contador WatchDog.

0. Se pone a 0 al ejecutar la instrucción SLEEP. o Bit 2 (flag), Z. Bandera indicadora de cero (Zero) aritmético: 1 ...


Similar Free PDFs