Sobre mi.

Mi foto
Santander, CANTABRIA, Spain
Bienvenido a mi Blog, soy César Zazo Serrano y os mostraré las actividades realizadas durante el curso 2012/2013 en la asignatura de desarrollo y construcción de prototipos electrónicos que imparte nuestro profesor Don José Luis Del Val en el Centro Integrado De Formación Profesional Nº1 situado en Peñacastillo.

jueves, 14 de marzo de 2013

ESTRUCTURA INTERNA DEL PIC 16F877

En la siguiente entrada tal y como indica su titulo voy a estudiar la estructura interna de un PIC16F877.

Datasheet de PIC16F877 : Descarga



Las principales características con que cuenta el 16F877 son:



  • Procesador de arquitectura RISC avanzada
  • Juego de 35 instrucciones con 14 bits de longitud. Todas ellas se ejecutan en un ciclo de instrucción menos las de salto que tardan 2.
  • Frecuencia de 20 Mhz
  • Hasta 8K palabras de 14 bits para la memoria de codigo, tipo flash.
  • Hasta 368 bytes de memoria de datos RAM
  • Hasta 256 bytes de memoria de datos EEPROM
  • Hasta 14 fuentes de interrupción internas y externas
  • Pila con 8 niveles
  • Modos de direccionamiento directo, indirecto y relativo
  • Perro guardian (WDT)
  • Código de protección programable
  • Modo Sleep de bajo consumo
  • Programación serie en circuito con 2 patitas
  • Voltaje de alimentación comprendido entre 2 y 5.5 voltios
  • Bajo consumo (menos de 2 mA a 5 V y 5 Mhz)

El siguiente diagrama vemos los pines del PIC16F87X:




Donde:

PIN
DESCRIPCION
OSC1/CLKIN(9)
Entrada para el oscilador o cristal externo.
OSC2/CLKOUT
(10)
Salida del oscilador. Este pin debe conectarse al cristal o resonador. En caso de usar una red RC este pin se puede usar como tren de pulsos o reloj cuya frecuencia es 1/4 de OSC1
MCLR/VPP/
THV(1)
Este pin es el reset del microcontrolador, también se usa como entrada o pulso de grabación al momento de programar el dispositivo.
RA0/AN0(2)
Puede actuar como línea digital de E/S o como entrada analógica del conversor AD (canal 0)
RA1/AN1(3)
Similar a RA0/AN0
RA2/AN2/VREF-(4)
Puede actuar como línea dígital de E/S o como entrada analógica del conversor AD (canal 2) o entrada negativa de voltaje de referencia
RA3/AN3/VREF+(5)
Puede actuar como línea digital de E/S o como entrada analógica del conversor AD (canal 3) o entrada positiva de voltaje de referencia
RA4/T0CKI (6)
Línea digital de E/S o entrada del reloj del timer 0. Salida con colector abierto
RA5/SS#/AN4(7)
Línea digital de E/S, entrada analógica o selección como esclavo de la puerta serie síncrona.
RB0/INT(21)
Puerto B pin 0, bidireccional. Este pin puede ser la entrada para solicitar una interrupción.
RB1(22)
Puerto B pin 1, bidireccional.
RB2(23)
Puerto B pin 2, bidireccional.
RB3/PGM(24)
Puerto B pin 3, bidireccional o entrada del voltaje bajo para programación
RB4(25)
Puerto B pin 4, bidireccional. Puede programarse como petición de interrupción cuando el pin cambia de estado.
RB5(26)
Puerto B pin 5, bidireccional. Puede programarse como petición de interrupción cuando el pin cambia de estado.
RB6/PGC(27)
Puerto B pin 6, bidireccional. Puede programarse como petición de interrupción cuando el pin cambia de estado. En la programación serie recibe las señales de reloj.
RB7/PGD(28)
Puerto B pin 7, bidireccional. Puede programarse como petición de interrupción cuando el pin cambia de estado. En la programación serie actúa como entrada de datos
RC0/T1OSO/
T1CKI(11)
Línea digital de E/S o salida del oscilador del timer 1 o como entrada de reloj del timer 1
RC1/T1OSI/
CCP2(12)
Línea digital de E/S o entrada al oscilador del timer 1 o entrada al módulo captura 2/salida comparación 2/ salida del PWM 2
RC2/CCP1(13)
E/S digital. También puede actuar como entrada captura 1,/salida comparación 1/ salida de PWM 1
RC3/SCK/SCL
(14)
E/S digital o entrada de reloj serie síncrona /salida de los módulos SP1 e I2C.
RC4/SDI/SDA
(15)
E/S digital o entrada de datos en modo SPI o I/O datos en modo I2C
RC5/SDO(16)
E/S digital o salida digital en modo SPI
RC6/TX/CK(17)
E/S digital o pin de transmisión de USART asíncrono o como reloj del síncrono
RC7/RX/DT(18)
E/S digital o receptor del USART asíncrono o como datos en el síncrono
RD0/PSP0-
RD7/PSP7
(19-22, 27-30)
Los ocho pines de esta puerta pueden actuar como E/S digitales o como líneas para la transferencia de información en la comunicación de la puerta paralela esclava. Solo están disponibles en los PIC 16F874/7.
RE0/RD#/AN5
(8)
E/S digital o señal de lectura para la puerta paralela esclava o entrada analógica canal 5.
RE1/WR#/AN6
(9)
E/S digital o señal de escritura para la puerta paralela esclava o entrada analógica canal 6.
RE2/CS#/AN7
E/S digital o señal de activación/desactivacion de la puerta paralela esclava o entrada analógica canal 7.
VSS(8,19)
Tierra.
VDD(20,32)
Fuente (5V).


