Está en la página 1de 28

Depto.

Arquitectura y Tecnología de Computadores


ETSII, Universidad de Granada
Grado en ITT

SISTEMAS ELECTRÓNICOS DIGITALES

3. Sistemas con microcontroladores

3.1 Arquitectura y programación de microcontroladores.


3.2. Condiciones de inicialización, interrupciones, modos de
bajo consumo.
3.3 Recursos internos para E/S: Puertos paralelo y serie,
conversión A/D y módulos CCP.
3.4 Diseño de sistemas con microcontroladores: selección del
microcontrolador; conexión de memorias externas; conexión
de los puertos y buses externos del microcontrolador.
3.1 Arquitectura y programación de
microcontroladores

Concepto de microcontrolador: sistema microcomputador completo (de


prestaciones limitadas) en un chip destinado a resolver una tarea específica.
•Núcleo microprocesador+memoria (separada para instrucciones y datos)
+elementos de entrada/salida. Estos recursos varían en función del fabricante
y del modelo; siendo habitual:

- Memoria no volátil para programa


- Memoria volátil para datos <y una parte no volátil>
- Puertos paralelo y/o serie (I2C, UART, USB, CAN ..).
- Convertidores A/D y D/A, comparadores analógicos, PWM,..
- Temporizadores digitales, perro guardián, etc

En la asignatura comenzaremos con el estudio detallado de arquitectura y


programación de un microcontrolador básico concreto; y posteriormente
ampliaremos a otros modelos que incorporan recursos no disponibles en el
básico.
Más diferencias entre microprocesadores de uso
general y microcontroladores:
Microprocesador:
- Altas prestaciones (y coste)
- Frecuencias de funcionamiento elevadas (GHz)
- Múltiples unidades y cores en paralelo.
- Pocos modelos disponibles y vida corta.
Microcontrolador:
- Optimizado para sistemas empotrados, ejecutando
programas de aplicación fijos (bajo coste y
prestaciones adaptadas a la aplicación).
- Frecuencias de funcionamiento bajas (MHz)
- Bajo consumo, con versiones especiales para
aplicaciones de muy bajo consumo.
- Arquitectura interna sencilla, con multitud modelos
para elección en función de la aplicación.
Criterios de clasificación de los
microcontroladores
• CPU: (4,8,16 o 32 bits)
• Memoria
RAM: Pequeño tamaño para datos. (ej. 128 bytes ...32 Kbytes)
PROGRAMA: (ej. 1 Kbyte…128 Kbytes):
Máscara: Programada en fábrica.
OTP: Sólo programable una vez.
Flash: Borrable eléctricamente y reprogramable.
EEPROM datos: Almacenamiento no volátil (ej. 16 bytes..1 Kbyte)
• Elementos de Entrada / Salida
E/S digitales organizadas en puertos multi-bit para • Posibilidad de oscilador
entrada/salida en paralelo o en serie interno
Conversores A/D y D/A • Supervisión CPU:
Comparadores analógicos – Watchdog
Generación de PWM (modulación de ancho de pulsos) – Control de tensión (brownout)
Controlador display LCD • Programación ISP
• Contadores / Temporizadores – JTAG: Test y prog.
• Controlador de interrupciones • Modos bajo consumo y reposo
Ejemplo de chip microcontrolador PIC de 8 bits
(de Microchip)
Subfamilias actuales de micro-controladores PIC
con data-path de 8 bits (www.microchip.com)

- Clasificación en gamas básica, media, media-mejorada, y PIC18;


según el repertorio y longitud de palabra de las instrucciones.
- Dominio de la tecnología Flash en todos los modelos.
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 (35 instrucciones en los PIC16F8X);
todas las instrucciones de una palabra (longitud constante).
-Cauce segmentado de dos etapas: simultaneidad de la fase de ejecución de una
instrucción con la fase de 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/salida.

19-septiembre-2011: Microchip vendió su microcontrolador


nº 10.000.000.000
Familia de microcontroladores
PIC16X84 (ver datasheet en SWAD)

