Está en la página 1de 45

Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.

07)

Índice

1. Microprocesador 1

2. Microcontrolador 2
2.1. Partes de un microcontrolador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.2. Clasificación de microcontroladores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.3. Instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4. Unidad de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.5. Unidad de memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

3. Microcontrolador AVR de Atmel 8


3.1. Mapa de memoria de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2. Memoria Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.3. Memoria EEPROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.4. Puertos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.5. Fuentes de Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

4. Ensamblador 15
4.1. Directivas al ensamblador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.2. Modos de direccionamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.3. Saltos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.4. Estructura de un programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

5. Arduino Uno 18

6. Interrupciones 20
6.1. Clasificación de interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
6.2. Vectores de interrupción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
6.3. Ejecución de interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
6.4. Interrupciones externas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

7. Conversor analógico digital 23


7.1. ADC de aproximación sucesiva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
7.2. ADC en Microcontrolador Atmega328p . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

8. Temporizadores/Timers 26
8.1. Diagrama en bloques de timer de 8 bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
8.2. Registros del timer0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
8.3. Modos de operación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
8.4. Watchdog timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

9. Comunicación 33
9.1. Clasificación de comunicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
9.2. Interfases para la comunicación serial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
9.2.1. Comunicación serial por USART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
9.2.2. Comunicación serial por SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
9.2.3. Comunicación serial por IIC-TWI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

10.Modos Sleep 39
10.1. Ahorro de energı́a apagando recursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

11.Fuse Bytes 40
11.1. Fusibles de alto byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
11.2. Fusibles de bajo byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

1
12.Motores 42
12.1. PWM en motores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

13.Consideraciones para selección de microcontroladores 43


Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

1. Microprocesador
El microprocesador es un circuito integrado que contiene la unidad central de proceso (CPU), también
llamada procesador de un computador. Se le conecta la memoria y módulos de E/S para configurar un
computador implementado por varios circuitos integrados.

Figura 1: Estructura de Microprocesador.

Es un sistema abierto (configuración variable) con el que puede construirse un computador con las carac-
terı́sticas que se desee, acoplándole los módulos necesarios.

Requieren de otros chips para crear un sistema completo.


Tienen alta capacidad de procesado.
Memorias masivas de datos, con caché, etc.
Suelen ser de propósito general.

Costo elevado

1
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

2. Microcontrolador
El microcontrolador es un sistema cerrado. Todas las partes están contenidas en su interior y solo salen al
exterior las lineas que gobiernan los periféricos.
Se puede definir a un microcontrolador como un computador completo en un chip.

Figura 2: Estructura de Microcontrolador.

2.1. Partes de un microcontrolador


CPU Es la unidad central de procesamiento. Interpreta las instrucciones contenidas en los programas
y procesa los datos. Ejecuta una colección de instrucciones en lenguaje de máquina. Para
realizar la acción de buscar las instrucciones en la memoria y ejecutarlas consta de:

ALU (Unidad Aritmética y Lógica): Conjunto de circuitos digitales que realizan las opera-
ciones tanto lógicas como aritméticas. Sólo realiza operaciones, no toma decisiones. Tiene
un mecanismo de control que le indica que operación debe realizar.
Unidad de Control: Es la encargada de generar las señales correctas para realizar las
operaciones deseadas por el usuario.
• Tiene la lógica necesaria para la decodificación.
• Ejecuta las instrucciones, el control de los registros.
• Controla la ALU, los buses.
• Determina prestaciones del procesador.
• Agrupa componentes tales como la unidad de decodificación, unidad de ejecución,
controladores de buses, controladores de interrupción, pipelines.

Registros Guardan transitoriamente información (pueden ser valores o direcciones de memoria) y accede
a valores usados frecuentemente. Los registros pueden ser de 8/16/32/64-bits. Es una memoria
de alta velocidad y poca capacidad. Los tipos de registros existentes son:
MAR: Buffer que contiene la dirección de entrada a la memoria.
MBR: Buffer que contiene los datos hallados en la dirección de memoria.
De datos (R0 , ..., R31 )
De instrucciones (IR): Se encarga de decodificar las instrucciones.
SREG (Estado de los registros).
Contador del Programa (PC): Señala la dirección de la próxima instrucción a ser ejecu-
tada.

2
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

Buses Grupo de conductores que permite llevar la información entre los distintos bloques de la compu-
tadora digital. Los buses de dirección y datos determinan la capacidad del CPU.

Bus de direcciones: Cada dispositivo (memoria o I/O) tiene que tener asignada una di-
rección de memoria única. El bus de direcciones accede a dichos valores (binario). Cuanto
mayor sea el número, mas dispositivos externos se podrán conectar a la CPU. Es decir,
el número de buses determina el número de locaciones, que se calcula como 2n , con n
el número de lı́neas. Se llaman byte addressable a que cada locación tiene un máximo
de 1 byte. Es un bus unidireccional, es decir, la CPU los usa únicamente para enviar
direcciones.
Bus de control: Transporta todas las señales de control requeridas para controlar el fun-
cionamiento de la transferencia de datos. Se usan para dar la señal de lectura o escritura,
que indica si la CPU esta pidiendo o enviando información.
Bus de datos: Se usa para obtener/mandar datos a una dirección dada fuera de la CPU,
es por esto que, cuanto mayor número de buses de este tipo, mejor el CPU. Suele variar
entre 8 y 64 bits. Son buses bidireccionales, ya que se usan tanto para enviar como para
recibir información. Transfiere datos reales.
Bus interno: Mueve datos entre los componentes internos del microprocesador.
Bus externo: Se utiliza para comunicar el micro y otras partes, como periféricos y memoria.

Figura 3: Disposición de buses.

Periféricos Los posibles periféricos son: Puertos de E/S, Temporizadores, Conversor A/D, Módulo PWM,
Memoria EEPROM, Puertos Serie (USART), Puerto Serie CAN, Reloj interno y externo.
Clock Las operaciones del microprocesador son sincronizadas por un oscilador. Un ciclo de instrucción
consiste de uno o mas ciclos de maquina, y cada ciclo de maquina puede variar desde 1 a 12
pulsos de clock.

2.2. Clasificación de microcontroladores


Las tres clasificaciones principales de microcontroladores son por:

El tamaño de palabra
La clasificación se da según el tamaño del bus de datos. Puede ser de 4bits, 8bits, 16bits o 32bits. El
tamaño se elige según la aplicación que se le quiera dar.

3
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

El acceso a la Memoria de programa y de datos


Von Neumann Los datos y las instrucciones comparten un bus de datos y ambos se guardan en una
memoria común. El funcionamiento se ve retardado porque cuando la CPU se dirige a
la memoria principal primero accede a la instrucción y luego a los datos necesarios para
ejecutarla.

Figura 4: Arquitectura Von Neumann.

Harvard Tiene memorias separadas para las instrucciones y los datos. Cada una de ellas cuenta
con un bus independiente. La ventaja es que tiene acceso en paralelo, es decir que, cuando
la instrucción actual esta utilizando el bus de datos, la siguiente instrucción esta siendo
leı́da. Por lo que, una vez que se termina con una instrucción, en el CPU ya se encuentra
disponible la siguiente.

Figura 5: Arquitectura Harvard.

El tipo de juego de instrucciones máquina


El objetivos es incrementar el rendimiento del procesador. Para esto entran en juego, la tecnologı́a de
proceso (materiales y técnicas utilizadas en la fabricación), el encapsulado (como se integra un proceso con
el sistema) y la arquitectura del procesador que puede ser:

CISC Complex Instruction Set Computer.


Posee gran número de instrucciones complejas.
Permite implementar instrucciones de alto nivel directamente o con un número pe-
queño de instrucciones ensamblador.
Las instrucciones no tienen un tamaño definido, por lo que se complica la tarea del
decodificador de instrucciones.
Gran variedad de tipos de datos y de modos de direccionamiento.
Teniendo tantas instrucciones se necesitan microinstrucciones para implementarlas.
Las instrucciones se ejecutan en mas de un ciclo del reloj.

4
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

RISC Reduced Instruction Set Computer.


Tiene un numero reducido de instrucciones.
El tamaño de todas las instrucciones es fijo y se presenta en un número reducido de
formatos, por lo que la CPU puede decodificar rápidamente la instrucción.
Pocos tipos de datos y de modos de direccionamiento, siempre los más sencillos.
La Arquitectura es del tipo load-store (carga y almacena). Las únicas instrucciones
que tienen acceso a la memoria son ’load’ y ’store’, registro a registro, con un menor
número de acceso a memoria.
El Pipeline* (ejecución simultánea de varias instrucciones) posibilita reducir el núme-
ro de ciclos de máquina necesarios para la ejecución de la instrucción, ya que esta
técnica permite que una instrucción puede empezar a ejecutarse antes de que haya
terminado la anterior.
Por otro lado, esta arquitectura presenta 4 sets de buses. Uno para llevar la data dentro y
fuera de la CPU, otro de direcciones para acceder a la data, un tercero para los códigos de
instrucciones (opcodes) y un último para acceder a las direcciones de los opcodes. Utiliza
el método de hardwire para implementar las instrucciones, lo que toma menos del 10 %
de los transistores.
La arquitectura RISC funciona de modo muy diferente a la arquitectura CISC su objetivo
no es ahorrar esfuerzos externos por parte del software con sus accesos a la memoria RAM
sino facilitar que las instrucciones sean ejecutadas lo mas rápidamente posible.

*La segmentación o pipelining es un método por el cual se consigue aumentar el rendimiento de algunos
sistemas electrónicos digitales. Se usa principalmente en los microprocesadores. La segmentación consiste en
descomponer la ejecución de cada instrucción en varias etapas para poder empezar a procesar una instrucción
diferente en cada una de ellas y trabajar con varias a la vez.

Figura 6: Arquitectura CISC y RISC.

5
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

2.3. Instrucciones
Elementos del lenguaje que se traducen a código máquina Cada instrucción tiene su opcode y sus operan-
dos. El procesador ejecuta las instrucciones para determinar el comportamiento de un sistema.
La secuencia de acciones del ciclo de instrucción se puede resumir en:

1. Se coloca el contenido del PC en el bus de direcciones.

2. La CPU genera una señal de control, para habilitar la lectura de memoria de código.
3. Una instrucción se lee de la memoria de código y se coloca en el bus de datos.
4. La instrucción se toma del bus de datos y se coloca en el IR.
5. El PC es preparado para la siguiente instrucción.