En la siguiente fotografía se muestra el diagrama de su estructura interna:








En el diagrama podemos identificar la memoria del Programa en la parte superior izquierda con 8K posiciones por 14 bits, también esta presenta la memoria de datos (RAM) de 368 posiciones por 8 bits. La memoria EEPROM 256 posiciones x 8 bits. El procesador propiamente dicho esta formado por la ALU (unidad aritmética lógica) el registro de trabajo W. Tenemos los periféricos I/O Port A, B, C, D, E el TMR0 (temporizador contador de eventos), TMR1 y TMR2 entre otros módulos. También contamos con un registro de instrucción que se carga cada vez que la ALU solicita una nueva instrucción a procesar. En la parte intermedia encontramos algunos bloques como son el Status Reg. que es el registro de estado encargado de anotar el estado actual del sistema, cada vez que se ejecuta una instrucción se llevan a cabo cambios dentro del microcontrolador como desborde, acarreo, etc. Cada uno de esos eventos esta asociado a un bit de este registro. Existe un registro de vital importancia que se llama el Program Counter o contador de programa este registro indica la dirección de la instrucción a ejecutar. El registro en cuestión no es necesariamente secuencial, esto es no se incrementa necesariamente de uno en uno ya que puede darse el caso en el que salte dependiendo si hay una instrucción de bifurcación de por medio o puede haber alguna instrucción de llamada a función y/o procedimiento. También observamos el bloque de la pila, la función de la pila es ser un buffer temporal en el que se guarda el contador de programa cada vez que se suscita una llamada a un procedimiento y/o función (incluyendo interrupciones). Por tanto el nivel de anidamineto es de hasta 8 llamadas. También esta presente el FSR reg. que es el registro que cumple una función similar a la del contador de programa direccionando en este caso la RAM, el FSR es un puntero a una dirección de la RAM. La aparición de mutiplexores se debe a que los datos pueden tener diferentes fuentes. Mas adelante explicamos este punto.