La Flash de este PIC 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
Estructura interna
interna delPIC16x83
de los PIC16F84
y 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: reloj opcional 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.
INFO: PIC 16x84: Repertorio de instrucciones
INFO: PIC 16x84: Repertorio de instrucciones
(cont.)
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 los 7 bits del campo
f de la 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 tras un 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 en otros PICs de la gama
media).
INFO: Cuadro resumen de los registros especiales
(ver hoja de características en SWAD)
INFO: Cuadro resumen de los registros especiales (cont.)
Descripción y uso de los recursos del PIC (cont.)
Puertos de Entrada/Salida
Circuito básico de una línea de puerto de E/S :
Bus_DATOS

WRITE Port

Bus_DATOS

Bus_DATOS

WRITE TRIS_Port Salida “desconectada” (high Z)

Una línea de salida mantienen sus valores entre escrituras consecutivas. La línea se
actualiza al final del correspondiente ciclo de instrucción.
Cuando actúa como entrada, su valor se lee al inicio del ciclo de instrucción: con el
flanco ascendente del segundo pulso de reloj (Q2), debiendo mantenerse constante
cierto tiempo antes y después de este flanco.
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 de los puertos A y de B que están multiplexadas para varios usos.
EJEMPLO en ensamblador: configuración de las dos líneas menos
significativas de A como entradas, y el resto como salidas:
bsf 0x03, 5 ; bit RP0 de STATUS a 1: se apunta al banco 1
movlw 0x03 ; valor en W para configuración del puerto
movwf 0x05 ; escritura en registro de configuración TRISA

Funciones básicas para programación en C de CCS:


set_tris_X(): Fija la polaridad de las líneas del puerto X
input_X() y output_X(): lectura y escritura del puerto X
input(pin_Xy): lectura del pin o terminal y del puerto X
output_high(pin_Xy), output_low(pin_Xy) y output_float(pin_Xy): pone en alta, en baja o en alta
impedancia, respectivamente, el pin o terminal y del puerto X.
output_toggle(pin_Xy): cambia el estado del pin y del puerto X. Lo pone en alta si estaba en baja o
lo pone en baja si estaba en alta.
EJEMPLO: set_tris_A(0x03); //configura las dos líneas menos significativas del puerto A como
//entradas; y el resto como salidas
Descripción y uso de los recursos del PIC (cont.)
Temporizador/contador de 8 bits TIMER 0:
Funcionando como temporizador se incrementa en 1 cada ciclo de instrucción
(Fosc/4), partiendo del valor inicial deseado. Cuando se desborda (al pasar de FFh
a 00H), activa un señalizador (flag T0IF) que puede provocar una interrupción.
Utilizado como contador, cuenta los impulsos externos que reciba en la entrada
RA4/T0CKI. También señala, y puede producir una interrupción, al pasar 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.
Tras escribir en su registro TMR0 se pierden 2 ciclos para sincronización.
El perro guardián (WDT: WatchDog Timer):
Temporizador que origina un reset cada vez que se desborda, si esto ocurre
cuando el PIC está en modo de funcionamiento normal. Su control de tiempos es
independiente del TIMER 0. Aunque en el PIC16X84 ambos temporizadores
comparten el divisor de frecuencia, el WDT utiliza un oscilador propio como
base de tiempos, independiente del oscilador de reloj del PIC.

Circuito completo
TIMER0+WDT:
El perro guardián (WDT) en el 16X84:

La actuación del WDT puede estar siempre bloqueada fijando el bit WDTE=0
en la palabra de configuración del PIC (al grabarlo). Si no está bloqueado,
debe ser reiniciado a intervalos de tiempo inferiores al de desbordamiento
(las instrucciones CLRWDT y SLEEP reinician el WDT y el divisor de
frecuencia o post-scaler).

NOTA: Los bits de la palabra de configuración pueden fijarse en CCS con la


directiva #FUSES. Ver la lista de ‘fuses’ disponibles para cada micro en el menú
del compilador: view>valid fuses.

La temporización nominal del WDT en el PIC16X84 es de 18mseg. Con el divisor


