top of page

PIC16F84 Microchip technology

ARQUITECTURA, CARACTERISTICAS, MODOS DE DIRECCIONAMIENTO Y LENGUAJES USADOS.

ARQUITECTURA INTERNA

Angulo (2005) Un microcontrolador posee todos los componentes de un computador, pero con unas características fijas que no pueden alterarse. Las partes principales de un microcontrolador son:

1. Procesador

2. Memoria no volátil para contener el programa

3. Memoria de lectura y escritura para guardar los datos

4. Líneas de EIS para los controladores de periféricos:

a) Comunicación paralelo

b) Comunicación serie

c) Diversas puertas de comunicación (bus l2ºC, USB, etc.)

5. Recursos auxiliares:

a) Circuito de reloj

b) Temporizadores

c) Perro Guardíán («watchdog»)

d) Conversores AD y DA

e) Comparadores analógicos

f) Protección ante fallos de la alimentación

g) Estado de reposo o de bajo consumo (p.7).



Diagrama de conexión


MCLR/VPP: Reset externo. Por esta patita se aplica también la tensión / VPP usada en la grabación del programa.

RA0/AN0: E/S digital o entrada analógica

RA1/AN1: E/S digital o entrada analógica

RA2/AN2/VREF: E/S digital, entrada analógica o salida de la tensión de referencia

RA3/AN3/ VREF: E/S digital, analógica o entrada externa de

VREF RA4/TOCKI: E/S digital o entrada del reloj para

TMR0 RA5/AN4/SS: E/S digital, analógica o selección del puerto serie sincrono

RB0/INT-RB7: E/S digitales del Puerto B. RB0/INT puede actuar como entrada de interrupción externa. RB4-RB7 pueden provocar interrupción cuando cambian de estado

RE0/RD/AN5: E/S digital del Puerto E. Señal de lectura del Puerto paralelo esclavo. Entrada analógica.

RE1/WR/AN6: E/S digital. Señal de escritura del Puerto paralelo esclavo. Entrada analógica.

RE2/CS/AN7: E/S digital. Señal de activación del Puerto paralelo esclavo. Entrada analógica. VDD: Entrada del positivo de la alimentación

OSC1-2/CLKIN: Entrada al cristal cuarzo o reloj externo

RC0/T1OSO/T1CL1: E/S digital del Puerto C. Conexión del oscilador externo para el temporizador TMR1 o entrada de reloj para el TMR1

RC1/T1OSI/CCP2: E/S digital del Puerto C. Conexión del oscilador externo para TMR1 o salida del módulo 2 de captura/comparación

RC2/CCP1: E/S digital del Puerto C. Salida del módulo 1 de captura/comparación

RC3/SCK/SCL: E/S digital. E/S de reloj para el Puerto serie síncrono (SSP) de los módulos SPI a I2C

RC4/SDI/SDA: E/S digital. Entrada de datos serie en el modo SPI. E/S de datos serie en modo I2C

RC5/SD0: E/S digital del Puerto C. Salida de datos serie en el modo SPI

RC6/TX/CK: E/S digital. Transmisión serie asíncrona. Entrada de reloj para comunicación serie síncrona

RC7/RX/DT: E/S digital. Recepción serie asíncrona. Línea de datos en la comunicación serie síncrona.

RD0/PSP0-RD7/PSP7: E/S digitales del Puerto D. Este Puerto puede trabajar como Puerto paralelo esclavo para interconexión con un bus de datos de 8 bits de otro microprocesador. [6,7]



Las características principales de este dispositivo son:

  • CPU de arquitectura RISC (Reduced Instruction Set Computer).

  • Set de 35 instrucciones.

  • Frecuencia de reloj de hasta 20MHz (ciclo de instrucción de 200ns).

  • Todas las instrucciones se ejecutan en un único ciclo de instrucción, excepto las de salto.

  • Hasta 8K x 14 palabras de Memoria de Programa FLASH (ver tabla a continuación).

  • Hasta 368 x 8 bytes de Memoria de Datos tipo RAM (ver tabla a continuación).

  • Hasta 256 x 8 bytes de Memoria de Datos tipo EEPROM (ver tabla a continuación).

  • Hasta 15 fuentes de Interrupción posibles.

  • 8 niveles de profundidad en la Pila hardware.

  • Modo de bajo consumo (Sleep).

  • Tipo de oscilador seleccionable (RC, HS, XT, LP y externo).

  • Conversor Analógico/Digital de 10 bits multicanal.

  • 3 Temporizadores.

  • Watchdog Timer o Perro Guardián.

  • 2 módulos de captura/comparación/PWM.

  • Comunicaciones por interfaz USART (Universal Synchronous Asynchronous Receiver Transmitter).

  • Puerto Paralelo Esclavo de 8 bits (PSP).

  • Puerto Serie Síncrono (SSP) con SPI. [6,8]


