Unidad 2: Programación (ATmega)
Ing. Oscar Alonso Rosete Beas
Semana 4 Abril Rev:4 ciclo 2022-1
oscarrosete.com
oscarrosete.com
2.1. Introducción a los lenguajes de programación en microcontroladores.
2.2. Arquitectura y lenguaje de programación Ensamblador.
2.3. Modos de direccionamiento.
2.4. Memoria RAM.
2.5. Lenguaje C.
oscarrosete.com
3.1. Puertos paralelo de Entrada/Salida.
3.2. Manejo de Temporización básica y contadores.
3.3. Interrupciones.
3.4. Puertos Seriales.
3.5. Convertidores A-D y D-A.
oscarrosete.com
oscarrosete.com
oscarrosete.com
Extraido de https://onlinedocs.microchip.com/pr/GUID-E06F3258-483F-4A7B-B1F8-69933E029363-en-US-2/index.html
Las líneas pueden tener una de las siguientes 4 formas:
Un comentario puede tener la siguiente forma:
; [Text]
oscarrosete.com
Keywords
Las palabras claves (keywords) son reservadas y no pueden ser redefinidas. Entre estas se incluyen instrucciones mnemotécnicas y funciones.
Las palabras claves son reconocidas sin importar si se utilizan mayúsculas o minúsculas.
Por ejemplo, add y ADD hacen referencia a la misma operación.
Preprocessor Directives
AVRASM2 considera todas las lineas que comienzan con # como su primer caracter una directiva de preprocesamiento.
oscarrosete.com
Comentarios
Los comentarios como tradicionalmente en ensamblador comienzan con ; , sin embargo, también reconoce comentarios en formato de lenguaje c..
Continuación de lineas
Como en lenguaje C, las lineas del código fuente pueden continuarse al dejar como el ultimo carácter en la linea como una diagonal (\).
oscarrosete.com
Decimal (default) | 10 | |
---|---|---|
Hexadecimal | 0x0a | $0a |
Binario | 0b00001000 | 0b_0000_1000 |
Octal | 077 | 0_77 |
AVRASM2 permite utilizar guiones bajos (_) como separadores para mejorar la legibilidad. Pueden utilizarse en cualquier lugar exceptuando el primer carácter o el especificador de la base.
Por ejemplo, no seria valido utilizar 0_B11 o _0b11.
oscarrosete.com
Las etiquetas definidas por el usuario, obtienen el valor del contador de ubicación en el lugar que aparecen.
PC tiene el valor actual del contador de memoria de programa
Las variables son definidas por el usuario a través de la directiva set. Las constantes por la directiva equ. Los registros pueden ser referenciados a través de símbolos utilizando la directiva def.
.equ/.set/.def
Extraído de AVR Assembler pg.33
oscarrosete.com
DEF
Asigna un nombre simbólico a un registro. Un registro puede tener varios nombres simbólicos.
Sintaxis
.DEF Symbol=Register
https://onlinedocs.microchip.com/pr/GUID-E06F3258-483F-4A7B-B1F8-69933E029363-en-US-2/index.html
Ejemplo
oscarrosete.com
oscarrosete.com
oscarrosete.com
Nomenclatura de registros y operandos
Rd: Registro de destino o precedencia en el archivo de registros.
Rr: Registro de procedencia en el archivo de registros.
R: Resultado después de haber ejecutado la instrucción.
K: Dato constante
k: Dirección constante
b: Bit en el archivo de registros o registro de I/O
s: Bit in registro de estado (3-bit)
A: ubicación I/O
Extraído de: Atmel AVR Instruction Set Manual pg. 1
Ejemplo:
ldi r16,$10 ; Almacena número decimal 16 en registro 16
ldi r24, 0x0A
Tabla ilustrativa extraida de: Atmel AVR Instruction Set Manual pg 25
oscarrosete.com
Divididas en instrucciones aritméticas y logicas, salto , transferencia de datos, manipulación de bit y control de cpu.
oscarrosete.com
Load Immediate (LDI)
Descripción general: Carga directamente una constante de 8-bits a un registro del archivo de registros ubicado entre el 16 y el 31.
Extraído de: Atmel AVR Instruction Set Manual pg. 115
oscarrosete.com
OUT-Store Register to I/O Location
Descripción general: almacena un dato del registro Rr a un espacio I/O (Puertos, Timers, etc)
Extraído de: Atmel AVR Instruction Set Manual pg. 134
oscarrosete.com
Relative Jump (RJMP)
Descripción general: Salto relativo a una ubicación de memoria de programa, también existe JMP.
Extraído de: Atmel AVR Instruction Set Manual pg. 142
oscarrosete.com
Set Bit in I/O Register (SBI)
Descripción general: Habilita un bit específico en un registro I/O.
Extraído de: Atmel AVR Instruction Set Manual pg. 151
oscarrosete.com
Set Bits in Register (SBR)
Descripción general: Habilita bits específicos en el registro Rd.
Extraído de: Atmel AVR Instruction Set Manual pg. 156
Extraído de: Atmel AVR Instruction Set Manual pg. 14
oscarrosete.com
Register Direct, Single Register Rd
Direccionamiento directo (registro individual)
oscarrosete.com
Información general
32 Registros de Propósito General de 8 bits
131 instrucciones
Dos temporizadores/contadores de 8 bits y 1 adicional de 16 bits.
23 líneas I/O programables
PortB 8, PortC 7, PortD 8. Existen funciones alternas para los puertos.
Extraído de: ATmega48A/PA/88A/PA/168A/PA/328/P pg. 13
oscarrosete.com
I/O
Tres registros en memoria relacionadas a I/O son asignados a cada puerto, el registro de datos PORTx, registro de direccion de datos – DDRx, y el puerto de terminales de entrada– PINx.
Los puertos son bidireccional con resistencias pull-ups internas.
Extraído de: ATmega48A/PA/88A/PA/168A/PA/328/P pg. 85
oscarrosete.com
Extraído de: ATmega48A/PA/88A/PA/168A/PA/328/P pg. 100
oscarrosete.com
El bit DDxn en el registro DDRx selecciona la dirección del pin. Si a DDxn se le asigna un valor lógico de 1, Pxn se configura como un pin de salida. Si DDxn se le asigna un valor lógico 0, Pxn sera una terminal de entrada.
Si a PORTxn se le asigna un valor lógico de 1 al ser configurado como terminal de entrada, la resistencia pull-up es activada. para des habilitarla es necesario asignar un 0.
Si a PORTxn se le asigna un valor lógico de 1 al ser configurado como terminal de salida, la terminal de salida tendrá un voltaje en nivel alto. De manera similar con un valor lógico 0 , la terminal tendrá voltaje bajo.
Extraído de: ATmega48A/PA/88A/PA/168A/PA/328/P pg. 85
oscarrosete.com
Cambio de valores de los bits
La escritura de un valor logico de 1 a PINxn habilita el valor de PORTxn, independientemente del valor de DDRxn. Nota que la instrucción SBI/CBI puede ser utilizada para habilitar un bit único en un puerto.
Lectura de valor del pin
Independientemente de la configuración como I/O, la lectura de la terminal se puede realizar a través del bit del registro PINxn.
Extraído de: ATmega48A/PA/88A/PA/168A/PA/328/P pg. 85 y 86
oscarrosete.com
Configurar un pin individual (PB4) como salida y mantener los otros sin cambio:
DDRB |= 1 << 4; ó DDRB |= 0b0001 0000; ó DDRB |= 0x10;
Código ensamblador equivalente:
sbi 0x04, 4 ;
Los registros I/O en el rango 0x00 - 0x1F pueden manipularse con la utilización de SBI y CBI instructions.
Extraído de: ATmega48A/PA/88A/PA/168A/PA/328/P pg. 100
oscarrosete.com
Código ensamblador equivalente:
sbi 0x04, 4 ;
cbi 0x04, 4;
oscarrosete.com
oscarrosete.com
Considerando un proceso industrial donde hay un troquel y un operador es el encargado de iniciar la secuencia, se solicita un sistema de seguridad industrial en el cual solo se da inicio al proceso cuando el operador está presionando dos botones (Pulsador 1 y Pulsador 2) en su área de trabajo, a partir de lo cual habrá un retraso de 2 segundos momento en el cual se activará una notificación auditiva (LED1), por último 2 segundos después se realizará la activación del troquel (LED2).
Utilizando un ATmega 328p, realizar el código en ensamblador y la simulación en ATMEL Studio 7 haciendo uso de sus puertos de I/O.
oscarrosete.com
Diseñar un contador de 0 a FFh que se podrá observar en un display de 7 segmentos, ánodo o cátodo común.
El contador se incrementará cuando un interruptor en la entrada cambie de estado.
Tendrá entrada 1 switch SPST. El contador deberá de tener activada la resistencia del Pull-UP de la entrada, deberá de ser de transición de subida (se incrementa al soltar el interruptor) y libre de cualquier ruido.
oscarrosete.com
Utilizando un ATmega 328p, realizar el código en ensamblador y la simulación en ATMEL Studio 7 haciendo uso de sus puertos de I/O.
oscarrosete.com
Extraído de: Atmel AVR Instruction Set Manual pg. 22
oscarrosete.com
Extraído de: Atmel AVR Instruction Set Manual pg. 25
Extraído de: Atmel AVR Instruction Set Manual pg. 23
F=20MHZ
T=0.05 µs
Con una señal de reloj con frecuencia de 20 MHz cada instrucción LDI duraría 0.05 µs y RJMP .1µs.
oscarrosete.com
Para abrir processor status
1. Start with debugging
2. Debug-->windows--> Processor Status
oscarrosete.com
Con el apoyo de breakpoints y stopwatch visualizamos el conteo de ciclos de la instrucción y el tiempo de duración.
LDI duraría 0.05 µs
oscarrosete.com
Con el apoyo de breakpoints y stopwatch visualizamos el conteo de ciclos de la instrucción y el tiempo de duración.
rjmp duraría 0.10 µs
oscarrosete.com
ldi r16, 0
loop1:
inc r16
cpi r16, 10
brne loop1
For loop of 10 iterations
Cycle analysis
For ldi,inc,cpi 1 cycle
For brne
1 if condition is false 2 if condition is true
ldi: 1 cycle,
First 9 iterations(r16=0,1,...8): 4 cycles
In total 9*4=36
Last iteration
3 cycles
36+3+1=40 cycles in total
oscarrosete.com
ldi r16, 0
loop1:
inc r16
cpi r16, 10
brne loop1
36+3+1=40 cycles in total
oscarrosete.com
jmp main
del_1:
;lineas
ret
main:
rcall del_1
Nota:
rcall dura 3 ciclos
ret dura 4 ciclos
Dispositivos con PC de16-bit
oscarrosete.com
oscarrosete.com
oscarrosete.com
Extraído de: Atmel AVR Instruction Set Manual pg. 100
Extraído de: Atmel AVR Instruction Set Manual pg. 81
oscarrosete.com
oscarrosete.com
Continúa
oscarrosete.com
oscarrosete.com
ldi r17,(1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0)= en registro 17 guardar 0000 1111