6. El decodificador de instrucción interpreta e implementa la instrucción. Se interpreta la información


como una secuencia de señales de control que son enviadas a las unidades funcionales relevantes de la
CPU para realizar la operación requerida por la instrucción poder terminarla y seguir ası́.
7. El resultado generado por la operación es almacenado en la memoria o enviado a un dispositivo de salida
dependiendo de la instrucción. Basándose en los resultados de la operación, el contador de programa
se incrementa para apuntar a la siguiente instrucción o se actualiza con una dirección diferente donde
la próxima instrucción será recogida.

Figura 7: Ciclo de una instrucción.

Del paso 1 al 5 del ciclo de instrucción se conocen como subciclo de búsqueda o captura (fetch). El ciclo
de búsqueda procesa la instrucción a partir de la palabra de instrucción, que contiene el código de operación
y el operando. Los pasos 6 y 7 forman el subciclo de decodificación y ejecución (decode-execute).

6
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

2.4. Unidad de control


Lógica cableada: Es un circuito combinacional que recibe un conjunto de señales de entrada y lo
transforma en un conjunto de señales de control. Aunque es mas rápida, es mas difı́cil modificarla. Se
utiliza tı́picamente en maquinas RISC.

Lógica microprogramada: Utiliza una memoria de control que almacena las micro-operaciones ne-
cesarias para ejecutar cada una de las instrucciones. cada una de las micro-rutinas que se ejecuta
al ejecutarse una instrucción requiere de un ciclo de CPU para ejecutarse, están almacenadas en la
memoria ROM.

• Permite crear infinitas instrucciones complejas que puedan ser descompuestas en las microinstruc-
ciones básicas.
• Cuando se necesitan nuevas instrucciones no hay que modificar la parte fı́sica de un CPU sólo
hay que programar la instrucción con sus equivalentes microinstrucciones.
• En el control cableado cada nueva instrucción requiere ser agregada fı́sicamente en el hardware.

2.5. Unidad de memoria


La unidad de memoria es el recurso donde se almacenan las instrucciones de los programas (memoria solo
de lectura) y los datos y resultados que se procesan (memoria de lectura y escritura).

RAM La memoria RAM es una memoria volátil, ya que al cortar la alimentación, los datos
se pierden. Es una memoria de lectura y escritura. Existen tres tipos de RAM distintos:
SRAM (estática), NV-RAM (no volatil), DRAM (dinámica).
Mientras que las SRAM usan alguna realimentación para mantener el dato y son mas
rápidas y fáciles de usar, las DRAM usan carga almacenada para mantener el dato y
requieren menos área por bit.
EEPROM Memoria no volátil para mantener datos después de un reset. Se puede grabar desde
el programa del microcontrolador, usualmente, constantes de programa. Las EEPROMs
tienen un número limitado de lecturas/escrituras, tener en cuenta a la hora de usarla. Esta
memoria solo puede leerse byte a byte y su uso puede se un poco incómodo. También es
algo más lenta que la SRAM. La vida útil de la EEPROM es de unos 100.000 ciclos de
escritura
FLASH Memoria de programa. Usualmente tiene una capacidad que va desde 1 Kb a 4 Mb (contro-
ladores de familias grandes). En esta se guarda el programa ya compilado. En la memoria
flash también se almacena del bootloader. Se puede ejecutar un programa desde la memo-
ria flash, pero no es posible modificar los datos, sino que es necesario copiar los datos en
la SRAM para modificarlos.

7
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

3. Microcontrolador AVR de Atmel


Los AVR son una familia de microcontroladores del fabricante Atmel, que se caracterizan por:
Arquitetura RISC de 8 bits.
Arquitectura Harvard, con memoria Flash para código, SRAM y EEPROM para datos.
Arquitectura es cerrada.
Arquitectura es del tipo Registro-Registro.
32 registros de propósito general de 8 bits
Load and Store Memoria de datos forman un solo espacio de localidades, que se acceden mediante
operaciones de carga y de almacenamiento.
“Pipeline” con dos etapas (traer y ejecutar).

3.1. Mapa de memoria de datos


En los AVR se utiliza una memoria SRAM para almacenar los datos y parámetros que se modifican
constantemente.
Tiene una capacidad de 1280 bytes organizados en: 32 registros de propósito general, 64 reg. de E/S y
160 reg. de E/S adicionales y 1Kb para datos (incluye al STACK). En el caso del Atmega328p se tiene
una capacidad de 2Kb.
Los registros de propósito general están identificados entre R0 y R31. Se puede usar la instrucción
LDS (LDS R5,0x200) o bien instrucciones de direccionamiento simple (INC, DEC) o por registro (LDI,
STS).
Los últimos 6 registros de propósito general pueden ser usados como punteros x, y, z para acceder
a los espacios de memoria por direccionamiento indirecto donde cada uno es de 16 bits permitiendo
tener acceso a los 216 espacios de memoria del microcontrolador. Tienen la ventaja para acceder a los
datos de forma dinámica (por incremento/decremento) en comparación de la forma directa de acceso
haciendo el programa más compacto. Para el uso de los punteros se utiliza la instrucción LDI Xi,
Dirección (Para direccionar el puntero), LD Rd, X (Para cargar un registro con el valor apuntado) y
ST X, Rd (Para cargar el valor del registro en la memoria apuntada). En el caso del puntero Z tambien
se puede usar LPM para carga de registros con valores apuntados en la memoria del programa.
Los registros de puertos de E/S y los periféricos están ubicados en el área siguiente. Si se acceden como
localidades de memoria, las direcciones son entre $020 y $05F. Si se acceden como registros de E/S
deben ser entre $000 y $03F. Se accede a través de las instrucciones IN Rd, A (para recibir valores) y
OUT A, Rr (para transmitir valores).
El registro de estado o status register (SREG) ocupa la última localidad de esta área ($05F). En este
deja constancia de algunas condiciones que se dieron en la última operación realizada y que podrán
ser tenidas en cuenta en operaciones posteriores. Contiene los flags de Carry (bit 0 = C), Cero (bit 1
= Z), Negación (bit 2 = N), Overflow (bit 3 = V), Signo (bit 4 = S), Half Carry (bit 5 = H), Copia
de bits (bit 6 = T) y Habilitacion global de interrupciones (bit 7 = I).
El stack es una sección de la memoria RAM que utiliza el CPU para guardar información temporánea-
mente, este espacio de memoria es necesario ya que el número de registros disponibles el limitado.
Para acceder a esta parte de la memoria hay un puntero llamado SP (stack pointer), que pertenece
al espacio de memoria I/O y está dividido en dos registros SPL y SPH, para la parte baja y la parte
alta del puntero. Se necesitan dos bytes para acceder a todas las direcciones de memoria posibles. Para
guardar o sacar datos del stack pointer existen dos instrucciones PUSH y POP. Para usarlas hay que
tener presente que el SP apunta a la parte alta del stack, y a medida que se va guardando datos el SP
decrementa. Luego, para obtener nuevamente los datos hay que considerar que el stack funciona como
una memoria LIFO, entonces, lo último que se almacenó, será lo primero que se recupera.

8
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

Cuando el AVR se enciendo el SP contiene el valor 0 (dirección de R0), entonces se debe inicializar
al principio del programa, y por la forma de almacenar información, es conveniente inicializarlo en la
parte más alta de la memoria. En los AVR la última dirección de memoria tiene un nombre asignado
RAMEND.
A los 160 registros de E/S adicionales se accede utilizando las instrucciones LD-LDS y ST-STS.

Figura 8: Mapa de memoria de datos.

3.2. Memoria Flash


Para el Atmega328p la memoria Flash es de 32Kb (16K x 16bits), y soporta hasta 10000 ciclos de
escritura/borrado.
La memoria Flash está organizada en dos secciones principales, la sección de la aplicación y la sección
del cargador de arranque (bootloader). El tamaño de las diferentes secciones está configurado por los
fusibles BOOTSZ. Estas dos secciones pueden tener diferentes niveles de protección, ya que tienen
diferentes conjuntos de bits de bloqueo.
• La sección de aplicación es la que se utiliza para almacenar el código principal del programa. Den-
tro de la sección de la aplicación no se puede almacenar ningún código del cargador de arranque,
ya que la instrucción SPM quedarı́a deshabilitada cuando se ejecuta esta sección.
• Dentro de la sección de arranque (BLS) se encuentra una función de programación automática la
cual permite al µC programar su propia memoria flash. La instrucción SPM se usa comúnmente
con los códigos del microcontrolador en el Boot-Loader que ayudan a programar el microcontro-
lador en serie.
Se puede editar el tamaño del bootloader con dos fuses BOOTSZ0 y BOOTSZ1. Por otro lado,
con el BOOTRST se puede escoger que el vector de RESET no se encuentre en la sección de
aplicación sino en la del bootloader. Los vectores de interrupción también pueden ser movidos de
la sección de aplicación a la del bootloader con el bit IVSEL con el registro MCUCR.
Dentro de la Flash de aplicación se encuentran las secciones de NRWW y RWW. Cuando se está borran-
do o escribiendo una página localizada en la sección RWW, la sección NRWW puede ser leı́da durante
la operación. Cuando se está borrando o escribiendo una página ubicada en la sección NRWW, la CPU
se detiene hasta que concluya la operación.
Existen bits de seguridad para las memorias, que las protegen de una actualización. Los niveles de
protección para la sección de la aplicación y arranque se configuran con los bits del Boot Lock. En
ambas secciones se puede restringir las instrucciones SPM y LPM.
Los datos de la memoria Flash es guardado en forma Little Endian esto significa que el byte más alto
del código es ubicado en la dirección más alta de memoria.

9
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

3.3. Memoria EEPROM


La memoria EEPROM es un tipo de memoria ROM con la diferencia de que se puede programar la
memoria del chip y borrarla múltiples veces de forma eléctrica. Además, uno puede seleccionar que byte
borrar. Pero la mayor ventaja es que se puede programas y borrar mientras se encuentra dentro del sistema.
Hay tres registros que están directamente relacionados con la memoria EEPROM, estos son:
EEARH:EEARL (registro de dirección): Sirven para indicar la dirección de la memoria sobre la que se
va a leer o escribir.
EEDR (registro de data): Guarda el dato a escribir o el dato leı́do desde la memoria.

EECR (registro de control): Controla las operaciones de lectura o escritura y contiene los estados de
la operación actual.

