You are on page 1of 32

Práctica 2: Arquitectura y

programación de controladores
Micro-controladores
Concepto de microcontrolador: sistema microcomputador
completo en un chip destinado a resolver una tarea específica.
•Núcleo microprocesador+memoria (instrucciones, datos)
+elementos de entrada/salida. Estos recursos varían en función del
fabricante y del modelo:
- Memoria no volátil para programa
- Memoria volátil para datos <y una parte no volátil>
- Puertos paralelo y/o serie (I2C, RS232, USB, ..).
- Convertidores A/D y D/A, comparadores analógicos, PWM,..
- Temporizadores digitales, perro guardián, etc
Micro-controladores PIC
(Web del fabricante: www.microchip.com )

CARACTERÍSTICAS GENERALES
• Gama muy amplia de modelos para elección óptima en función
de los requisitos de la aplicación.
• Disponibilidad de herramientas de desarrollo de hardware y de
software de bajo coste.
 Distintas alternativas de
programación (ROM, OTP, y
FLASH) para optimización de coste en función del número de
unidades.
Arquitectura de micro-controladores PIC
 Arquitectura RISC tipo Harvard:
-Memoria de datos y de programa separadas: instrucciones y datos de distinta longitud y
posibilidad de acceso simultáneo mediante buses distintos.
-Repertorios reducido de instrucciones máquina; todas las instrucciones de una palabra
(longitud constante).
-Cauce segmentado de dos etapas: simultaneidad de ejecución de una instrucción y
captación de la siguiente.

 Compatibilidad ascendente de código (o conversión fácil)


entre familias.

 La misma arquitectura implementada con distintos tamaños y


tipos de memoria (re-programable o no), y distintos recursos de
entradas/salidas.
Familias de micro-controladores PIC con data-path de 8 bits
(www.microchip.com)
Arquitecturas de 16 y 32 bits

Explorar las distintas familias en www.microchip.com


Arquitectura de referencia:
16X84
Un referente histórico: Subfamilia de
microcontroladores de gama media:
PIC16X84

La Flash admite hasta 1000 regrabaciones y la EEPROM de datos hasta


1.000.000, con tiempos de retención superiores a 40años
Diagrama de bloques de los PIC16X84

Flash(F)
ó RAM
ROM(CR)

-La ALU opera con datos de 8 bits, uno de


los operandos en el registro auxiliar W, el
otro de RAM o un literal.
-Los 64 Bytes de EEPROM sólo para
memorización de datos no volátil (acceso a
la EEPROM mediante registros específicos).
Estructura interna
Estructura interna delPIC16x83
de los PIC16F84y 16x84

GPR (68x8)

RP0

Todos los recursos del PIC accesibles como


registros de 8 bits de la RAM de datos (GPR+SFR)
Organización de las memorias de los PIC16x84

Memoria de programa
(1Kx14bits) y Pila (8x13bits)
El PIC16x84 sólo tiene implementadas
las primeras 1024 posiciones de las 8K
posibles del mapa de memoria

Otras posiciones especiales accesibles


en tiempo de grabación:
códigos de identificación (ID)
y palabra de configuración
Banco de registros (RAM de
datos y registros específicos)

90 registros de 8 bits organizados


en 2 bancos:
- 22 registros específicos en las posiciones
00h a 0Bh de los bancos 0 y 1.
- Los 68 registros de propósito general en las
posiciones 0Ch a 4Fh, “duplicados” en ambos
bancos.

El valor de RP0 (bit 5 del registro


STATUS) define el banco al que se accede
cuando se direcciona un registro. (RP0=0
tras un reset)

Los puertos de E/S están asignados a las


posiciones 05h y 06h del banco 0. La
configuración de sus líneas se fija en los
registros TRISA y TRISB
(1:entrada; 0:salida).

Registro INDF, dirección utilizada para direccionamiento indirecto


Distribución y funciones de los terminales (pines)
 RA4 .. RA0: Puerto de E/S A
RA4 compartido con T0CKI: entrada de pulsos
para el temporizador interno TMR0
 RB7 .. RB0: Puerto de E/S B
RB0 también utilizada como línea de petición
externa de interrupción (INT)
RB4 a RB7 pueden configurarse como fuente
externa de interrupción (en respuesta a un
cambio en alguna de estas líneas)
 (+VDD-VSS) : tensión de alimentación (de 4.5
a 5.5Volt ó de 2 a 6 Volt, según modelo)
 OSC1/CLKIN, OSC2/CLKOUT: para distintas
configuraciones del circuito externo de reloj
 MCLR#: reset activo en baja; también