Cuando programamos el microcontrolador debemos siempre tener en mente que es lo que el hace. Cuando lo prendemos asume un valor por defecto, el contador de programa asume la posición cero por tanto el microcontrolador toma la instrucción que se encuentra en esa posición en la memoria de programa y la ejecuta. Al momento de ejecutarla procede a informar si se ha llevado a cabo alguna operación en particular registrándola en el registro de estado (STATUS). Si la instrucción es de salto o bifurcación evaluará las condiciones para saber si continua o no con la siguiente instrucción, en caso que no sea así saltará a otra posición de memoria. En caso el programa haga un llamado a a una función guardará en la pila el valor del contador de programa ejecutará la rutina y al momento que termina restituirá el valor correspondiente para seguir con la siguiente instrucción.

Ciclo de instrucción.

Observemos el siguiente diagrama de tiempos:

El oscilador o cristal genera pulsos, cada uno de los cuales se les llama cuadratura Q1, Q2, Q3 y Q4. Toda instrucción tiene asociada dos procesos uno de búsqueda y otro de ejecución, cada uno de ellos ocupa un ciclo de instrucción. La primera tarea que se lleva a cabo es la búsqueda, internamente el contador de programa se incrementa en Q1. La búsqueda de la siguiente instrucción se lleva a cabo en Q4. La instrucción es ejecutada en el siguiente ciclo de instrucción como lo muestra el diagrama.

También debemos notar que los procedimientos de búsqueda y ejecución de una misma instrucción son secuenciales mas son paralelos para diferentes instrucciones, es decir que mientras se ejecuta una instrucción la ALU ya esta buscando la siguiente por tanto se asume que el tiempo de ejecución de una instrucción es un ciclo de instrucción salvo que sea una instrucción de salto o bifurcación en cuyo caso el tiempo es de dos ciclos de instrucción dado que el procesador no sabe hacia donde va a saltar lo normal es introducir un ciclo muerto a fin que evalúe la condición necesaria y recién proceda a saltar.

Organización de la memoria.

La memoria se divide en memoria de datos y programa. La de datos a su vez se divide en:

  • SFR (Special Function Register) Registros de propósito especial, son registros que ayudan a configurar el hardware interno así como sirven para escribir o leer valores de los diferentes componente que constituyen el microcontrolador. Por ejemplo el registro “trisa” que nos permite configurar el modo de trabajo de las líneas del puerto A

  • GFR (General Function register) Registros de propósito general, son posiciones de memoria que podemos usar para almacenar valores que emplean nuestros programa

Debe señalarse también que la memoria de datos se divide en cuatro bancos (esto para el caso específico del 16F87X). Las posiciones bajas siempre están reservadas para los SFR en tanto que las altas para los GFR.

También tenemos una memoria EEPROM, con 256 posiciones, para acceder a la memoria no podemos leer o escribir directamente es decir colocar la dirección y obtener o dejar el valor. Para trabajarla debemos apoyarnos en registros adicionales de tal forma que la usamos indirectamente



El contador de programa tiene 13 bits con los cuales se pueden direccionar 8K posiciones. Cuando levantamos el microcontrolador el contador de programa siempre apunta a una dirección conocida como el VECTOR DE RESET, la dirección es la posición de memoria 0000h. También existe otro vector llamado de VECTOR DE INTERRUPCIONES que ocupa la posición 0004h. Cuando se lleva a cabo una petición de interrupción el contador de programa va automáticamente a esa posición en busca de las instrucción que atiendan la petición de interrupción. Como se ha mencionado la pila trabaja con el contador de programa cada vez que hay una instrucción de llamada a procedimiento o función (call) el contador de programa se almacena allí y va en busca de la rutina, cuando acaba la rutina (con la ejecución de una instrucción return retfie o retlw) se restituye el valor del contador de programa, la capacidad de la pila es de 8 posiciones en caso tengamos un desborde (ej 9 llamadas anidadas) la pila se dice que se desborda y vuelve a 0. Por tanto hemos de pensar que la pila también cuenta con un contador que indica cual es la siguiente dirección vacía.


















No hay comentarios:

Publicar un comentario