• EERE (Habilitador de lectura de la EEPROM): Al poner en alto este bit se inicia con un ciclo
de lectura, para lo cual solo es necesario que no haya una escritura en proceso. La lectura es
inmediata.
• EEWE (Habilitador de escritura en la EEPROM): Al poner en alto este bit se inicia con un ciclo
de escritura, siempre que el bit EEMWE haya sido puesto en alto en los 4 ciclos de reloj anterior.
• EEMWE (Habilitador maestro para escritura en la EEPROM): Es parte de un esquema de segu-
ridad y protección del contenido de la EEPROM, al poner en alto a este bit se cuenta con 4 ciclos
de reloj dentro de los cuales se puede iniciar con un ciclo de escritura. Pasados estos 4 ciclos el bit
EEMWE es puesto automáticamente en un nivel bajo y ya no es posible escribir en la EEPROM.
• EERIE (Habilitador de interrupcion por fin de escritura en EEPROM): Si el bit EERIE está en
alto, se genera una interrupción cuando culmina una escritura en la EEPROM, siempre que el
habilita global de interrupciones (bit I de SREG) también esté puesto en alto.

Para la lectura en EEPROM se debe:


1. Esperar a que EEWE sea 0.
2. Escribir la dirección de lectura en EEARH:EEARL.

3. Setear el bit EERE en 1.


4. Leer los datos desde EEDR.

Para la escritura en EEPROM se debe:

1. Esperar hasta que EEWE sea 0.


2. Escribir la dirección en EEARH:EEARL.
3. Escribir el dato en el registro EEDR.

4. Setear el bit EEMWE en 1.


5. Dentro de los 4 ciclos después de configurar EEMWE setear EEWE.

10
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

3.4. Puertos
Registros asociados a puertos de E/S
Registro DDRx: El registro DDRx configura la dirección. Escribir un uno a un bit de este registro,
configura la Terminal como una salida; al escribir un cero, se le convierte en entrada.
Registro PINx: Lee el estado de PORTx, independientemente del estado de DDRx. Básicamente
sirve para leer el estado de la Terminal del puerto cuando este se ha configurado como entrada.
Registro PORTx: Si la Terminal está configurada como salida, escribir un uno o un cero en el bit
correspondiente de este registro, ocasiona que la salida en esta Terminal sea uno o cero.
Si la Terminal está configurada como entrada, escribir un uno en el bit correspondiente de este re-
gistro (PORTxn), habilita el resistor de pull-up. Escribir un cero, estando configurado como entrada,
deshabilita el resistor de pull-up.

Diagrama equivalente de un pin E/S

Figura 9: Diagrama equivalente de un pin E/S.

El diodo inferior sirve de protección. Si el valor de tensión aplicado en el pin es inferior a el valor
mı́nimo tolerable (muy por debajo de GND) el diodo entra en conducción. Esto sucede mientras que
la corriente no sobrepase del orden de los micro Amperios.

El diodo superior también sirve de protección. Si el valor de tensión aplicado en el pin es superior a el
valor máximo tolerable (muy por encima de VCC ) el diodo entra en conducción. Esto sucede mientras
que la corriente no sobrepase del orden de los micro Amperios.
Cpin equivale a la capacitancia asociada a los dispositivos electrónicos conectados internamente al pin.

Puertos como E/S digital general


Para lectura se tiene:
1. El buffer bidireccional permite la comunicación entre el extremo derecho e izquierdo y viceversa. Cuando
se quiere que el micro no pierda o reciba corriente por medio del pin, se activa la señal de SLEEP y
esto bloquea el buffer.

2. Si se esta en uso normal (señal de SLEEP desactivada), el Smith trigger mantiene estable el valor en
su salida si hay pequeñas variaciones en su entrada.
3. Los dos flip-flops en cadena (bloque de sincronizador) sirven para que la señal a la salida de estos este
sincronizada con toda la lógica del microcontrolador independientemente de que halla cambiado en
forma asincrónica en el pin fı́sico.

4. RRx sirve para leer el valor que escrito en el registro PORTxn, mientras que RPx sirve para leer el
valor del pin fı́sico (PINxn).

11
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

Para el resto de disposiciones ver diapositiva Nº40 de Clase teórica 3.

Figura 10: Puertos como E/S digital general.

Tensiones y corrientes
Cuando actúan como salida, los pines pueden entregar tensiones de hasta VCC .
Cuando actúan como entrada pueden manejar de hasta 0,5V por encima de VCC .
Cada pin E/S pueden soportar picos de corrientes de hasta 40mA, pero en estado estable cada pin
del puerto puede suministrar o recibir hasta 20mA cuando VCC = 5V . Cuando VCC = 3V la corriente
llega hasta 10mA.

La resistencia pull-up y pull-down permiten establecer voltajes de reposo para cuando el pulsador no
está presionado y asegurar una correcta lectura. La terminal puede presentar tres estados:
Estado Alto: Representa la presencia de voltaje llamado uno lógico.
Estado Bajo: Representa la ausencia de voltaje llamado cero lógicos.

Flotante: Representa una alta impedancia como si estuviera desconectado al resto del circuito.
Una entrada digital no conectada, o en alta impedancia, recogerá todo el ruido eléctrico ambiental, lo
que dará a errores debido a que ese ruido será interpretado como bruscas modificaciones de estados lógicos.
Además, producirá sobreconsumos y oscilaciones eléctricas indeseadas. Todo ello, producirá comportamientos
no esperados que se manifestarán en forma de averı́as aleatorias que, en ocasiones, pueden llegar a causar
daños irreversibles en la electrónica de la entrada digital.

12
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

3.5. Fuentes de Reset


Hay cuatro tipos de Reset: power-on, externo, watchdog, brow-out. El Reset provoca que el sistema pase
a un estado inicial conocido.

Power on El MCU es inicializado cuando el voltaje de alimentación está por debajo de una tensión
umbral de encendido VP OT (tı́pico 1, 3V ).

Una vez que el MCU se recupera de una condición de Reset espera un tiempo de estable-
cimiento (Tout – inicialmente es de 65ms) antes de recuperar al sistema, para garantizar
que los registros tienen su valor inicial. La duración de Tout depende de la frecuencia de
trabajo y del valor de los fusibles CKSEL y SUT
Externo El MCU es inicializado cuando un nivel bajo está presente en la terminal RESET por un
tiempo mayor que la longitud mı́nima del pulso (trst tı́pico 2, 5µs).

Con la terminal externa RESET se inicializa al sistema introduciendo un nivel bajo de


voltaje. (a) Al encender el sistema y (b) en cualquier instante.

13
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

Watchdog Se trata de un contador que cuando alcanza su valor final de cuenta genera un reset
interno. Es decir, el micro es inicializado cuando el watchdog timer esta habilitado y su
periodo termina. Este dispositivo se puede configurar mediante el registro WDTCSR.

Cuando el Watchdog Timer desborda genera un pulso con una duración de 1 ciclo de reloj.
Con este pulso se acciona el reset interno e inicia el tiempo de establecimiento.
Brow-out El micro es inicializado cuando el detector de reducción de voltaje esta habilitado y el
voltaje VCC de la fuente va por debajo del umbral establecido VBOT .

El Reset Interno se genera cuando VCC cae por debajo del lı́mite inferior de un voltaje
de umbral (VBOT − ), el tiempo de establecimiento inicia cuando VCC alcanza al lı́mite
superior del voltaje de umbral (VBOT + ). La señal de Reset Interno concluye al terminar
el tiempo deestablecimiento. La inicialización por reducción de voltaje se habilita con los
fusibles.
JTAG El MCU es inicializado tan pronto como exista un 1 lógico en el registro de Reset del
Sistema JTAG (no disponible en Atmega328p).

Para cualquiera de los casos, en el registro MCUSR se registra la condición de reset, poniendo al bit
correspondiente en alto.

14
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

4. Ensamblador
La tarea fundamental de un ensamblador es traducir un programa en lenguaje assembly (.asm) al código
correspondiente en lenguaje máquina (.obj).

Figura 11: Funcionamiento de ensamblador.

Para lograr esto, se realiza el llamado ensamblado de dos pasadas:

1. Escanea el programa y encuentra todas las etiquetas, calcula sus correspondientes direcciones. En base
a esto genera una tabla de sı́mbolos.
2. Convierte las instrucciones a lenguaje de máquina usando la información de la tabla de sı́mbolos.

Una tabla de sı́mbolos es una estructura en la cual se realizan varias operaciones tales como insertar,
borrar, buscar informacion sobre los simbolos que van apareciendo a lo largo del programa.
También existe el ensamblado de una pasada, en el que se lee una linea de programa fuente y se la traducen
directamente para producir una instrucción en lenguaje maquina. Estos ensambladores son sencillos, baratos
y ocupan poco espacio.

4.1. Directivas al ensamblador


Las directivas son elementos del lenguaje que ayudan en la organización de un programa, indicando
aspectos como la ubicación del código o definiciones. No generan código máquina, son elementos propios de
la herramienta utilizada para ensamblar un programa.

.DEVICE: Le permite al usuario decirle al ensamblador en qué dispositivo se ejecutará el código. Si se


utiliza esta directiva, se emite una advertencia si en el código aparece una instrucción no admitida por
el dispositivo especificado.
.INCLUDE: Se utiliza para leer el código fuente de otro archivo.
.DEF: Para renombrar registros y dar claridad a los programas.
.EQU y .SET: Definen una constante simbólica, que puede usarse dentro de las instrucciones.
.DSEG: Segmento de datos. Para reservar espacio en la RAM.
.CSEG: Segmento de codigo (por omisión). Se crea un archivo .hex para la memoria flash.
.ESEG: Segmento de EEPROM. Se crea un archivo .eep a descargarse en la memoria EEPROM.
.ORG: Organiza cualquiera de los segmentos de memoria, indica en que dirección se ubicara la infor-
mación subsecuente.
.BYTE: Reserva un número de bytes en el espacio de la SRAM referidos con una etiqueta. Esta directiva
es solamente permitida en segmentos de datos.
.DB y .DW (Define Byte y Define Word): Directivas para definir constantes, en memoria de programa,
en una dirección conocida.
.LIST: Le dice al ensamblador que active la generación de archivos de lista. Esta generación esta acti-
vada de manera predeterminada. El archivo de lista es una combinación de código fuente de assembler,
direcciones y opcodes.

15
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

.NOLIST: Directiva que detiene la generación del archivo de lista.