de frecuencia puede extenderse hasta 2.3seg. Cuando ocurre un desbordamiento
(Timer-Out) se pone a 0 el bit TO# del registro STATUS.
Registro OPTION
Controla el funcionamiento de TIMER0 y del divisor de frecuencia, y
define características de terminales de interrupción y del puerto B.

PSA: asignación del divisor de frecuencia:


1= se asigna al WDT
0= se asigna al TMR0
T0SE: tipo de flanco en T0CKI:
1= incremento de TMR0 con flancos ascendentes
Factor por el que se divide la frecuencia
0= incremento de TMR0 con flancos descendentes
en función de PS2,PS1,PS0:
PS2,PS1,PS0: control de factor de escala del
divisor.

T0CS: tipo de reloj para el TIMER0:


1= pulsos introducidos en T0CKI (modo contador)
0= pulsos de reloj interno (Fosc/4) (temporizador)
INTEDG: flanco activo para la interrupción externa:
1= flanco descendente
0= flanco ascendente
RBPU#: Resistencias de pull-up en puerto B:
1= desactivadas
0= activadas
Configuración del TIMER0

Sin prescaler (es decir prescaler=1) , y funcionando en modo temporizador, el


registro de este temporizador (TMR0) se incrementa en uno por cada ciclo de
instrucción. En el PIC 16F84, TMR0 es de 8 bits, y admite un pre-scaler máximo
de 256. Por lo tanto el tiempo máximo que puede contar (partiendo de 0 hasta
desbordarse) es:
4·Tosc · 28 · 256
Es decir el mismo tiempo máximo que obtendríamos si el temporizador fuese de
16 bits, y sin divisor de frecuencia (pre-scaler =1)

Si queremos que TMR0 se desborde al trascurrir un tiempo concreto (Tdesb), lo


inicializamos con un valor (TMR0ini) tal que se cumpla (*):
Tdesb = 4·Tosc · (28 – TMR0ini) · pre-scaler

(*) En estos cálculos no consideramos los dos ciclos de sincronización (ver


esquema del TIMER0), que se aplicarían en caso de cuenta de pulsos externos (en
modo contador), y tampoco tenemos en cuenta que, cada vez que se escribe en
TMR0, hay dos ciclos de instrucción de retraso hasta que empieza a incrementarse
(habría que sumar 2·4·Tosc).
Memoria EEPROM de datos interna
El acceso a la memoria de datos no volátil interna del PIC se realiza mediante 4
registros especiales del banco SFR:
EEDATA: registro de dato a escribir o leer en/de la EEPROM.
EEADR: dirección de la EEPROM a acceder .
EECON1: control de la operación de lectura o escritura.
EECON2: registro no implementado físicamente. Se emplea durante la operación de
escritura.

La escritura de un dato en la EEPROM es un proceso lento ( ~5 mseg).


El fin de la escritura se comprueba chequeando el bit EEIF del registro
EECON1. Alternativamente, puede programarse que el fin de la
escritura en la EEPROM produzca una interrupción.

El compilador CCS dispone de las funciones read_eeprom() y


write_eeprom(), que incluye la espera hasta que se haya completado
la escritura (ver en ayuda de CCS)
INFO: EECON1: Registro de control de la EEPROM
RD (bit de lectura): Al ponerlo a 1 se inicia un ciclo de lectura (se actualiza EEDATA con
el contenido de la posición de la EEPROM direccionada por EEADR). RD pasa a 0
automáticamente tras la lectura.
WR (bit de escritura): Su puesta a 1 hace que se inicie un ciclo de escritura. Pasa
automáticamente a 0 cuando se completa el ciclo.
WREN (permiso de escritura):
1: permite la escritura en la EEPROM.
0: prohíbe la escritura.
WRERR (indicador de error en la escritura):
1: indica que la escritura en la EEPROM ha terminado prematuramente (debido a un
reset o a un desbordamiento del WDT).
0: la operación de escritura se ha completado.
EEIF (indicador de petición de interrupción por final del ciclo de escritura ):
Se pone a 1 cuando finaliza la operación de escritura. Debe ponerse a 0 por programa.

También podría gustarte