Características generales

Organización de la memoria

Los microcontroladores PIC 16F87X poseen dos bloques de memoria separados, la memoria de programa y los bancos de registros. Las posiciones de la memoria de datos son de 1 byte cada una y las de la memoria de programa de 14 bits. Para direccionar los datos hacen falta 7 bits para elegir posición dentro de un determinado banco y 2 bits más para seleccionar el banco, ya que pueden existir cuatro bancos de registros.

Memoria de programa

Al tener cada posición de memoria un tamaño de 14 bits, en las instrucciones del programa están implícitas las direcciones de los registros o memoria de datos. En una sola palabra se agrupa el código de la instrucción y su dirección. De los 14 bits, 7 se utilizan para indicar su dirección, lo que da un máximo direccionable en la memoria de datos de 128 bytes por banco de registros.


Direccionamiento y paginado

En los PICs 16F87X, el contador de programa (CP) del microcontrolador tiene un tamaño de 13 bits, con lo que es posible direccionar un tamaño total de memoria de programa hasta un máximo de 8k x 14 bits organizada en páginas de un tamaño de 2k x 14 bits. Para manejar microcontroladores de 4 u 8k bytes de memoria de programa, ha de recurrirse a la paginación, cada página tiene una capacidad de 2k, y éstas a su vez, se dividen en 8 subpáginas de 256 bytes. El contador del programa, al estar formado por 13 bits, está compuesto por dos secciones tal y como se muestra en la figura 2.3.1.2. El byte bajo viene del registro de PCL que puede ser leído y escrito. Los bits superiores (PC), están alojados en el registro PCH, sobre el que no se puede leer ni escribir, pero se puede acceder a él indirectamente a través del registro PCLATH. [7]


PROGRAMACION DE MICROCONTROLADORES

La utilización de los lenguajes más cercanos a la máquina (de bajo nivel) representan un considerable ahorro de código en la confección de los programas, lo que es muy importante dada la estricta limitación de la capacidad de la memoria de instrucciones. Los programas bien realizados en lenguaje Ensamblador optimizan el tamaño de la memoria que ocupan y su ejecución es muy rápida. Angulo (2005).

Los lenguajes de alto nivel más empleados con microcontroladores son el C y el BASIC, de los que existen varias empresas que comercializan versiones de compiladores e intérpretes para diversas familias de microcontroladores. En el caso de los PIC es muy competitivo e inte resante el compilador de C PCM de la empresa CCS y el intérprete PBASIC de PARALLAX.

El lenguaje que utilizan los profesionales para la programación de las microcontroladores es el Ensamblador, que es el más cercano a la máquina. También son frecuentes los programas en lenguaje C y en BASIC, siendo este último el más fácil de aprender.


LENGUAJES USADOS

Los autores Angulo (2005) en su libro argumentan que los proyectos con microcontroladores exigen un trabajo con hardware consistente en adaptar las patitas del microcontrolador a los periféricos externos que hay que controlar. Además, también requieren la confección de un programa con las instrucciones precisas para que su ejecución origine el procesamiento de la información para obtener los resultados apetecidos (p.44). Para construir los programas de los microcontroladores se usan tres lenguajes:

  • Lenguaje ensamblador, bajo nivel.

  • Lenguaje C, de alto nivel.

  • Leguaje BASIC, de alto nivel.