.LISTMAC: Le indica al ensamblador que cuando se llama a una macro la expansión de la macro debe
mostrarse.

Directiva MACRO
Una macro es un nombre que define un conjunto de instrucciones que sustituirán a la macro cuando el
nombre de ésta aparezca en un programa (proceso denominado expansión de macros) en el momento de
ensamblar el programa.
La Macro se expande en el lugar donde se usa. Una macro puede tomar hasta 10 parámetros que se
denominan @0 - @9. Los parámetros van separados por una coma. Cada Macro finaliza por una directiva
ENDMACRO. Por defecto, solo la llamada a la Macro se muestra en el archivo de lista y es generado por
el Ensamblador. Para incluir la expansión de macro en el archivo de lista, una directiva LISTMAC debe ser
usada.

Figura 12: Sintaxis y ejemplo de uso de Macro.

Las Macros incrementan el tamaño del código cada vez que son invocadas, en cambio las subrutinas ocupan
un espacio fijo del código, no importa cuantas veces sean llamadas. Por otra parte, llamar a una subrutina
lleva 3/4 ciclos de clock, mientras que la instrucción RET lleva otros 3 ciclos de clock. Además las subrutinas
usan espacio del stack, mientras que las Macros no.

4.2. Modos de direccionamiento


Los modos de direccionamiento indican la ubicación de los datos sobre los que operan las instrucciones.
Los microcontroladores AVR manejan los siguientes modos de direccionamiento:

Directo por registro. Ej: COM R3; ADD R1, R2


Directo a registros I/O. Ej: OUT PORTB, R15 / IN R15, PINB
Directo a memoria de datos. Ej: STS 0X0100, R5 / LDS R5, 0x0100
Indirecto a memoria de datos. Ej: ST Y, R5 / LD R5, Y
Indirecto a memoria de código. Ej: LPM R3, Z
Inmediato a memoria de datos. Ej: LDI R16, 20
Por bifurcaciones (saltos).

4.3. Saltos
Hay 2 clases de saltos:
Salto incondicional: Cuando la CPU ejecuta un salto incondicional, salta incondicionalmente (sin
comprobar ninguna condición) para la ubicación de destino.

16
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

• La instrucción JMP cambia el contenido del PC y causa que la CPU ejecuta una instrucción
distinta a la siguiente en el código. Existen de tres tipos: JMP (4 bytes), RJMP (2 bytes) y IJMP
(2bytes, dirección en puntero Z).
• La instrucción CALL llama a la subrutina, pero a diferencia de JMP, el PC carga en el stack
la dirección de la siguiente instrucción a ser ejecutada en el programa. Al finalizar se retorna al
programa con la instrucción RET. Existen tres tipos: CALL (4 bytes), RCALL (2 bytes) y ICALL
(2bytes, dirección en puntero Z)

Salto condicional: Cuando la CPU ejecuta un salto condicional, se comprueba una condición, si la
condición es verdadera, entonces salta a la ubicación de destino; de lo contrario, se ejecuta la siguiente
instrucción. Ej: BRNE, BREQ.

4.4. Estructura de un programa


1. Inclusión de archivo (.INCLUDE)
2. Definición de sı́mbolos y constantes (.DEF y .EQU)
3. Reserva de memoria (.DB)

4. Asignación de memoria SRAM (.DSEG)


5. Inicio del código ejecutable (.CSEG)
6. Definición de sección de EEPROM y macros (.ESEG y .MACRO)

17
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

5. Arduino Uno
Arduino es una plataforma de desarrollo, cuyo núcleo es un Microcontrolador de la lı́nea Atmel. Esta
basado en Microcontroladores Atmega.
El chip ATmega16U2 en su placa Arduino actúa como un puente entre el puerto USB de la computadora y
el puerto serie del procesador principal. Las versiones anteriores de Uno y Mega2560 tenı́an un Atmega8U2.

JACK Una fuente de alimentación, por lo general, se debe conectar a esta toma, con el polo posi-
tivo en la parte central de la toma, y el valor debe oscilar entre 6V y 20V , el recomendado
es 7 − 12V , por lo que no es aconsejable utilizar tensiones inferiores a 7V o superiores a
12V .

Figura 13: Esquemático de fuente en Arduino Uno.

Puerto USB Llega al bus de 5V, procedente del puerto USB de un ordenador o de cualquier fuente de
alimentación que se proporciona con un puerto USB como una baterı́a. Si la alimentación
proviene de un ordenador, hay una limitación de corriente de 500mA, si por el contrario
está utilizando una fuente de alimentación externa, la corriente máxima de salida está li-
mitada a 500mA por el fusible de protección auto-restaurable.

Figura 14: Esquemático de fuente por USB en Arduino Uno.

18
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

Circuito Comparador
El Gate del transistor está conectado a la salida de un amplificador operacional LMV358
utilizado como comparador. La comparación es entre 3, 3V y Vin /2 (Vin es la tensión
conectada al JACK). Cuando V in/2 es más grande, esto producirá una salida alta del
comparador y el MOSFET de canal P estará apagado. Si no se aplica V in, el V + del
comparador es llevado a GN D y Vout es bajo, de modo que el transistor está encendido y
el USBVCC conectado a 5V .

Figura 15: Esquemático de circuito comparador en Arduino Uno.

Pin 5V Está conectado directamente a la salida del regulador y al bus de 5V que se usa para
alimentar cargas externas a Arduino como los sensores. En el caso de no aplicar tensiones al
puerto USB o al jack, la toma de 5V se puede utilizar para alimentar Arduino directamente,
si es que tiene una fuente externa estabilizada de 5V .
Se tiene que tener en cuenta que, en general, a los reguladores no les gustan los voltajes
que se aplica a su salida, pero en este caso particular, esta situación resulta ocurrir incluso
cuando la alimentación de Arduino se hace desde el puerto USB, por lo tanto, se puede
suponer que no es un gran problema. En este caso no hay ninguna forma de protección,
ya que tanto el diodo y el fusible se encuentran por encima de este bus y por lo tanto no
tienen ninguna función activa
Pin Vin Este conector tiene una doble función:

Entrada: Para alimentación externa, no está protegida por el diodo ante inversiones
de polaridad. La conexión va directamente a la entrada del regulador. Por supuesto
no se debe aplicar tensión al jack, de lo contrario podrı́an surgir conflictos peligrosos.
Salida: De esta se extrae el voltaje aplicado a la toma de JACK, restandole la caı́da
del diodo de protección. Podrı́a resultar útil para alimentar cargas pequeñas que
requieran una tensión superior a 5 V e igual a la aplicada a la toma JACK (siempre
teniendo en cuenta la caı́da de tensión del diodo).

19
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

6. Interrupciones
El Polling es una técnica que consiste en que el mismo microcontrolador se encarga de monitorear el
estado o información de un evento (mecanismo de sondeo continuo). El principal inconveniente con esto es
que los eventos no pueden ser monitoreados de forma periódica, ya que el microcontrolador consume tiempo
en ejecutar diversas instrucciones que lo distrae de dicha actividad de sondeo, resultando en una técnica
ineficiente. La solución a esta problemática se ha logrado mediante la incorporación al microcontrolador de
un dispositivo controlador de interrupciones.
Las Interrupciones son un mecanismo mediante el cual el CPU puede ante la ocurrencia de un cierto evento,
suspender lo que está haciendo y pasar a atender una rutina de alta prioridad (ISR). Una vez finalizada, el
CPU vuelve a su actividad anterior.
Mientras que el polling, que es una técnica sincrónica y determinista, cuenta con problemas tales como:

Consumo de CPU.
Perdida de eventos.
Necesidad en el aumento de frecuencia de consulta para no perder eventos, incurriendo a que el CPU
no pueda realizar tareas entretanto.

No hay prioridades, de modo que todos los dispositivos son tratados por igual.
Es incompatible con las funciones de ahorro de energı́a del µC.

El uso de interrupciones tiene como ventajas:

Ahorro de CPU. Evita perder tiempo ocurriendo que ocurran cosas.


Permite al procesador hacer mas cosas de manera simultanea.
No se pierden eventos.
Permite tratar algunos eventos con mas prioridad que otros.

Permite responder a los eventos mas rápido, sin latencia.


Permite poner al µC en sleep y aun ası́ responder a ciertos eventos.

6.1. Clasificación de interrupciones


Enmascarable: Consiste en bloquear de forma independiente la recepción de una señal por parte del
CPU para inhabilitar una interrupción.
No enmascarable: Consiste en anular el bloqueo de recepción de una señal por parte del CPU para
mantener habilitada una interrupción.

Fijas: Una vez que se ejecuta, se pasa a una locación de memoria fija.
Vectorizadas Cada fuente de interrupción posee una rutina de atención especializada propia (ISR)
que se ubica en algún lugar de la memoria del programa (sino todas serı́an atendidas por la misma
rutina).

6.2. Vectores de interrupción


Los vectores de interrupción son las direcciones especificas de la memoria de programa en la que se
encuentra una instrucción de salto al fragmento de código que se debe ejecutar acorde a la fuente que lo
interrumpe.
Cada evento tiene asociada una dirección de memoria en donde se aloja el código especifico a ejecutar, en
la llamada tabla de vectores de interrupción, que se ubica al comienzo de la memoria de programa. En esa
dirección, el compilador coloca un JMP a la dirección de la ISR, que puede estar en cualquier otro lado.

20
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

Figura 16: Vectores de interrupción del Atmega328p.

Esta tabla también establece la prioridad de cada interrupción, que en el caso del AVR, es fija. Cuanto
mas bajo es el número en la tabla, mas alta es la prioridad del evento.

6.3. Ejecución de interrupciones


Tras activar las interrupciones globales (I=1 en SREG) y habilitar las interrupciones a utilizar, estas se
ejecutan siguiendo los siguientes pasos:

1. Ocurre el evento y se activa el flag de interrupción (independientemente de si las interrupción está ha-
bilitada).
2. Se verifican la habilitación de interrupciones.
3. Se termina la instrucción que se está ejecutando y se guarda la dirección de retorno en el Stack.
4. Se carga en el PC, mediante el vector de interrupciones, la dirección de la ISR.

5. Se desactiva el habilitador global de interrupciones (I=0).


6. Se desarrolla la rutina de interrupción.
7. La instrucción de retorno (RETI) se encarga de obtener la dirección de retorno guardada en el Stack
y de activar el habilitador global de interrupciones (I=1).