utilizado para aplicar tensión de programación
Vpp (entre 12 y 14Volt). Los bits de datos y
pulsos de reloj de programación se aplican en
RB7 y RB6 respectivamente.
PIC 16X84: Ciclo de instrucción
A partir de la señal de reloj se generan internamente 4 fases (Q1 a Q4). La
ejecución completa de una instrucción abarca los ciclos de captación (fetch) y de
ejecución (en total 8 pulsos de reloj). Pero gracias a la segmentación se
consigue un ciclo efectivo de instrucción de 4 pulsos (1μseg si Fclock = 4Mhz) .
Las instrucciones de bifurcación y de llamada/retorno a/de subrutina ocupan el
doble de pulsos.
Descripción y uso de los recursos del PIC
Direccionamiento de datos en RAM:
Directo: Se accede al registro cuya dirección viene dada por 7 bits en la propia
instrucción, y el bit más significativo de la dirección (indicador de banco) viene dado
por RP0 (bit 5 del registro STATUS)
Indirecto: El registro INDF (dirección de RAM 0x00): se emplea para direccionamiento
indirecto de registros. Una referencia a INDF hace que se acceda a la dirección de
registro contenida en el registro FSR.

Registro de estado (STATUS)


Contiene los indicadores de banco de memoria de datos (IRP, RP1 y RP0), de
estado de reset (TO# y PD#, bits de sólo lectura), y del resultado de operaciones
con la ALU (Z,DC y C).
En el 16F84 los bits IRP e RP1 se dejan a 0 (se utilizan en direccionamiento
indirecto y directo respectivamente, para acceder a los bancos 3 y 4 de otros PICs
de la gama media).
Cuadro resumen de los registros especiales
Cuadro resumen de los registros especiales (cont.)
Control de los puertos de E/S
Cada línea de los puertos A y B puede configurarse individualmente como entrada o
como salida, con los correspondientes bits de los registros TRISA y TRISB.
Inicialmente, o tras un reset, están configuradas como entradas.

Además, mediante bits específicos de los registros OPTION e INTCON se configura la


funcionalidad de ciertas líneas multiplexadas de los puertos A y de B.

Bus_DATOS

WRITE Port

Bus_DATOS

Bus_DATOS

WRITE TRIS_Port
Ejercicio 1: Control de E/S

Modificar ejercicio1.c para que en reposo sólo esté


encendido el led D1 y al pulsar el botón, sólo el D2
Ejercicio 1: Control de E/S

Ayuda del compilador para las funciones de E/S:

Cuestión:¿Qué tendrías que cambiar en el código si el pulsador estuviese


conectado al PIC en una configuración pull-down en vez de pull-up?
Ejercicio 2: Control de E/S

Modificar ejercicio2.c para que incremente el dígito


cada segundo y al pulsar el botón se ponga a 0
Ejercicio 2: Control de E/S

Ayuda del compilador para las funciones de retado:

Cuestión:¿Por qué es necesaria la directiva #use delay en el


código del ejercicio 2?
Temporizador/contador de 8 bits TMR0:
Como temporizador se incrementa en 1 cada ciclo de instrucción (Fosc/4), partiendo
del valor inicial deseado. Activa un señalizador (y puede provocar una interrupción)
cuando se desborda (al pasar de FFh a 00H).
Utilizado como contador, cuenta los impulsos que recibe en la entrada RA4/T0CKI.
También señala, y puede producir una interrupción, el paso de FFh a 00h.
La configuración del modo de funcionamiento se elige con los bits T0CS (Timer 0
Clock Source Select) y T0SE (Timer 0 clock Edge Select) del registro OPTION.
Temporizador/contador de 8 bits TMR0:

Toverflow= 4*Tosc*(256 - TMR0_inicial10) *Factor_prescaler

Funciones para usar el timer0

Valores prescaler
Ejercicio 3: Timer0 como contador

Modificar ejercicio3.c para que el dígito se incremente cada 2 pulsaciones


del botón conectado a RA4 y se ponga a 0 al pulsar el botón en RA0
Ejercicio 4: Timer0 como temporizador

Dado electrónico: modifica el archivo ejercicio4.c para que al pulsar


el botón conectado a RA0 se muestre un número entre 1 y 6
Interrupciones en el PIC16x84
El comportamiento del PIC frente a una interrupción es similar al de ejecución de
una instrucción CALL. La interrupción hace que el valor actual del contador de
programa se guarde en la pila y se cargue con la dirección 0004h (vector de
interrupción). En esta posición suele ubicarse una instrucción GOTO a la rutina de
atención de la interrupción (RSI).
La RSI debe comenzar determinando la causa de la interrupción y preservando los
registros que vaya a modificar (restaurando sus valores antes de retornar con
RETFIE).

-Activación del terminal RB0/INT


Causas o
-Desbordamiento del temporizador TMR0
fuentes de
-Cambio de estado de alguna de las 4 entradas: RB4 a RB7.
interrupción
-Fin de escritura en la EEPROM de datos.

Cada fuente de interrupción tiene asociado un flag o bit indicador de petición de


interrupción, y un bit específico de permiso de interrupción. Los flags se activan con las
peticiones de interrupción, aunque no estén permitidas. La RSI debe anular los flags
oportunos para evitar el anidamiento indeseado de interrupciones.
Existe además un bit de permiso global de interrupciones (GIE), que se anula
automáticamente al atenderse una interrupción, y se activa al ejecutarse RETFIE.
INTCON: registro de control de interrupciones
GIE (bit de permiso global de interrupciones):
1: se permiten todas las interrupciones, de acuerdo con sus bits de permiso individuales.
0: prohíbe todas las interrupciones.
EEIE (bit de permiso de interrupción por fin de escritura en la EEPROM) (*):
1: interrupción permitida. 0: interrupción prohibida.
T0IE (permiso de interrupción por desbordamiento de TMR0):
1: interrupción permitida. 0: interrupción prohibida.
INTE (permiso de interrupción por activación del pin RB0/INT):
1: interrupción permitida. 0: interrupción prohibida.
RBIE (permiso de interrupción por cambio de estado en RB7:RB4):
1: interrupción permitida. 0: interrupción prohibida.
INTCON: registro de control de interrupciones (cont.)

T0IF (indicador -flag- de desbordamiento de TMR0).


INTF (indicador de activación del pin RB0/INT).
RBIF (indicador cambio de estado en alguno de los pines RB7 a RB4).

(*) El indicador de fin de escritura en la EEPROM se encuentra en el registro EECON1

Lógica de control de interrupciones


Las peticiones de interrupción (excepto el desbordamiento de TMR0) también pueden “despertar” al
PIC cuando está en modo de reposo (sleep), siempre y cuando los correspondiente flags se hayan
activado antes de ejecutarse SLEEP. Dependiendo del valor de GIE, el PIC despierta ejecutando la
siguiente instrucción a SLEEP (si GIE=0) o bifurcando al vector de interrupción (si GIE=1).

(*)
Programación de interrupciones en C (CCS)
El compilador se encarga de generar el código necesario para guardar y restaurar el
estado del procesador, y también de borrar el flag de la correspondiente interrupción
(lo hace al final de la RSI).
El programa principal debe habilitar la(s) interrupción(es) y definir las rutinas de
interrupción necesarias.

► La directiva #INT_XXXX
encabeza la rutina de interrupción del tipo XXXX (los modos disponibles dependen del
micro, está definidos en el correspondiente archivo de cabecera, ej. 16F84.h)

► Para habilitar e inhabilitar interrucciones se emplean las funciones


ENABLE_INTERRUPTS() y DISABLE_INTERRUPTS()
Ejemplos: disable_interrupts(GLOBAL); // inhabilita todas las interrupciones
disable_interrupts(INT_TIMER0); // inhabilita la interrupcion por TIMER0
enable_interrupts(INT_EEPROM); // habilita int. por escritura en EEPROM
enable_interrupts(INT_RB); // habilita interrupcion por RB
// pero aun no puede produirse ninguna interrupcion
// hasta que se aplica la habilitacion global con la siguiente instruccion:
enable_interrupts(GLOBAL);
Ejercicio 5: Interrupciones

Modificar el archivo ejercicio5.c para que el dígito se incremente con un delay


de un segundo, y que al pulsar el botón conectado a RB0, se ponga a 0
Recursos de familias avanzadas: PIC 18
- Amplían repertorio de instrucciones
- Mayores tamaños de memoria, tanto de código como de datos (RAM)
- Más modos de direccionamiento
OBJETIVO: mayor eficiencia de compilación de C
- Recursos hardware adicionales:
 Más temporizadores (timer1, timer2, timer3, …) con distinto tamaño (16 bits)
y opciones de configuración (post-escaler, compare&reset, …)
 Multiplicador hardware 8x8
 Interrupciones con distinta prioridad
 Comunicación serie: MSSP (I2C, SPI), USART, USB
 Comunicación paralelo: PSP, SPP
 Módulos CCP (Capture, Compare and PWM)
 Conversión A/D multicanal
…

You might also like