Diseño con microcont microcontroladore roladoress AVR en lenguajes lenguajes MikroCPro MikroCPro for AVR AVR
Docente: Ing. Roger Guachalla Narváez
[email protected]
PRAC PRACTI TICA CA 01: Puertos Puertos de Entrada/Sa Entrada/Salida lida en el Microcontr Microcontrolador olador ATMe ATMega16/ ga16/32 32
Conocer Conocer las caracterís característica ticass principale principaless de los microntr microntrolado oladores res AVR ATMEGA1 ATMEGA16/32 6/32 Utilizar los puertos digitales digitales de Entrada y Salida en del ATMEGA ATMEGA 16/32 Simular el control de luces de un automóvil por medio de pulsadores, interruptores y leds
a) LA FAMI FAMILI LIA A AVR AVR DE DE ATM ATMEL EL La familia familia de Microco Microcontrol ntroladore adoress AVR son fabric fabricados ados por por la empresa empresa ATMEL. ATMEL. Estos Estos microcontr microcontrolad oladores ores están están divididos en tres grupos: grupos: TinyAVR, AVR Clasico y MegaAVR. MegaAVR. Se muestran en la tabla los dispositivos dispositivos de la serie AVR:
Todos Todos los dispos dispositiv itivos os AVR tienen tienen la misma misma organizació organización n de la memori memoriaa y conjunto conjunto de instrucc instrucciones iones.. De esta esta forma forma el migrar de un dispositivo AVR a otro es fácil. El núcleo es el mismo para todos los dispositivos dispositivos AVR. La diferencia entre estos grupos es la complejidad complejidad del dispositivo. dispositivo. Así, el que posee posee más características es el megaAVR y que tiene menos menos es el tinyAVR.
b) CARAC CARACTER TERÍST ÍSTICA ICASS DEL ATMEGA ATMEGA16/ 16/32/ 32/64 64
Microcontrolador AVR de 8 bits de alto rendimiento re ndimiento y bajo consumo. Arquitectura Avanzada RISC • 131 instrucciones. La mayoría de un solo ciclo de reloj de ejecución. • 32 registros de trabajo de 8 bits para propósito general. • Funcionamiento estático total. • Capacidad de procesamiento de unos 20 MIPS a 20 MHz. • Multiplicador por hardware de 2 ciclos Memorias de programa y de datos no volátiles de alta duración • 16/32/44 K bytes de FLASH auto programable en sistema • 512B/1K/2K bytes de EEPROM • 1/2/4K bytes de SRAM Interna • Ciclos de escritura/borrado: 10.000 en Flash / 100.000 en EEPROM • Retención de Datos: 20 años a 85ºC / 100 años a 25ºC • Sección opcional de código Boot con bits de bloqueo independientes. • Programación en sistema del del programa Boot que se encuentra dentro dentro del mismo chip. • Operación de lectura durante la escritura. • Bloqueo programable para la seguridad del software. Interface JTAG • Capacidades de Boundary Scan de acuerdo con el estándar JTAG • Soporte Extendido Debug dentro del chip fusibles y bits de bloqueo a través de la interface JTAG. • Programación de FLASH, EEPROM, fusibles Características de los periféricos separado y modo comparación. • Dos Timer/Contadores de 8 bits con prescalamiento separado modo comparación y modo de captura. • Un Timer/Contador de 16 bits con prescalamiento separado, modo • Contador en Tiempo Real con Oscilador separado • 6 Canales para PWM
• ADC de 10 bits y 8 canales (Modo Diferencial con ganancia seleccionable a x1, x10 o x200). • Interface serie de dos hilos TWI orientado a byte. • Dos puertos Seriales USART Programables • Interfaz Serial SPI maestro-esclavo • Watchdog Timer programable con oscilador independiente, dentro del mismo chip. • Comparador Analógico dentro del mismo Chip • Interrupt and Wake-up on Pin Change Características especiales del microcontrolador • Power-on Reset (en el encendido) y detección de Brown-out (reset por caída de voltaje) programable. • Oscilador RC interno calibrado. • Fuentes de interrupción externas e internas. • 6 modos de ahorro: Idle, Reducción de Ruido ADC, Power-save, Power-down, Standby y Standby extendido. Encapsulados para Entradas/Salidas (E/S) • 32 líneas de E/S programables. • PDIP de 40 pines, TQFP y QFN/MLF de 44 pines. Voltajes de Operación • 2.7 a 5.5V para el ATMEGA 16/32 Frecuencia de Funcionamiento • ATMEGA 16/32P: 0 – 10MHz @ 2.7 – 5.5V - 20MHz @ 4.5 – 5.5V Consumo de energía a 1MHz, 1.8V, 25ºC para el ATMEGA 164P/324P/644P • Activo: 0.4mA • Modo Power-down: 0.1uA • Modo Power-Save: 0.6uA (Incluye RTC de 32 Khz)
c) PATILLAJES DEL ATMEGA 16/32 A continuación se detallan las terminales del ATmega32:
VCC Fuente de voltaje de alimentación GND Tierra. Puertos I/O Los puertos A, B, C, y D son de 8 bits bidireccionales con resistores internos pull-up (seleccionados por cada bit). El buffer de salida de cada puerto tiene la capacidad de abastecer y drenar corriente. Cuando los pines Px0 a Px7 de cada puerto son usados como entrada y externamente jalados hacia tierra, ellos abastecen corriente si las resistencias internas pull-up se activan. Los pines de cada puerto se encuentran en tri-state cuando la condición de Reset se activa.
Puerto A (PA7..PA0) Además el puerto A sirve como entradas analógicas al convertidor ADC.
Puerto B (PB7..PB0) El puerto B también alberga funciones de registros de especiales, como se enlistan en la siguiente Tabla:
Puerto C (PC7..PC0) Puerto D (PD7..PD0) El puerto D también alberga funciones de registros de especiales, como se enlistan en la siguiente Tabla:
RESET Entrada de reinicio (RESET) Un nivel bajo en este pin aplicado por más de un tiempo del mínimo pulso (1.5 μs) generar á un reset, aún si el reloj no está corriendo. XTAL1 Entrada para el amplificador del oscilador invertido y entrada para el circuito de operación del reloj interno.. XTAL2 Salida del Oscilador amplificador de salida. AVCC Fuente de voltaje para el Puerto A del Convertidor A/D Deberá ser conectada a Vcc, aún si el ADC no se utiliza. Si el ADC se utiliza se conecta a Vcc a través de un filtro pasa bajo. AREF Pin de referencia analógica para el convertidor A/D.
d) CONJUNTO DE INSTRUCCIONES ASSEMBLER Rd Rr R K k b s X,Y,Z P q
NOMENCLATURA DEL CONJUNTO DE INSTRUCCIONES Registros y operandos Registro destino (y fuente) del bloque de registros de trabajo Registro fuente del bloque de registros de trabajo Resultado después de que una instrucción es ejecutada Dato inmediato (constante) Dirección de memoria Bit de un registro I/O (7-0) Bit en el registro de estado (SREG) Registros de direccionamiento indirecto o registros de palabra (X=R27:R26 Y=R29:R28 Z=R31:R30) Registros del bloque I/O Desplazamiento (6-bit) por direccionamiento directo
Banderas del registros de estado (SREG) C: Bandera de acarreo Z: Bandera de resultado cero N: Bandera de resultado negativo V: Indicador de complemento a dos desbordado
S: N⊕V para pruebas de signo H: Bandera de medio acarreo T: Bit transferido por la instrucción BLD o BST I: Bandera de interrupciones globales
RESUMEN DEL CONJUNTO DE INSTRUCCIONES Instrucciones Aritméticas y Lógicas Mnemónico
Operandos
Descripción
ADD ADC ADIW SUB SUBI SBC SBCI AND ANDI OR ORI EOR COM NEG SBR CBR INC DEC TST CLR SER ADIW SBIW MUL MULS MULSU
Rd,Rr Rd,Rr Rd, K Rd,Rr Rd,K Rd,Rr Rd,K Rd,Rr Rd,K Rd,Rr Rd,K Rd,Rr Rd Rd Rd,K Rd,K Rd Rd Rd Rd Rd Rd+1:Rd,K Rd+1:Rd,K Rd,Rr Rd,Rr Rd,Rr
Suma sin acarreo Suma sin acarreo Suma un inmediato a un registro de palabra Resta sin acarreo Resta un inmediato Resta con acarreo Resta un inmediato con acarreo AND lógico AND lógico con inmediato OR lógico OR lógico con inmediato OR exclusivo Complemento a uno Complemento a dos Pon a uno los bits de un registro Pon a cero los bits de un registro Incrementa al registro Decrementa al registro Revisa si es cero o menor Borra el registro Carga los bits de un registro Suma un inmediato a un registro de palabra Resta un inmediato a un registro de palabra Multiplica sin signo Multiplica con signo Multiplica signado con no signado
Instrucciones de desvío (salto) Mnemónicos
Operandos
Descripción
RJMP IJMP EIJMP JMP RCALL ICALL EICALL CALL RET RETI CPSE CP CPC CPI SBRC SBRS SBIC SBIS BRBC BRBS BREQ BRNE BRCS BRCC BRSH BRLO BRMI BRPL BRGE BRLT BRHS BRHC BRTS BRTC BRVS BRVC BRIE BRID
k Ninguno Ninguno k k Ninguno Ninguno k Ninguno Ninguno Rd,Rr Rd,Rr Rd,Rr Rd,K Rr,b Rr,b P,b P,b s,k s,k k k k k k k k k k k k k k k k k k k
Salto relativo Salto indirecto Salto indirecto extendido Salto Llamada relativa a subrutina Llamada indirecta a subrutina Llamada indirecta a subrutina extendida Llamada a subrutina Regreso de subrutina Regreso de interrupción Compare y salta si es igual Compara Compara con acarreo Compara con inmediato Salta si el bit del registro es cero Salta si el bit del registro es uno Salta si el bit del registro I/O es cero Salta si el bit del registro I/O es uno Salta si el bit de SREG es cero Salta si el bit de SREG es uno Salta si es igual Salta si es diferente Salta si C está a uno Salta si C está a cero Salta si es mayor o igual Salta si es menor Salta si es negativo Salta si es mayor Salta si es mayor o igual (con signo) Salta si es menor (con signo) Salta si H está a uno Salta si H está a cero Salta si T está a uno Salta si T está a cero Salta si V esta a uno Salta si V está a cero Salta si I está a uno Salta si I está a cero
Instrucciones de Transferencia de Datos Mnemónicos
Operandos
Descripción
MOV MOVW LDI LDS LD LD LD LD LD LD LDD LD LD LD LDD STS ST ST ST ST ST ST ST ST ST ST ST LPM SPM IN OUT PUSH POP
Rd,Rr Rd,Rr Rd,K Rd,k Rd,X Rd,X+ Rd,-X Rd,Y Rd,Y+ Rd,-Y Rd,Y+q Rd,Z Rd,Z+ Rd,-Z Rd,Z+q k,Rr X,Rr X+,Rr -X,Rr Y,Rr Y+,Rr -Y,Rr Y+q,Rr Z,Rr Z+,Rr -Z,Rr Z+q,Rr Ninguno Ninguno Rd,P P,Rr Rr Rd
Copia de registros Copia registros de palabra Carga de un inmediato Carga directa Carga indirecta Carga indirecta con Post-Incremento Carga indirecta con Pre-Decremento Carga indirecta Carga indirecta con Post-Incremento Carga indirecta con Pre-Decremento Carga indirecta con desplazamiento Carga indirecta con Carga indirecta con Post-Incremento Carga indirecta con Pre-Decremento Carga indirecta con desplazamiento Almacena directamente Almacena indirectamente Almacena indirectamente con Post-Incremento Almacena indirectamente con Pre-Decremento Almacena indirectamente Almacena indirectamente con Post-Incremento Almacena indirectamente con Pre-Decremento Almacena indirectamente con desplazamiento Almacena indirectamente Almacena indirectamente con Post-Incremento Almacena indirectamente con Pre-Decremento Almacena indirectamente con desplazamiento Carga memoria de programa Almacena memoria de programa Cargar un registro con un I/O Cargar un I/O con un registro Cargar registro en la pila Sacar dato de la pila
Instrucciones de Bit y prueba de Bit Mnemónicos
Operandos
Descripción
LSL LSR ROL ROR ASR SWAP BSET BCLR SBI CBI BST BLD SEC CLC SEN CLN SEZ CLZ SEI CLI SES CLN SEV CLV SET CLT SEH CLH NOP SLEEP WDR
Rd Rd Rd Rd Rd Rd s s P,b P,b Rr,b Rd,b Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno
Desplazamiento a la izquierda Desplazamiento a la derecha Rotación a la izquierda con acarreo Rotación a la derecha con acarreo Desplazamiento aritmético Intercambio de nibbles Poner a uno la bandera Poner a cero la bandera Poner a uno el bit de un registro I/O Poner a cero el bit de un registro I/O Guarda en T el bit de un registro Carga T en el bit de un registro Poner a uno la bandera C Poner a cero la bandera C Poner a uno la bandera N Poner a cero la bandera N Poner a uno la bandera Z Poner a cero la bandera Z Poner a uno la bandera I Poner a cero la bandera I Poner a uno la bandera S Poner a cero la bandera S Poner a uno la bandera V Poner a cero la bandera V Poner a uno la bandera T Poner a cero la bandera T Poner a uno la bandera H Poner a cero la bandera H No operación Modo Sleep Reiniciar el Watchdog
e) FUSIBLES ATMEGA32 Los fusibles de los microcontroladores megaAVR, controlan características como la fuente de reloj a trabajar, activación de la protección por bajo voltaje de alimentación, habilitación del JTAG, selección del bootloader, entre otros. Estos fusibles son modificados usando un programador y normalmente son modificados cuando se programa la memoria flash del microcontrolador. Cuando los fusibles son programados, el valor leído es "0". En el caso del ATmega16/32, existen dos bytes para los fusibles conocidos como el byte alto y byte bajo de los fusibles. Parte alta de los fusibles (Fuse High Byte)
Nombre
No. de Bit
OCDEN JTAGEN SPIEN CKOPT EESAVE
7 6 5 4 3
BOOTSZ1 BOOTSZ0 BOOTRST
2 1 0
Descripción Habilitación OCD Habilitación JTAG Habilitación de programación serial SPI Opciones del oscilador Los datos en la memoria EEPROM son preservados cuando se borra el chip Selección del tamaño del Bootloader Selección del tamaño del Bootloader Selección del vector de reset
Valor por defecto 1 (OCD deshabilitado) 0 (JTAG deshabilitado) 0 (prog. SPI habilitado) 1 1 (EEPROM no preservado) 0 0 1
Parte baja de los fusibles (Fuse Low Byte)
Nombre
No. de Bit
BODLEVEL BODEN SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0
7 6 5 4 3 2 1 0
Descripción
Valor por defecto
Nivel de detección bajo voltaje alim. Habilitación detector bajo voltaje alim. Selección de tiempo de arranque Selección de tiempo de arranque Selección fuente de reloj Selección fuente de reloj Selección fuente de reloj Selección fuente de reloj
1 1 (BOD deshabilitado) 1 0 0 0 0 1
OCDEN: Este fusible habilita o deshabilita la depuración On-Chip del microcontrolador.
JTAGEN: Este fusible habilita o deshabilita la interfaz JTAG que se encuentra en el Puerto C del ATmega16. Es importante que cuando no se vaya a usar esta interfaz se garantice que este deshabilitada para que haya un funcionamiento normal del Puerto C.
SPIEN: Este fusible habilita o deshabilita la programación serial SPI. Si se está usando este modo de programación, no es posible cambiar este bit.
CKOPT: Este fusible selecciona entre dos modos de amplificador del oscilador. Cuando está programado el reloj es más inmune al ruido y se pueden manejar un rango amplio de frecuencias, aunque con un consumo mayor de potencia.
EESAVE: La habilitación de este fusible genera que los datos en la memoria EEPROM no sean borrados cuando se realice una operación de borrado del microcontrolador.
BOOTSZ1:0: Estos fusibles establecen el tamaño del Bootloader: Páginas
Sección de Aplicación en la Flash
Sección del Bootloader en la flash
Dirección de Reset (Inicio de la sección del Bootlader
BOOTSZ1
BOOTSZ0
Tamaño del Boot
1
1
128 words
2
$0000 -$1F7F
$1F80 -$1FFF
$1F80
1 0 0
0 1 0
256 words 512 words 1024 words
4 8 16
$0000 -$1EFF $0000 -$1DFF $0000 -$1BFF
$1F00 -$1FFF $1E00 -$1FFF $1C00 -$1FFF
$1F00 $1E00 $1C00
BOOTRST: Cuando este fusible es programado, el dispositivo salta a la dirección de reset asignada con los fusibles BOOTSZ1:0. Si no es programado, iniciara en la posición cero.
BODLEVEL: Este fusible es usado para seleccionar entre los dos niveles de voltaje en el cual el microcontrolador se reinicia cuando la alimentación está por debajo del nivel seleccionado. Sino está programado este fusible, el nivel de voltaje es de 2.7V y si está programado el nivel de voltaje es de 4.0V.
BODEN: Este fusible habilita la protección por bajo voltaje. Si este fusible es programado, el microcontrolador se reiniciará de acuerdo al nivel seleccionado con el fusible BODLEVEL.
SUT1:0: Estos fusibles seleccionan entre diferentes retardos para el funcionamiento inicial del dispositivo. El valor seleccionado depende del reloj seleccionado.
CKSEL3:0: Estos fusibles permiten seleccionar entre diferentes fuentes de reloj para el dispositivo:
Fuente de reloj
CKSEL3:0
Resonador de cristal/cerámico externo Cristal externo de baja frecuencia Oscilador externo RC Oscilador interno RC calibrado Reloj externo
1111-1010 1001 1000-0101 0100-0001 0000
Al seleccionar el resonador de cristal/cerámico externo se pueden seleccionar diferentes retardos de inicio, de acuerdo al valor asignado a los fusibles SUT1:0. Cuando se trabaja con el oscilador externo RC se pueden alcanzar frecuencias hasta los 12MHz con un circuito RC. Y finalmente, cuando se trabaja con el oscilador interno RC se pueden obtener frecuencias de 1, 2, 4 y 8 MHz con los fusibles en "0001", "0010", "0011" y "0100" respectivamente.
I. II. III.
Realizar un RESUMEN (a mano) de por lo menos 4 páginas del fundamento teórico del ATMEGA32 Convertir el código en MikroBasicPro de ‘Control de Luces del Automovil’ al lenguaje MikroCPro for AVR
Realilzar un progama en lenguaje Assembler AVR que realice la siguiente tarea: Se obtiene un dato X de los 4 bits inferiores del puerto D de (bits 0 al 3) y un dato Y de los 4 bits superiores del puerto D (bits 4 al 7). Se multiplica X*Y, el resultado se muestra en los 8 bits del puerto C
IV.
V.
Investigar el Código en lenguaje Ensamblador AVR para realizar el algoritmo para calcular la función trigonomética SENO. Incluir la teoría escrita a mano y el código en Assembler comentado Conclusiones