Como se ve, tanto RET como RETI son directivas para retornar de una subrutina. Es decir, una vez
terminada la subrutina se ejecutan estas instrucciones y el PC (program counter) obtiene del stack la dirección
de memoria de la siguiente instrucción a ser ejecutada. La diferencia consta en que RETI se utiliza para

21
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

volver de las ISR (subrutinas de interrupción) ya que, además de salir de la rutina, activa el habilitador
global de interrupciones (activa el flag de interrupciones del SREG).
Deben tenerse en cuenta algunas consideraciones:
Existen instrucciones para encender (SEI) y apagar (CEI) el bit de habilitación global de interrupciones.

El usuario puede escribir por software un uno lógico en el bit I, en medio de una rutina de interrupción,
para habilitar las interrupciones anidadas.
Todas las interrupciones habilitadas pueden interrumpir la rutina de interrupción actual (Si I=1),
respetando su prioridad. La prioridad de las interrupciones solo se usa para establecer el orden en que
se atienden cuando hay mas de un flag activado

Cuando el AVR sale de una interrupción, siempre regresará al programa principal y ejecutará una o
más instrucciones antes de ejecutar cualquier interrupción pendiente.
Las interrupciones por flanco requieren una señal de reloj en los recursos I/O. Este recurso se encuentra
anulado en la mayoria de los modos de bajo consumo.

Las interrupciones por nivel bajo no requieren señal de reloj (son ası́ncronas). Esto es adecuado para
despertar al microcontrolador desde cualquier modo de bajo consumo.
En C, el registro de estado (SREG) no se almacena automáticamente al ingresar una rutina de inte-
rrupción, ni es restaurado al regresar de una rutina de interrupción. Esto debe ser manejado por el
software.

6.4. Interrupciones externas


Las interrupciones externas sirven para detectar un estado lógico o un cambio de estado en algunas
terminales de entrada del microcontrolador. Son útiles para monitorizar botones interrupciones o sensores.
Se pueden activar por un nivel bajo (asincrónicas) o por flancos de subida o bajada (utilizan una señal de
reloj en los recursos I/O).
El Atmega328p tiene dos interrupciones externas: INT0(PortD2) e INT1(PortD3). Estas se controlan
mediante los registros:

EICRA (External Interruprt Control Register A): Configura que ocurrencia de la señal externa va
a accionar la interrupción. Pueden ser por nivel lógico 0, por cualquier cambio en la entrada, por
transicion del flanco descendente o por transicion del flanco ascendente.
EIMSK (External Interrupt Mak Register): Contiene los bits que habilitan a las interrupciones INT0
e INT1.
EIFR (External Interrupt Flag Register): Contiene los bits de flag asociados a las interrupciones.
Cuando un evento activa la interrupción el bit correspondiente se activa, independientemente de si las
interrupciones globales o las mascaras están habilitadas. Este bit regresa a cero cuando se ejecuta la
rutina de interrupción o cuando se escribe un 1 lógico en el mismo.

Además de éstas, también existen interrupciones por cambios en los puertos. Estas se controlan mediante
los registros PCICR (Pin Change Interrupt Control Register), PCIFR (Pin Change Interrupt Flag Register)
y PCMSKx (Pin Change Mask).

22
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

7. Conversor analógico digital


Un conversor analógico digital genera un valor binario de salida proporcional al cociente entre la señal
de entrada y la de referencia en un determinado momento. Los cantidad de posibles valores binarios de
salida son 2n . Convierte una señal continua en el tiempo en valores discreto tomados con una determinada
frecuencia de muestreo.
Para una adecuada conversión y recuperación de la información se requiere que la resolución del ADC pro-
porcione el numero de combinaciones suficiente, de acuerdo con lo que desea representar, y que la frecuencia
de muestreo sea por lo menos el doble de la frecuencia de la señal.

7.1. ADC de aproximación sucesiva


La técnica de conversión basada en un registro de aproximación sucesiva (SAR), también conocida como
conversión de pesaje de bits, emplea un comparador para pesar el voltaje de entrada aplicado contra la
salida de un convertidor digital a analógico de N bits (DAC). Usando la salida DAC como referencia, este
proceso se acerca al resultado final como una suma de N pasos de ponderación, en los que cada paso es una
conversión de un solo bit.

Figura 17: Diagrama de ADC de aproximación sucesiva.

Inicialmente, todos los bits de SAR se establecen en 0. Luego, comenzando con el bit más significativo,
cada bit se establece en 1 secuencialmente. Si la salida DAC no excede el voltaje de la señal de entrada, el
bit se deja como 1. De lo contrario, se vuelve a establecer en 0. Es una especie de búsqueda binaria. Para
un ADC de n bits, se requieren n pasos.

7.2. ADC en Microcontrolador Atmega328p


Caracterı́sticas del ADC
El Atmega328p cuenta con un conversor analógico digital con las siguientes caracterı́sticas:

Es un conversor de hasta 10 bits de resolución, por aproximaciones sucesivas.


El voltaje de entrada va de de 0V a VCC .
Cuenta con modos de conversión libre o una sola conversión.
El voltaje de referencia interno es seleccionable de 1, 1V .

Se encuentra conectado a un multiplexor analogico que permite seleccionar 1 de 8 canales externos.


Aunque el Atmega328p solo tiene 6 canales.
Para alcanzar la máxima resolución, el ADC debe trabajar con una frecuencia entre 50 y 200KHz, la
cual se puede generar con un preescalador.

Asimismo, deben tenerse en cuenta magnitudes tales como:

23
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

Resolución: El ADC cuenta con 10 bits de resolución (Resolución de 1024 bits) por lo que tiene un
step de 5mV para Vref = 5V y un step de 2, 5mV para Vref = 2, 56V .

Vref
Step =
2n − 1
Tiempo de conversión: Es el tiempo que toma el ADC en convertir la entrada analógica a un número
binario. Es determinado por la fuente de clock conectada al ADC y el método de conversión:
fCP U
fADC =
P reescaler

A partir de la frecuencia del ADC se puede obtener la frecuencia de muestreo donde la primera con-
versión tendrá 25 ciclos (por inicialización de circuiterı́a electrónica) y luego todos 13 ciclos:

fADC
fm =
13

Por Teorema de muestreo Nyquist, para que el muestreo sobre la señal sea correcto esta debe ser mayor
a que dos veces la frecuencia de la señal o ancho de banda de ésta (fm > 2fseñal ).
Valor Final: Para determinar el valor discreto obtenido por la conversión del ADC, hay que realizar
el cociente entre la tensión de entrada y el step size. Luego a este resultado pasar de base decimal a
binario para hallar el valor final:
Vin
Dout =
Step

Registros del ADC


ADCH:ADCL: Registros de resultado de conversión. Primer se debe leer el ADCL y luego el ADCH.
ADCSRA (ADC Control and Status Register A):

• Bit 7 – ADEN: Habilitación del ADC.


• Bit 6 – ADSC: Inicio de conversión.
• Bit 5 – ADATE: Habilitación de auto-disparo del ADC.
• Bit 4 – ADIF: Bandera de Interrupción de conversión completa.
• Bit 3 – ADIE: Habilitación de interrupción de conversión.
• Bits 2:0 – ADPS2:0: Selección de prescaler.

ADCSRB (ADC Control and Status Register B):

• Bit 6 – ACME: Selección de Multiplexor como entrada negativa del comparador analógico.
• Bit 2:0 – ADTS2:0: Selección de fuente de auto-disparo.

24
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

ADMUX: ADC Multiplexer Selection Register

• Bit 7:6 – REFS1:0: Selección de voltaje de referencia.


• Bit 5 – ADLAR: Ajuste del resultado a izquierda.
• Bits 3:0 – MUX3:0: Seleccionan el canal o entrada analógica. Puede ser un pin, o un sensor de
temperatura interno.

DIDR0: En estos bits se pone uno, para deshabilitar el buffer de la entrada digital del respectivo puerto,
lo que permite una reducción en el consumo de potencia.

Pasos a seguir en la programación del ADC


1. Configurar el pin de entrada del ADC (pines MUX3:0 de ADMUX).
2. Encender el módulo ADC (bit ADEN de ADCSRA).
3. Seleccionar el prescaler para determinar velocidad de conversión (bits ADPS2:0 de ADCSRA).
4. Seleccionar tensión de referencia (bit REFS0:1 de ADMUX).

5. Activar la conversión (bit ADSC con ADSCRA).


6. Esperar el fin de conversión indicado ADIF en ADCSRA.
7. Leer el valor obtenido contenido en los bytes ADCH: ADCL (Se debe leer primero ADCL y luego
ADCH de lo contrario se pierde la info).

25
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

8. Temporizadores/Timers
Un Timer/Counter es un registro contador de n bits que se incrementa automáticamente en cada ciclo de
reloj o por eventos externos. El Atmega328p cuenta con tres timers: timer0 (de 8 bits), timer1 (de 16 bits)
y timer2 (de 8 bits).
Estos se caracterizan por contar con:
Prescaler reloj de entrada.
Estado del contador de lectura / escritura.
Generador de forma de onda utilizando un comparador (registro).
Generador de PWM (modulación de ancho de pulso).
Generación de interrupciones a intervalos de tiempo regulares.
Activado por eventos externos (captura).
Se pueden utilizar para:
Generador de forma de onda.
Programa de sincronización con intervalos de tiempo regulares.
Medición de intervalos de tiempo.

8.1. Diagrama en bloques de timer de 8 bits

Figura 18: Diagrama en bloques de timer de 8 bits.

26
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

8.2. Registros del timer0


TCNT0 (Timer/Counter 0): Es el registro de 8 bits del temporizador/ contador 0.
OCR0A/B (Output Compare Register A/B): Son los registros con los que continuamente se compa-
rará el temporizador para generar eventos de coincidencias por comparación.
TIFR0 (Timer/Counter Interrupt Flag Register): Los eventos se ven reflejados en este registro

• TOV0 (Timer/Counter Overflow 0): Desbordamiento del Temporizador/Contador 0.


• OCF0x (Output Compare Match Flag 0x): Indica una coincidencia en la comparación.

TIMSK0 (Timer/Counter Interrupt Mask Register 0): Se deben activar las interrupciones. Los habili-
tadores individuales son:

• TOIE0 (Timer/Counter 0 Overflow Interrupt Enable): Habilita la interrupción por desbordamien-