El lenguaje Ensamblador se dice que es de bajo nivel porque sus instrucciones son exactamente las que el procesador sabe interpretar y ejecutar. En realidad, el computador digital sólo acepta instrucciones en código binario y el Ensamblador facilita su escritura al programador permitiendo expresarlas mediante «nemónicos», que son tres o cuatro letras significativas que referencian, en inglés, la operación que conlleva la instrucción. Por ejemplo, una instrucción que «mueve» un dato de un sitio (A) a otro (B), en Ensamblador se escribe MOV A, B. El problema surge en el Ensamblador por la poca potencia de las instrucciones que es capaz de ejecutar el procesador. Normalmente las correspondientes a los microcontroladores de 8 bits que manejamos en este libro, consisten en sumar, restar, hacer operaciones lógicas AND, OR, XOR, también rotar un dato de 8 bits, moverlo de un sitio a otro y muy poquito más. Si deseamos hacer una multiplicación hay que confeccionar un programa que para conseguirlo repita las sumas las veces necesarias. Es un lenguaje de «bajo nivel». El programa Ensamblador lo único que hace es traducir los nemónicos con los que se escriben las instrucciones a código binario para que el procesador sea capaz de interpretarlas y ejecutarlas. Los lenguajes de «alto nivel» tienen instrucciones más potentes: saben multiplicar, sacar la raíz cuadrada y realizar funciones y operaciones mucho más complicadas que las que pueden hacer las instrucciones de la máquina. Pero como la máquina es la misma, la realización de esas instrucciones se tiene que hacer con programas de instrucciones elementales. Cada instrucción de alto nivel se convierte en un programita de instrucciones de bajo nivel. Por eso para que el procesador pueda ejecutar las instrucciones de un lenguaje de alto nivel precisa otro programa que las descomponga en las instrucciones de bajo nivel correspondientes. A estos programas se les llama compiladores. Los compiladores se encargan de traducir un programa confeccionado con instrucciones de alto nivel a otro equivalente con instrucciones de bajo nivel. Hay una variante de estos programas que reciben el nombre de intérpretes que realizan dicha traducción pero instrucción por instrucción, o sea, traducen una instrucción de alto nivel en las correspondientes de bajo nivel que ejecuta el procesador y a continuación pasan a la siguiente.

El microcontrolador de los módulos BASIC Stamp contiene en su memoria de programa un Intérprete de PBASIC. Desarrollar programas en lenguaje Ensamblador exige un conocimiento profundo de la arquitectura interna del procesador, lo que requiere una buena base en Electrónica, así como formación en Informática. Las instrucciones de bajo nivel realizan operaciones directamente con los elementos existentes en el interior del procesador. El lenguaje C es de tipo profesional, muy completo y potente, pero su manejo exige una buena formación en Informática. También es muy conveniente conocer la arquitectura interna del procesador y en muchas ocasiones hay que combinarlo con el lenguaje Ensamblador. El lenguaje BASIC tiene potentes instrucciones que se escriben igual que se denominan en inglés y su manejo no requiere conocimientos de arquitectura de procesadores, de Electrónica y tampoco de Informática.

El modo de funcionamiento de los módulos BASIC Stamp está basado en depositar el programa confeccionado en PBASIC y editado en el PC en una memoria EEPROM, que puede leerse y borrarse para volver a escribirse un millón de veces. Después, en el interior del módulo y de forma automática, se va pasando el programa, ordenadamente instrucción a instrucción, a un microcontrolador PIC en cuya memoria está grabado un programa Intérprete que traduce cada instrucción PBASIC en las instrucciones máquina correspondientes y procede a su ejecución. Los dos elementos principales del módulo BASIC Stamp son el microcontrolador, grabado con el Intérprete PBASIC en fábrica, y la EEPROM que contiene el programa editado en el PC.[8]


EL EDITOR STAMP

Al ejecutar cualquiera de los dos programas de edición en el PC disponibles en Internet o en el CD, para MS-DOS (STAMP2.EXE) o para Windows (STAMPWEXE), aparece en la pantalla del PC una ventana para la confección de programas. Con los iconos se pueden abrir programas ya guardados, salvar los que se crean, mandar ejecutarlos, depurar la edición, depurar el programa de diversas maneras y un sinfín de otras funciones que sólo la práctica permiten su dominio.


FORMATO DE EDICIÓN DE PROGRAMAS EN PBASIC

Los autores Angulo (2005) nos mencionan las siguientes: (p.47)

Etiquetas. Los programas en PBASIC no numeran las líneas y es una de las novedades más interesantes respecto a los BASIC clásicos. Cuando se desea hacer mención a una instrucción como no tiene número se le antepone una etiqueta identificativa.

El nombre de las etiquetas no puede coincidir con el de las instrucciones o variables usadas; su primer carácter no puede ser un número, y la primera vez que se usan deben estar seguidas por dos puntos (:). Constantes. Se pueden declarar en decimal, hexadecimal, binario y ASCII. Ejemplos:


Variables y constantes. Para facilitar la programación se utilizan etiquetas para hacer referencia a variables y a constantes. Se emplea el comando CON. Ejemplos:


Comentarios. Detrás de cada instrucción se recomienda escribir algún comentario para facilitar la finalidad de la misma. El procesador ignora los comentarios. Delante del comentario se puede poner REM o un apóstrofe. Ejemplos:

Programa de ejemplo en ensamblador

Este hará que una luz que se desplace, comenzando en el bit 0 del puerto B hasta el bit 8 del mismo, siguiendo al bit 0 del puerto A hasta el bit 5, y después haciendo todo el camino inverso hasta al principio. [9]

TIEMPO equ 9Fh ; Variable para el bucle de retardo.