to del Temporizador/Contador 0.
• OCIE0x (Timer/Counter 0 Output Compare Match x Interrupt Enable): Hailita la interrupción
por una coincidencia en la comparación.

TCCR0A/B – Timer/Counter Control Register A/B

• Bits CS0[2:0] (Clock Select): Bits de selección de la fuente de reloj.

27
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

• Bits WGM0[2:0] (Waveform Generation Mode): Se usa para definir el modo de operación.

• Bits COM0A[1:0] y COM0B[1:0] (Compare Output Mode): Con estos bits se configura una res-
puesta automática en OC0x, ante eventos de comparación.

• Bits FOC0A y FOC0B: forzan u obligan un evento de comparación, si se configuró una respuesta
automática, ésta tambien va a realizarse. FOC0A se relaciona con el registro OCR0A y FOC0B
con el registro OCR0B.

28
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

8.3. Modos de operación


En el caso del timer0, sus modos de operación son:

Modo normal
En este modo, la dirección de conteo es siempre ascendente (incremental) y no se realiza ningún borrado del
contador. El contador simplemente se sobrepasa cuando pasa su valor máximo (0xFF para el timer0) y luego
se reinicia desde abajo (0x00). En funcionamiento normal, el indicador de desbordamiento del temporizador
/ contador (TOV0) se configurará en el mismo ciclo de reloj del temporizador cuando el TCNT0 se ponga
a cero:

Figura 19: Gráfico de modo normal 8 bits.

Para implementar este modo deben seguirse los siguientes pasos:


1. Cargar el valor inicial en el registro TCNT0.
2. Cargar el valor del registro TCCR0 indicando modo (WGM0 2:0) y prescaler (CS0 2:0).

3. Monitorear el flag TOV0 mediante loop y salir de éste cuando se active.


4. Parar el timer ingresando un 0x00 en el registro TCCR0.
5. Setear en 1 el flag TOV0 para borrarlo/reiniciarlo.
6. Saltar al paso 1 para cargar nuevamente al registro TCNT0.

En el modo normal, se puede cargar una valor en el registro OCR0A/B y cada vez que se produzca una
coincidencia, el pin OC0A/B alterna y el temporizador continúa contando hasta que alcanza el valor máximo.
De esta manera se pueden generar señales de periódicas.

Figura 20: Generador de señales usando timer0.

fCLK
fOCnx =
2.P reescaler · 256

29
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

Modo Comparación/coincidencia (CTC)


En el modo CTC, el contador se pone a cero cuando el valor del contador (TCNT0) coincide con el OCR0A.
El OCR0A define el valor superior para el contador, de ahı́ también su resolución. Este modo permite un
mayor control de la frecuencia de salida de comparación. También simplifica la operación de contar eventos
externos. Se puede generar una interrupción cada vez que el valor del contador alcanza el valor TOP mediante
el uso de la bandera OCF0A.

Figura 21: Diagrama de modo CTC.

fCLK
fOCnx =
2 · P reescaler · (1 + OCR0A)

Modo PWM rápido


Una señal PWM es una onda rectangular de periodo fijo y con frecuencia inversa al periodo, de modo
que es de frecuencia fija. Sin embargo, lo que si se cambia o modifica normalmente en una señal PWM es el
tiempo en alto que estará su valor máximo Vmax , a este tiempo en alto se le llama ancho de pulso, por lo
que en una señal PWM se modificará su ancho pulso. Si el ancho de pulso de la señal PWM se representa
en forma de porcentaje se le suele llamar ciclo de trabajo.
Este modo permite generar una onda PWM de alta frecuencia. El timer cuenta desde 0 a 255 y reinicia
la cuenta. Con cada cuenta el valor del timer0 se compara con un valor determinado que cuando coinciden
cambia el estado de uno de los pines de salida PWM, y cuando se reinicia el timer este pin vuelve a cambiar
su estado.

Figura 22: Diagrama de modo PWM fast.

30
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

El contador cuenta desde bottom (0x00) hasta top y luego se reinicia desde bottom. Top se define como
0xFF cuando WGM2:0 = 3, y OCR0A cuando WGM2:0 = 7. En el modo de salida de comparación no
inversora, la comparación de salida (OC0A/B) se borra en la comparación entre TCNT0 y OCR0A y se
establece en la parte inferior. Al invertir el modo de salida de comparación, la salida se establece en compa-
ración y se borra en la parte inferior. El indicador de desbordamiento del temporizador / contador (TOV0)
se establece cada vez que el contador llega a TOP. En el modo PWM rápido, la unidad de comparación
permite la generación de formas de onda PWM en los pines OC0A/B.
fCLK
fP W M =
P reescaler · 256

Modo PWM fase correcta


Este modo ofrece una onda PWM de alta resolución, a diferencia del modo Fast PWM, el timer cuenta
hacia adelante y hacia atrás antes de hacer el cambio de estado del pin PWM, es decir cuenta de 0 a 255 al
llegar a 255 cuenta de 255 a 0, obteniendo una salida PWM más limpia pero de menor frecuencia.

Figura 23: Diagrama de modo PWM fase correcta.

En este caso Top se define como 0xFF cuando WGM 2:0 = 1 y OCR0A cuando WGM 2:0 = 5. El contador
(TOV0) se establece cada vez que el contador llega a la parte inferior.
fCLK
fP W M =
P reescaler · 512
Lo que diferencia al modo PWM rápido con el modo fase correcta, es que si se toma el centro de los anchos
de pulso de la señal PWM timer0 AVR modo rápido y se hace un cambio en el ancho del pulso, el centro
del ancho de pulso se moverá, cambiará de lugar, se dice que se modifica la fase del ancho de pulso, o que la
fase no es correcta. Esto se corrige con el modo PWM de fase correcta.

Modo PWM fase y frecuencia correcta


Solo el timer1 cuenta con este modo. En el modo de fase correcta actualiza el a OCR1A/B al llegar al
máximo, y en el modo de frecuencia y fase correcta lo hace al alcanzar un cero. Con el modo de fase y
frecuencia correcta solo se generan formas simétricas, lo cual no ocurre con el modo de fase correcta.

Sistema de captura de timer1


El temporizador/contador incorpora una unidad de captura de entrada que puede capturar eventos exter-
nos y darles una marca de tiempo que indique el momento en que ocurrieron. La señal externa que indica un
evento, o múltiples eventos, se puede aplicar a través del pin ICP1 o, alternativamente, a través de la unidad
de comparación analógica. Las marcas de tiempo se pueden utilizar para calcular la frecuencia, el ciclo de
trabajo y otras caracterı́sticas de la señal aplicada. Alternativamente, las marcas de tiempo se pueden utilizar
para crear un registro de los eventos.

31
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

Cuando se activa una captura, el valor de 16 bits del contador (TCNT1) se escribe en el registro de
captura de entrada (ICR1). La bandera de captura de entrada (ICF1) se establece en el mismo reloj del
sistema cuando el valor TCNT1 se copia en el registro ICR1. Si está habilitado (ICIE1 = 1), el indicador de
captura de entrada genera una interrupción de captura de entrada.
Este modo se configura mediante los bits en el registro TCCR1B:
ICNC1 (Input Capture Noise Canceler): Activa un eliminador de ruido. La entrada se filtra por cuatro
muestras sucesivas.
ICES1 (Input Capture Edge Select): Selecciona el flanco de activación de la captura (0 para flanco de
bajada, 1 para flanco de subida).

Modo asincrónico de timer2


El timer2 es similar al timer0, con la diferencia de que este cuenta con un modo asincrónico. Este modo
consiste en que la fuente de sincronismo del timer2 se obtiene a partir de un oscilador externo, de valor
32768Hz, suministrado mediante los pines apropiados del microcontrolador en lugar de obtenerla de la señal
de reloj del sistema. Esta frecuencia permite usar al temporizador como un contador de tiempo real.

8.4. Watchdog timer


Este periférico permite que el microcontrolador se reinicie automáticamente mediante un circuito con-
tador, que se incrementa continuamente a una frecuencia de 1MHz aproximadamente. Para evitar que el
microcontrolador se reinicie, hay que restablecer el valor del contador antes de que este se desborde. El
restablecimiento del contador se efectúa mediante una instrucción especial (WDR).

32
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

9. Comunicación
9.1. Clasificación de comunicaciones
La comunicación entre dispositivos puede ser:
Paralelo Transferencia de un byte de datos a la vez − > más rápido, más fácil.
Serie Transfiere un bit después de otro − > más barato, ideales para largas distancias a través de
la lı́nea telefónica.
El direccionamiento se clasifica en:
Simple: los datos se mueve en una sola dirección.
Half Duplex: los datos se mueve en dos direcciones, pero no al mismo tiempo.
Full Duplex: los datos se mueve en dos direcciones al mismo tiempo.

Figura 24: Clasificación de direccionamiento.

A su vez estas pueden ser:


Sincrónico La transmisión de datos necesita que emisor y receptor estén sincronizados mediante una
señal de clock. El receptor recibe cada bit o conjunto de bits al mismo tiempo que el emisor
lo transmite y viceversa. La señal de clock puede tener una linea exclusiva para ella, o puede
ir codificada de alguna manera en la(s) linea(s) de datos.
Asincrónico No se transmite la señal de clock, sino que la sincronización está dada por el bit de arranque
(start) y el bit de parada (stop). El emisor y receptor tienen que acordar previamente la
velocidad de transmisión según protocolos.
Cuando el receptor detecta el bit de arranque, lee los siguientes bits usando su propio clock,
asumiendo que el emisor los envió a la misma frecuencia. Este tipo de interfaz es sencillo y
económico, por lo que no permite grandes velocidades.

9.2. Interfases para la comunicación serial

Figura 25: Comparativa de interfases para la comunicación serial.

33
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

9.2.1. Comunicación serial por USART


El USART significa receptor y transmisor sincrónico y ası́ncrono universal. La USART incluye recursos
independientes para transmisión y recepción, esto posibilita una operación full-duplex, es decir, es posible
enviar y recibir datos en forma simultánea. La terminal destinada para la transmisión de datos es TXD y
para la recepción es RXD. Estas terminales corresponden con PD1 (TXD) y PD0 (RXD).
La comunicación puede ser sı́ncrona o ası́ncrona. Por lo tanto, antes de cualquier transferencia de datos,
para el transmisor y el receptor, se deben definir los siguientes parámetros:

Velocidad de transmisión (Baudrate): Se refiere a la cantidad de bits que se transmiten en un


segundo, se mide en bits/segundo, usualmente referido como bauds o simplemente bps.
Número de bits de datos: Cada dato se integra por un número pre-definido de bits, pueden ser 5,
6, 7, 8 ó hasta 9 bits

Bit de paridad: Es un bit de seguridad que acompaña a cada dato, se ajusta automáticamente en
alto o bajo para complementar un número par de 1’s (paridad par) o un número impar de 1’s (paridad
impar). El emisor envı́a al bit de paridad después de enviar los bits de datos, el receptor lo calcula a
partir de los datos recibidos y compara el bit de paridad generado con el bit de paridad recibido, una
diferencia entre ellos indica que ocurrió un error en la transmisión. Por ello, es importante definir el
uso del bit de paridad y configurar si va a ser par o impar.
Número de bits de paro: Los bits de paro sirven para separar 2 datos consecutivos. En este caso,
se debe definir si se utiliza 1 ó 2 bits de paro.

Una trama serial (Data framing) se compone:


1 bit de inicio (siempre es un 0 lógico).
5, 6, 7, 8 o 9 bits de datos, iniciando con el menos significativo.

Bit de paridad, par o impar, si se configuró su uso.


1 o 2 bits de paro (siempre son un 1 lógico).

El protocolo USART puede operar en distintos modos:


Modo normal ası́ncrono: En este modo de comunicación, los datos se transmiten y se reciben bit a
bit sin pulsos de reloj por la velocidad de transmisión predefinida establecida por el registro UBBR.

Modo ası́ncrono de doble velocidad: En este modo de comunicación, los datos transferidos al doble
de la velocidad de transmisión se establecen mediante el registro UBBR y los bits U2X establecidos en
el registro UCSR0A.
Modo sı́ncrono maestro/esclavo: En este sistema, la transmisión y recepción de los datos con
respecto al pulso de reloj se establece en UMSEL = 1 en el registro UCSRC.

Modo comunicación multiprocesador

34
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

Registros del USART


UBRR0L:H (USART Baud Rate Register): Se utiliza para configurar el baudrate. Para ver sus
posibles valores se utiliza la tabla de la hoja de datos que las especifica (página 163 para Atmega328p),
o se utiliza la formula según el caso (tabla en página 146 para Atmega328p).

UDR0 (USART Data Register): Registro de Transmisión/recepción de los datos.


UCSR0A (USART Control Status Register A)
• RXC0: Se active cuando hay datos disponibles en el buffer no leidos.
• TXC0: Se activa cuando toda la data ha sido transmitida del buffer.
• UDRE0: Se activa cuando el data buffer está vacı́o y listo para trasmitir/recibir datos.
UCSR0B (USART Control Status Register B)
• RXCIEx/ TXCIEx/UDREIx: Habilitan la interrupción según el flag del registro UCSRxA corres-
pondiente.
• RXENx/TXENx: Habilitan receptor/trasmisor USART.
UCSR0C (USART Control Status Register C)
• UCZ02:0: Establecen el formato de trama.
• UMSEL01:0 Establecen modo de operación (Sincrónico, asincrónico, master SPI)

Comunicación entre Múltiples Microcontroladores


La USART de los AVR permite una comunicación entre más de 2 microcontroladores, bajo un esquema
maestro-esclavos, pudiendo conectar hasta 256 esclavos. Los esclavos deben tener una dirección diferente,
entre 0 y 255. Estas direcciones se pueden manejar como constantes en memoria flash o configurarse con
interruptores en uno de los puertos del microcontrolador.

La comunicación utiliza un formato de 9 bits, donde el 9º bit (transmitido en TXB8 o recibido en RXB8)
sirve para distinguir entre dos tipos de información, con 0 se refiere a una trama de datos y con 1 a una
trama de dirección.
La comunicación entre múltiples MCUs requiere el empleo del bit MPCM (bit 0 del registro UCSRA.
MPCM, Multiprocessor Comunication Mode). Este bit es utilizado por los esclavos, si está en alto, únicamente
pueden recibir tramas de dirección. Su puesta en bajo les permite recibir tramas de datos.

35
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

9.2.2. Comunicación serial por SPI


La Interfaz Serial Periférica (SPI, Serial Peripheral Interface) establece un protocolo estándar de comuni-
caciones, usado para transferir paquetes de información de 8 bits entre circuitos integrados. El protocolo SPI
permite una transferencia sı́ncrona de datos a muy alta velocidad entre un microcontrolador y dispositivos
periféricos o entre microcontroladores. Suele utilizarse en comunicaciones con memorias o conversores AD y
DA.
En la conexión de dos dispositivos por SPI, siempre ocurre que uno funciona como Maestro y otro como
Esclavo, aunque es posible el manejo de un sistema con múltiples Esclavos. El Maestro es quien determina
cuándo enviar los datos y quien genera la señal de reloj. El Esclavo no puede enviar datos por sı́ mismo y
tampoco es capaz de generar la señal de reloj. Esto significa que el Maestro tiene que enviar datos al Esclavo
para obtener información de él.
Las señales que intervienen en la comunicación son:

MOSI (Master Output, Slave Input): Señal de salida del Maestro y entrada en el Esclavo. Tı́picamente
el envı́o de información inicia con el bit menos significativo.
MISO (Master Input, Slave Output): Señal de entrada al Maestro y salida en el Esclavo. Proporciona
el mecanismo para que el Esclavo pueda dar respuesta al Maestro.

SCK (Shift Clock): Es la señal de reloj para sincronizar la comunicación. Es generada por el Maestro.
SS (Slave Select): Esta señal es útil para el manejo de múltiples Esclavos, para ello, deben realizarse
los arreglos necesarios en el hardware, de manera que sólo se habilite un Esclavo en cada transmisión.
Esta señal generalmente es activa en un nivel bajo.

El envı́o y recepción se realizan en forma simultánea, mientras el Maestro envı́a datos por MOSI recibe
una respuesta del Esclavo por MISO. Sincronizando el envı́o y recepción con la señal de reloj, es decir, en
el mismo ciclo de reloj se trasmite y recibe un bit. Debido a esto, los registros de desplazamiento de 8 bits
pueden ser considerados como un registro de desplazamiento circular de 16 bits. Esto significa que después
de 8 pulsos de reloj, el Maestro y el Esclavo han intercambiado un dato de 8 bits.

Registros del SPI


SPCR (SPI Control Register)
• Bit 7 – SPIE: SPI Interrupt Enable
• Bit 6 – SPE: SPI Enable
• Bit 5 – DORD: Data Order (1: LSB primero / 0: MSB primero)
• Bit 4 – MSTR: Master/Slave Select (1: Maestro / 0: Esclavo)
• Bit 3 – CPOL: Clock Polarity
• Bits 1, 0 – SPR1, SPR0: SPI Clock Rate Select 1 and 0

SPSR (SPI Status Register)


• Bit 7 – SPIF: SPI Interrupt Flag
• Bit 0 – SPI2X: Double SPI Speed Bit
SPDR (SPI Data Register): El registro de datos SPI es un registro de lectura / escritura que se utiliza
para la transferencia de datos entre el archivo de registro y el registro de desplazamiento SPI.

36
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

9.2.3. Comunicación serial por IIC-TWI


Los protocolo IIC (Inter-Integrated Circuits) y TWI (two Wire Interface) son equivalentes.
La interfaz serial de 2 cables (TWI) es ideal para aplicaciones tı́picas de microcontroladores. El protocolo
TWI permite al diseñador de sistemas interconectar hasta 128 dispositivos diferentes como periféricos o
sistemas embebidos, de forma remota a cortas distancias al microcontrolador. Utiliza solo dos lı́neas de bus
bidireccionales, una para reloj (SCL) y otra para datos (SDA). El único hardware externo necesario para
implementar el bus es una única resistencia pull-up para cada una de las lı́neas de bus TWI.
El protocolo TWI maneja un esquema Maestro-Esclavo, no obstante, cualquier dispositivo puede transmitir
en el bus.
Ventajas: Requiere de pocos cables / Dispone un mecanismo para verificar la señal.
Desventajas: Su velocidad es media – baja / No es full dúplex / No hay verificación del contenido del
mensaje.

Modos de operación
Maestro: El dispositivo genera la señal de clock del sistema, se inicia y termina la transmisión.
Esclavo: Recibe la señal de clock y es solicitado por el maestro.
Ambos transmiten y reciben datos por lo que existen cuatro modos (Maestro trasmisor/ receptor o Esclavo
trasmisor/ receptor). Cada nodo (conexión del dispositivo al bus) puede tener distintos modos en distintos
intervalos de tiempo, pero sólo operar un modo a la vez.
Es un modelo de comunicación sincrónica. Cada bit transferido en la lı́nea SDA está sincronizado con
un pulso de la lı́nea SCL. La lı́nea SDA no puede cambiar su estado cuando SCL está en estado alto
(solo en SCL-low) salvo para las condiciones de START/ STOP.
El Maestro inicia y termina la trasmisión de datos, por lo tanto, es el Maestro quien genera las
condiciones de INICIO y PARO, éstas son señalizadas cambiando el nivel en la lı́nea SDA cuando SCL
está en alto. La lı́nea SDA se considera ocupada cuando se encuentra entre estas condiciones y ningún
otro maestro puede utilizarla.

Toda la data para transmitir debe ser empaquetada en 9 bits, en donde los primeros 8 serán puestos en
SDA para ser transmitidos y el último será el bit de ACK. Para indicar esto, el transmisor libera SDA para
que el receptor indique ACK (SDA=0) o bien NACK (SDA=1) en el valor del 9no bit.

37
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

Paquete dirección: Consiste en 7 números de dirección, un bit de control y un bit de ACK. Son usados
para direccionar a un esclavo. El bit de control puede ser READ (R=1) o WRITE (W=0) para indicar
que el maestro le leerá la próxima trama del esclavo (bit set) o bien escribirá al esclavo en la próxima
trama (bit low).

Paquete de datos: consiste en 8 bits de datos y un 9no bit de ACK.

Clock Streching: Si el esclavo no está en condiciones de procesar más datos puede ejercer un control de flujo
sobre la comunicación cambiando el estado de SCL a abajo luego de recibir/enviar datos para interrumpir
el control del maestro (interrumpe la comunicación).
Arbitration: El protocolo soporta múltiples maestros conectados, pero no una comunicación múltiple. Cada
maestro debe esperar que el bus se desocupe para establecer una comunicación. es posible que dos maestros
comiencen una transmisión simultánea, en este caso cada transmisor debe de comparar el nivel esperado por
SDA. Si este nivel no coincide para uno de los maestros, este pierde el privilegio y se convierte en esclavo.