PORTB equ 06h ; Dirección del Port B.

TRISB equ 86h ; Dirección del registro tri-estado del Port B.

PORTA equ 05h ; Dirección del Port A.

TRISA equ 85h ; Dirección del registro tri-estado del Port A.

STATUS equ 03h ; Registro para seleccionar el banco.

CONTADOR1 equ 0Ch ; Registro para el bucle.

CONTADOR2 equ 0Dh ; Registro para el bucle.

bsf STATUS,5 ; Va al Banco 1

movlw 00h ; y configura

movwf TRISB ; ambos puertos A y B

movlw 00h ; como salidas,

movwf TRISA ; después vuelve

bcf STATUS,5 ; al Banco 0.

movlw 00h ; Pon a 0 el Puerto A.

movwf PORTA ;

; Comienzo del programa

CorreLuz

movlw 01h ; Pon a 1 el primer bit

movwf PORTB ; del Puerto B. PORTB = 00000001

call Retardo ; Espera un momento.

call Retardo ;

; Desplaza el bit a la izquierda, y después pausa.

rlf PORTB,1 ; PORTB = 00000010, C = 0

call Retardo

call Retardo

rlf PORTB,1 ; PORTB = 00000100, C = 0

call Retardo

call Retardo

rlf PORTB,1 ; PORTB = 00001000, C = 0

call Retardo

call Retardo

rlf PORTB,1 ; PORTB = 00010000, C = 0

call Retardo

call Retardo

rlf PORTB,1 ; PORTB = 00100000, C = 0

call Retardo

call Retardo

rlf PORTB,1 ; PORTB = 01000000, C = 0

call Retardo

call Retardo

rlf PORTB,1 ; PORTB = 10000000, C = 0

call Retardo

call Retardo

rlf PORTB,1 ; Este desplaza el bit al flag CARRY.

; PORTB = 00000000, C = 1

; Ahora se moverá al puerto A, desplazando el bit hacia la izquierda.

rlf PORTA,1 ; Esto mueve el bit desde el flag CARRY al puerto A.

; PORTA = 00001, C = 0

call Retardo

call Retardo

rlf PORTA,1 ; PORTA = 00010, C = 0

call Retardo

call Retardo

rlf PORTA,1 ; PORTA = 00100, C = 0

call Retardo

call Retardo

rlf PORTA,1 ; PORTA = 01000, C = 0

call Retardo

call Retardo

rlf PORTA,1 ; PORTA = 10000, C = 0;

call Retardo

call Retardo

; Desplaza el bit de vuelta por el puerto A

rrf PORTA,1 ; PORTA = 01000, C = 0;

call Retardo

call Retardo

rrf PORTA,1 ; PORTA = 00100, C = 0;

call Retardo

call Retardo

rrf PORTA,1 ; PORTA = 00010, C = 0;

call Retardo

call Retardo

rrf PORTA,1 ; PORTA = 00001, C = 0;

call Retardo

call Retardo

rrf PORTA,1 ; Esta desplaza el bit al flag CARRY

; PORTA = 00000, C = 1;

; Ahora desplaza el bit de vuela al Puerto B

rrf PORTB,1 ; PORTB = 10000000, C = 0

call Retardo

call Retardo

rrf PORTB,1 ; PORTB = 01000000, C = 0

call Retardo

call Retardo

rrf PORTB,1 ; PORTB = 00100000, C = 0

call Retardo

call Retardo

rrf PORTB,1 ; PORTB = 00010000, C = 0

call Retardo

call Retardo

rrf PORTB,1 ; PORTB = 00001000, C = 0

call Retardo

call Retardo

rrf PORTB,1 ; PORTB = 00000100, C = 0

call Retardo

call Retardo

rrf PORTB,1 ; PORTB = 00000010, C = 0

call Retardo

call Retardo

rrf PORTB,1 ; PORTB = 00000001, C = 0

call Retardo

call Retardo ; Ahora hemos vuelto a donde empezamos,

;

goto CorreLuz ; Vamos a hacerlo de nuevo.

; La subrutina para hacer el retardo entre los movimientos de bits.

Retardo

movlw TIEMPO ; Cogemos el tiempo de retardo,

movwf CONTADOR1 ; y lo ponemos en una variable.

Bucle1 ;

decfsz CONTADOR1 ; Decrementa el tiempo de retardo hasta

goto Bucle1 ; que alcance cero.

movwf CONTADOR1 ; Cogemos el tiempo de retardo de nuevo,

Bucle2 ; y repetimos la cuenta atrás.

decfsz CONTADOR1 ;

goto Bucle2 ;

return ; Fin de la subrutina.

end ;


bottom of page