38
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

10. Modos Sleep


Los modos de Sleep permiten a la aplicación cerrar los módulos no utilizados en el microcontrolador, con
el consiguiente ahorro de energı́a. El núcleo AVR ofrece diversos modos de reposo que permiten al usuario
adaptar el consumo de energı́a a los requisitos de su aplicación.
Todos estos modos se configuran con los bits del registro SMCR (Sleep Mode Control Register).
Modo ocioso: Los recursos están activos pero la CPU no tiene señal de reloj y por lo tanto no ejecuta
instrucciones. Cualquier evento de los diferentes recursos provoca una salida del modo de ocioso.
Modo de reducción de ruido en el ADC: Únicamente trabaja el ADC y el oscilador ası́ncrono para
el temporizador 2. Adecuado para aplicaciones que requieren el monitoreo de parámetros analógicos
en periodos preestablecidos de tiempo.
Modo de baja potencia: No hay reloj en la CPU y recursos, es el modo con el menor consumo de
energı́a. El MCU puede ser reactivado por eventos en la interfaz de dos hilos o por las interrupciones
externas.
Modo de ahorro de potencia: Sólo está activo el oscilador ası́ncrono y se mantiene activo el tem-
porizador 2 manejado por una fuente de reloj externo. Ideal para aplicaciones que involucren un reloj
de tiempo real.
Modo de espera: Este modo es muy similar al modo de baja potencia, con la única diferencia de que
se mantiene activo el suministro del reloj principal para que el MCU se reactive más rápido.
Modo de espera extendido: Este modo es muy similar al modo de ahorro de potencia, con la única
diferencia de que en este modo también está activo el suministro del reloj principal.

10.1. Ahorro de energı́a apagando recursos


Con el registro PRR Power Reduction Register se pueden apagar recursos para ahorrar energı́a, sin entrar
a alguno de los modos de bajo consumo.
Bit 7 PRTWI Apaga a la interfaz TWI
Bit 6 PRTIM 2 Apaga al temporizador 2
Bit 5 PRTIM 0 Apaga al temporizador 0
Bit 3 PRTIM 1 Apaga al temporizador 1
Bit 2 PRSPI Apaga a la interfaz SPI
Bit 1 PRUSART 0 Apaga a la USART 0
Bit 0 PRADC Apaga al ADC

39
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

11. Fuse Bytes


Los micros AVR tiene unos Bytes de configuración llamados Fuse Bytes, los cuales a su vez implementan
los bits, llamados Fuse Bits, para configurar sus caracterı́sticas.
Para conocer estos fusibles es necesario recurrir a la hoja de datos del microcontrolador con el que
se está trabajando, algunos micros AVR pueden llegar a tener hasta tres Fuse bytes y otros solo uno,
dependiendo de las caracterı́sticas del micro.
En la hoja de datos se puede buscar “Memory Programming”, “LockBits”, “Fuse low byte”.
Estos registros o fusibles son comúnmente llamados “Lfuse“, “Hfuse”, “Efuse“ (Low Fuse, High Fuse
y Extended Fuse).
Para calcular el valor de los registros de configuración es necesario habilitar y deshabilitar los bits
de interés de cada registro y obtener su valor correspondiente en hexadecimal, para posteriormente
programar estos valores en el microcontrolador.

11.1. Fusibles de alto byte


Bit-7: RSTDISBL: Desactivación de reinicio externo
Bit-6: DWEN: Debug Wire habilitado
Bit-5: SPIEN: Habilita la programación en serie y la descarga de datos
Bit-4: WDTON: temporizador de vigilancia siempre activado
Bit-3: EESAVE: Conserva la memoria EEPROM a través del borrado de chip
Bit-2: BOOTSZ1: Establece el tamaño de la memoria del cargador de arranque
Bit-1: BOOTSZ0: Establece el tamaño de memory del gestor de arranque
Bit-0: BOOTRST: Seleccione el vector de reinicio

11.2. Fusibles de bajo byte


Bit-7: CKDIV: División del Reloj para 8 → 0 (programado)
Bit-6: CKOUT: Habilita la salida del Reloj por la terminal PB1 → 1 (sin programar)
Bit-5: SUT1: Selección del tiempo de arranque → 1 (sin programar)
Bit-4: SUT0: Selección del tiempo de arranque → 0 (programado). Este fuse determina los tiempos de
puesta en marcha para la fuente de reloj externo. Éstos deben ser suficientemente largos para garantizar
que el microcontrolador se mantiene en modo ‘reset’ mientras el reloj se está iniciando (no es estable).
Bit-3: CKSEL3: Selección de la fuente del Reloj → 0 (programado)
Bit-2: CKSEL2: Selección de la fuente del Reloj → 0 (programado)
Bit-1: CKSEL1: Selección de la fuente del Reloj → 1 (sin programar)
Bit-0: CKSEL0: Selección de la fuente del Reloj → 0 (programado)

• RC Externo: Generalmente usado para aplicaciones de bajo costo. Usando un resistor y un capa-
citor, la razón de carga/descarga puede ser usada como un reloj de entrada.
• RC Interno: Un muy buen oscilador. El chip tiene incorporado oscilador. Desafortunadamente
no es muy preciso. Es un oscilador de baja potencia que proporciona un reloj de 128 kHz. La
frecuencia es nominal a 3V y 25 ° C. La frecuencia de oscilación es muy sensible a la temperatura
externa.

40
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

• Cristal Oscilador Externo: Conecta un cristal de cuarzo (abreviado como cristal o XTAL) a los
dos pines OSC y el código se ejecutará a la frecuencia entregada. Los pines XTAL1 y XTAL2 son
de entrada y salida, respectivamente, de un amplificador inversor que puede ser configurado para
usar como un oscilador en chip. Se puede utilizar cristal o un resonador cerámico. Este oscilador
de cristal es un oscilador de baja potencia, ofrece el menor consumo de energı́a puede ser más
susceptible al ruido en ambientes ruidosos.
• Resonador Externo: Un resonador es un poco más barato que un oscilador, pero tiene peores
tolerancias.
• Reloj Externo: En vez de un oscilador, puedes ocupar un generador de pulsos de reloj, el cual es
ocupado cuando se necesita que múltiples componentes corran con la misma frecuencia. La salida
del generador debe conectarse en la terminal XTAL1, dejando a la terminal XTAL2 sin conexión.

Para mas info ver página 26 de la hoja de datos.


Para info sobre Clock Prescale ver pagina 33 de la hoja de datos.

41
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

12. Motores
Existen de dos tipos de controles: unidireccional (con interfase) y bidireccional (con puente H).
Motor paso a paso bipolar: Tienen Generalmente cuatro cables de salida. Se requiere un cambio
de dirección del flujo de corriente a través de las bobinas en la secuencia apropiada para realizar un
movimiento.

Motor paso a paso unipolar: Estos motores suelen tener 5 o 6 cables de salida dependiendo de su
conexión interna. Este tipo se caracteriza por ser más simple de controlar. Utilizan un cable común
a la fuente de alimentación y posteriormente se van colocando las otras lı́neas a tierra en un orden
especı́fico para generar cada paso, si tienen 6 cables es porque cada par de bobinas tienen un común
separado, si tiene 5 cables es porque las cuatro bobinas tienen un polo común. Un motor unipolar de
6 cables puede ser usado como un motor bipolar si se deja las lı́neas del común al aire.

Hay tres secuencias para controlar estos motores:


• Simple: Se activa una bobina a la vez, este motor tiene paso más suave pero menos torque y
retención.
• Normal: El motor arranca a un paso por vez y siempre hay dos bobinas activas tiene mayor torque
y retención.
• Medio paso: Se activan dos bobinas después una y ası́ sucesivamente motor con mayor avance a
medio paso real giro más suave y preciso.

12.1. PWM en motores


La frecuencia de la señal debe ser suficientemente alta para que:
No provoque ruido audible (si es que a uno le molesta) → mayor a 15..,20KHz.
No se anule la corriente en el motor (no entre en conducción discontinua).
Pero tampoco se quiere que la frecuencia sea muy alta porque:
Se genera más ruido eléctrico en el sistema.
Hay mayores pérdidas de conmutación/menor eficiencia en el elemento de control (puente H, tran-
sistor...). Esto suele limitar la frecuencia de operación en los puentes H integrados al orden de los
100KHz.

42
Facultad de Ingenierı́a, UBA Laboratorio de Microprocesadores (86.07)

13. Consideraciones para selección de microcontroladores


Primera Consideración Prestaciones del dispositivo

Gama baja Los MCU de 8 y 16 bits están dedicados fundamentalmente a tareas de control (cabinas
telefónicas, tarjetas inteligentes, algunos periféricos de computadoras, etc
Gama media Los dispositivos de 32 bits se orientan a tareas de control con cierto grado de procesa-
miento (sistemas embebidos automotrices, algunos dispositivos móviles, etc. También puede utilizarse
un microprocesador más memoria externa y periféricos

Gama alta En sistemas con procesamiento intensivo (videoconsolas, Smartphones etc.) lo más conve-
niente es emplear microprocesadores de 32 o 64 bits más memoria externa y circuiterı́a periférica
Referente a la tecnologı́a de fabricación, debe considerarse:
La frecuencia de operación es un factor importante a considerar, dado que los dispositivos pueden
operar desde kHz a GHz.
Consumo de energı́a algunos dispositivos cuentan con modos de ahorro de energı́a que les permiten un
consumo de algunos micro Watts.
Voltaje de alimentación además de operar con 5V , algunos MCU pueden trabajar con 3, 3V , 2, 5V o
1, 5V , este aspecto es fundamental si el sistema se alimentará con baterı́as
Otros criterios bajo consideración:
Costo: Hay microcontroladores desde 2 dólares hasta tarjetas de evaluación y desarrollo que cuestan
cientos de dólares.

Herramientas de desarrollo: Muchas veces son gratuitas.


Experiencia: Resulta conveniente acondicionar un MCU conocido, antes de aprender a usar otro.
Tiempo de desarrollo: Minimizar para mantener competitividad.
Compatibilidad: Pocos ajustes en hardware y software para migrar a otro dispositivo.

43

También podría gustarte