3. PROGRAMACIÓN Microcontroladores

Documentos relacionados
Programación en ensamblador y en alto nivel (C)

Introducción a la Computación. Capítulo 10 Repertorio de instrucciones: Características y Funciones

Conceptos de Arquitectura de Computadoras Curso 2015

8.4. El software en los μprocesadores

Elementos de un programa en C

Contenido. Conjunto de Instrucciones. Formato de la Instrucción. Instrucciones de 1 byte. Formato de la Instrucción 28/09/2011

Lección 2 Introducción al lenguaje C

Guía de programación ATMega328pa

El Diseño de un Lenguaje Máquina

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Tema 2. El lenguaje JAVA

LENGUAJE. Tema 2 Elementos de un programa

El lenguaje C. 1. Identificadores, constantes y variables

Práctica de constantes, expresiones y operadores. Programación en C 1

Curso de Programación Avanzada en C

Expresiones y sentencias

Ensamblador. Introducción. Dpto. Física y Arquitectura de Computadores. Universidad Miguel Hernandez

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

El nivel ISA (II)! Conjunto de Instrucciones

Programación de Sistemas. Unidad 1. Programación de Sistemas y Arquitectura de una Computadora

Lenguaje de programación C. Introducción

TIPOS DE DATOS BASICOS EN LENGUAJE C

Resumen de las instrucciones del 8086/8088

INDICE Programa Entrada Unidad de control Unidad aritmética y lógica (ALU)

4. Operadores Operador asignación

Relación de Problemas I

Circuitos Digitales II y Laboratorio Electrónica Digital II y Laboratorio

3 - Arquitectura interna de un up

Ejercicios del tema 4. El procesador

Estructuras de Datos Declaraciones Tipos de Datos

Arquitectura (Procesador familia 80 x 86 )

Elementos léxicos del lenguaje de programación C

Principios de Computadoras II

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

MICROPROCESADORES II LENGUAJE C EN LOS MICROCONTROLADORES PIC

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

Programación n Orientada a Objetos Sentencias Java Parte I. Ing. Julio Ernesto Carreño o Vargas MsC.

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

Estructura de Microprocesadores. Profesor Ing. Johan Carvajal Godínez

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Definición de Memoria

Programación Orientada a Objetos Sentencias Java Parte I Ing. Julio Ernesto Carreño Vargas MsC.

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria

Programación estructurada (Introducción a lenguaje C)

CICLOS DEL PROCESADOR

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Java para programadores

Java Avanzado. Guía 1. Java Avanzado Facultad de Ingeniería. Escuela de computación.

Curso de Programación en C. Licenciatura, FCQeI. APUNTADORES.

Instrucciones de Control de Flujo y Usos de la Pila

Programación En Lenguaje C

REFERENCIA DEL LENGUAJE

Tema 2: Lenguaje máquina. La interfaz entre el hardware y el software

Programación Estructurada

Tema 5: La pila, las macros y los procedimientos

Expresiones Aritméticas. Programación digital I Escuela de Sistemas Facultad de Ingeniería Gilberto Diaz

Lenguajes de programación

Arquitectura de Computadores II 8086 Parte II

Tema 4: Ejemplo de un computador real: ATmegaX8PA. 8-bit Microcontroller

Constantes. Las constantes no cambian durante la ejecucion de un programa en C++, en C++ existen 4 tipos de constantes:

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Practica de PIC 16F84

Ciclos de máquina. Otro ejemplo: decremento de un registro par (donde rp = HL, DE, BC, SP) DCX rp

Ficha de Aprendizaje N 13

Arquitectura de Computadores II Clase #3

Construyendo Programas más Complejos

Datos y tipos de datos

Fundamentos de Programación 2017-I

ENSAMBLADOR DE ARCHIVO TASM MASM NASM GAS. Características de un Ensamblador de Archivo

Estatutos de Control C# Estatutos de Decisión (Selección)

7. Modos de direccionamiento

SISTEMAS OPERATIVOS Arquitectura de computadores

TEMA III: OPERACIONES CON LOS DATOS

Tema 4. Operadores y Expresiones

Análisis general de un Microprocesador

Tema 3 SUBRUTINAS. Estructura de Computadores OCW_2015 Nekane Azkona Estefanía

Tema 2. El lenguaje de programación Java (Parte 1)

Elementos léxicos del lenguaje de programación Java

ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF

1.2.- EL MICROPROCESADOR.

Fundamentos de programación

28/09/2012. Interfaz con Dispositivos de Salida. Interfaz con Dispositivos de Entrada. Port Mapped. Memory mapped. Interfaz con Dispositivos I/O

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

Arquitectura intel Preámbulo de OSO para alumnos formados en el procesador MIPS. Asignatura Sistemas Operativos Murcia abril de 2005

1 ELEMENTOS BASICOS DEL LENGUAJE

Práctica 4 - Arquitectura CPU

Laboratorio de Arquitectura de Redes. Punteros en lenguaje C

Computación II. Introducción a Visual Basic

Tema 3 Elementos básicos de programación

PROGRAMACIÓN EN C. PRÁCTICA 2: Operaciones con bits. Práctica 2: Índice. 2.1 Introducción 2.2 Representación de información binaria en C

Práctica 1. Introducción a la programación en ensamblador

Datos y tipos de datos

ESTRUCTURA Y TECNOLOGÍA A DE COMPUTADORES

Tema 4. Lenguaje máquina y lenguaje ensamblador

Bucles: o Bucles infinitos o Bucles finitos o Bucles anidados Medir tiempos con MPLAB Ejemplos y ejercicios

CONCEPTOS BASICOS DEL LENGUAJE JAVA

Programa Java. El lenguaje de programación Java. Comentarios. Programa Java. Palabras reservadas. Identificadores

Transcripción:

3. PROGRAMACIÓN Microcontroladores M. C. Felipe Santiago Espinosa Octubre de 2016

2 Lenguaje ensamblador Un programa en Ensamblador puede incluir: Instrucciones: Elementos del lenguaje que se traducen a código máquina. Cada instrucción tiene su opcode y sus operandos. El procesador ejecuta las instrucciones para determinar el comportamiento de un sistema. Directivas: Elementos del lenguaje que ayudan en la organización de un programa, indicando diferentes aspectos, como la ubicación del código, definiciones, etc. Las directicas no generan código máquina, son elementos propios de la herramienta que se emplee para ensamblar un programa.

3 Conjunto de Instrucciones El repertorio de instrucciones cuenta con 131 instrucciones ATMega328, las cuales están organizadas en 5 grupos: Instrucciones Aritméticas y lógicas (28) Instrucciones de control de flujo (Bifurcaciones) (36) Instrucciones de transferencia de datos (35) Instrucciones para el manejo y evaluación de bits (28) Instrucciones especiales (4) La mayoría de las instrucciones son de 16 bits.

4 Instrucciones Aritméticas y Lógicas Sumas y restas Instrucción Descripción Operación Banderas ADD Rd, Rs Suma sin acarreo Rd = Rd + Rs Z,C,N,V,H,S ADC Rd, Rs Suma con acarreo Rd = Rd + Rs + C Z,C,N,V,H,S ADIW Rd, k Suma constante a palabra [Rd + 1:Rd] = [Rd + 1:Rd] + k Z,C,N,V,S SUB Rd, Rs Resta sin acarreo Rd = Rd - Rs Z,C,N,V,H,S SUBI Rd, k Resta constante Rd = Rd k Z,C,N,V,H,S SBC Rd, Rs Resta con acarreo Rd = Rd Rs C Z,C,N,V,H,S SBCI Rd, k Resta constante con acarreo Rd = Rd K C Z,C,N,V,H,S SBIW Rd, k Resta constante a palabra [Rd + 1:Rd] = [Rd + 1:Rd] - k Z,C,N,V,S Las que trabajan con palabras se ejecutan en 2 ciclos de reloj, las demás únicamente en 1 ciclo.

5 Multiplicaciones enteras y fraccionales. Instrucción Descripción Operación Banderas MUL Rd, Rs Multiplicación sin signo R1:R0 = Rd * Rs Z,C MULS Rd, Rs Multiplicación con signo R1:R0 = Rd * Rs Z,C MULSU Rd, Rs Multiplicación de un número con R1:R0 = Rd * Rs signo y otro sin signo Z,C FMUL Rd, Rs Multiplicación fraccional sin R1:R0 = ( Rd * Rs ) << 1 signo Z,C FMULS Rd, Rs Multiplicación fraccional con signo R1:R0 = ( Rd * Rs ) << 1 Z,C Multiplicación fraccional de un FMULSU Rd, Rs número con signo y otro sin signo R1:R0 = ( Rd * Rs ) << 1 Z,C Todas se ejecutan en 2 ciclos de reloj.

6 Instrucciones Lógicas Binarias Instrucción Descripción Operación AND Rd, Rs Operación lógica AND Rd = Rd AND Rs ANDI Rd, k Operación lógica AND con una constante Rd = Rd AND k OR Rd, Rs Operación lógica OR Rd = Rd OR Rs ORI Rd, k Operación lógica OR con una constante Rd = Rd OR k EOR Rd, Rs Operación lógica OR Exclusiva Rd = Rd XOR Rs Todas se ejecutan en 2 ciclos de reloj. Instrucciones para enmascarar información Instrucción Descripción Operación SBR Rd, k Pone en alto los bits indicados en la constante Rd = Rd OR k CBR Rd, k Pone en bajo los bits indicados en la constante Rd = Rd AND (0xFF k) Se ejecutan en 1 ciclo de reloj y modifican a las banderas Z, C, N, V y S.

7 Instrucciones Aritméticas o Lógicas Unarias Instrucción Descripción Operación Banderas COM Rd Complemento a 1 Rd = 0xFF Rd Z,C,N,V,S NEG Rd Negado o complemento a 2 Rd = 0x00 Rd Z,C,N,V,H,S INC Rd Incrementa un registro Rd = Rd + 1 Z,N,V,S DEC Rd Decrementa un registro Rd = Rd 1 Z,N,V,S TST Rd Evalúa un registro Rd = Rd AND Rd Z,C,N,V,S CLR Rd Limpia un registro (pone en bajo) Rd = 0x00 Z,C,N,V,S SER Rd Ajusta un registro (pone en alto) Rd = 0xFF Ninguna Se ejecutan en 1 ciclo de reloj.

8 Instrucciones de Control de Flujo Saltos Incondicionales Instrucción Descripción Operación RJMP k Salto relativo PC = PC + k + 1 IJMP Salto indirecto PC = Z JMP k Salto absoluto PC = k Los saltos relativo e indirecto se ejecutan en 2 ciclos de reloj, el salto absoluto en 3. Instrucciones para el manejo de Rutinas Instrucción Descripción Operación RCALL k Llamada relativa a una rutina PC = PC + k + 1, PILA PC + 1 ICALL Llamada indirecta a una rutina PC = Z, PILA PC + 1 CALL k Llamada absoluta a una rutina PC = k, PILA PC + 1 RET Retorno de una rutina PC PILA RETI Retorno de rutina de interrupción PC PILA, I = 1 Las llamadas relativa e indirecta a rutinas se ejecutan en 3 ciclos de reloj, la llamada absoluta y los retornos se ejecutan en 4.

9 Instrucciones para la comparación de datos. Instrucción Descripción Operación CP Rd, Rs Compara dos registros Rd Rs CPC Rd, Rs Compara registros con acarreo Rd Rs C CPI Rd, k Compara un registro con una constante Rd k Modifican las banderas Z, C, N, V, H y S.

Brincos Condicionales. Instrucción Descripción Operación BRBS s, k Brinca si el bit s del registro estado está en alto si(sreg(s) == 1) PC = PC + k + 1 BRBC s, k Brinca si el bit s del registro estado está en bajo si (SREG(s) == 0) PC = PC + k + 1 BRIE k Brinca si las interrupciones están habilitadas si (I == 1) PC = PC + k + 1 BRID k Brinca si las interrupciones están deshabilitadas si (I == 0) PC = PC + k + 1 BRTS k Brinca si el bit T está en alto si (T == 1) PC = PC + k + 1 BRTC k Brinca si el bit T está en bajo si (T == 0) PC = PC + k + 1 BRHS k Brinca si la bandera H está en alto si (H == 1) PC = PC + k + 1 BRHC k Brinca si la bandera H está en bajo si (H == 0) PC = PC + k + 1 BRGE k Brinca si es mayor o igual que (con signo) si (S == 0) PC = PC + k + 1 BRLT k Brinca si es menor que (con signo) si (S == 1) PC = PC + k + 1 BRVS k Brinca si la bandera V está en alto si (V == 1) PC = PC + k + 1 BRVC k Brinca si la bandera V está en bajo si (V == 0) PC = PC + k + 1 BRMI k Brinca si es negativo si (N == 1) PC = PC + k + 1 BRPL k Brinca si no es negativo si (N == 0) PC = PC + k + 1 BREQ k Brinca si los datos son iguales si (Z == 1) PC = PC + k + 1 BRNE k Brinca si los datos no son iguales si (Z == 0) PC = PC + k + 1 BRSH k Brinca si es mayor o igual si (C == 0) PC = PC + k + 1 BRLO k Brinca si es menor si (C == 1) PC = PC + k + 1 BRCS k Brinca si la bandera C está en alto si (C == 1) PC = PC + k + 1 BRCC k Brinca si la bandera C está en bajo si (C == 0) PC = PC + k + 1 Pueden tardar 1 o 2 ciclos de reloj. 10

11 Saltitos Condicionales. Instrucción Descripción Operación CPSE Rd, Rs Un saltito si los registros son iguales si(rd == Rs) PC = PC + 2 o 3 SBRS Rs, b Un saltito si el bit b del registro Rs está en si(rs(b) == 1) PC = PC + 2 o 3 alto SBRC Rs, b Un saltito si el bit b del registro Rs está en si(rs(b) == 0) PC = PC + 2 o 3 bajo SBIS P, b Un saltito si el bit b del registro P está en si(i/o(p, b) == 1) alto, P es un registro I/O PC = PC + 2 o 3 SBIC P, b Un saltito si el bit b del registro P está en si(i/o(p, b) == 0) bajo, P es un registro I/O PC = PC + 2 o 3 Pueden tardar 1, 2 o 3 ciclos de reloj.

12 Instrucciones de Transferencia de Datos Registro de Instrucción (IR) SRAM K 2 Archivo de Registros 32 x 8 4 Flash Memoria de Programa 1 Transferencias entre registros 2 Transferencia de una constante a registro 1024 x 8 Espacio de Propósito General 3 Registros de propósito general 1 5 Registros I/O 64 x 8 Registros para el manejo de Recursos 3 Transferencias entre memoria de datos y registros 4 Transferencias entre memoria de código y registros 5 Transferencias entre registros I/O y de propósito general

13 Trasferencia entre registros. Instrucción Descripción Operación MOV Rd, Rs Copia un registro Rd = Rs MOVW Rd, Rs Copia un par de registros Rd + 1: Rd = Rs + 1: Rs, Rd y Rs registros pares Trasferencia de una constante a un registro. Instrucción Descripción Operación LDI Rd, k Copia la constante en el registro Rd = k

14 Transferencias entre memoria de datos y registros (cargas) Instrucción Descripción Operación LDS Rd, k Carga directa de memoria Rd = Mem[k] LD Rd, X Carga indirecta de memoria Rd = Mem[X] LD Rd, X+ Carga indirecta con post-incremento Rd = Mem[X], X = X + 1 LD Rd, -X Carga indirecta con pre-decremento X = X - 1, Rd = Mem[X] LD Rd, Y Carga indirecta de memoria Rd = Mem[Y] LD Rd, Y+ Carga indirecta con post-incremento Rd = Mem[Y], Y = Y + 1 LD Rd, -Y Carga indirecta con pre-decremento Y = Y - 1, Rd = Mem[Y] LDD Rd, Y + q Carga indirecta con desplazamiento Rd = Mem[Y + q] LD Rd, Z Carga indirecta de memoria Rd = Mem[Z] LD Rd, Z+ Carga indirecta con post-incremento Rd = Mem[Z], Z = Z + 1 LD Rd, -Z Carga indirecta con pre-decremento Z = Z - 1, Rd = Mem[Z] LDD Rd, Z + q Carga indirecta con desplazamiento Rd = Mem[Z + q]

15 Transferencias entre registros y memoria de datos (Almacenamientos) Instrucción Descripción Operación STS k, Rs Almacenamiento directo en memoria Mem[k] = Rs ST X, Rs Almacenamiento indirecto en memoria Mem[X] = Rs ST X+, Rs Almacenamiento indirecto con post-incremento Mem[X] = Rs, X = X + 1 ST -X, Rs Almacenamiento indirecto con pre-decremento X = X - 1, Mem[X] = Rs ST Y, Rs Almacenamiento indirecto en memoria Mem[Y] = Rs ST Y+, Rs Almacenamiento indirecto con post-incremento Mem[Y] = Rs, Y = Y + 1 ST -Y, Rs Almacenamiento indirecto con pre-decremento Y = Y - 1, Mem[Y] = Rs STD Y + q, Rs Almacenamiento indirecto con desplazamiento Mem[Y + q] = Rs ST Z, Rs Almacenamiento indirecto en memoria Mem[Z] = Rs ST Z+, Rs Almacenamiento indirecto con post-incremento Mem[Z] = Rs, Z = Z + 1 ST -Z, Rs Almacenamiento indirecto con pre-decremento Z = Z - 1, Mem[Z] = Rs STD Z + q, Rs Almacenamiento indirecto con desplazamiento Mem[Z + q] = Rs

16 Transferencias entre memoria de datos y registros (Acceso a la Pila) Instrucción Descripción Operación PUSH Rs Inserta a Rs en la pila Mem[SP] = Rs, SP = SP 1 POP Rd Extrae de la pila y coloca en Rd SP = SP + 1, Rd = Mem[SP] Transferencias entre memoria de código y registros Instrucción Descripción Operación LPM Carga indirecta de memoria de programa en R0 R0 = Flash[Z] LPM Rd, Z Carga indirecta de memoria de programa en Rd Rd = Flash[Z] LPM Rd, Z+ Carga indirecta con post-incremento Rd = Flash[Z], Z = Z + 1 SPM Almacenamiento indirecto en memoria de programa Flash[Z] = R1:R0 Transferencias entre Registros I/O y registros de propósito general Instrucción Descripción Operación IN Rd, P Lee de un registro I/O, deja el resultado en Rd Rd = P OUT P, Rs Escribe en un registro I/O, el valor de Rs P = Rs

17 Instrucciones para el manejo y evaluación de bits Desplazamientos y rotaciones Instrucción Descripción Operación LSL Rd Desplazamiento lógico a la izquierda C = Rd(7), Rd(n+1) = Rd(n), Rd(0) = 0 LSR Rd Desplazamiento lógico a la derecha C = Rd(0), Rd(n) = Rd(n + 1), Rd(7) = 0 ROL Rd Rotación a la izquierda C = Rd(7), Rd(n + 1) = Rd(n), Rd(0) = C ROR Rd Rotación a la derecha C = Rd(0), Rd(n) = Rd(n + 1), Rd(7) = C ASR Rd Desplazamiento aritmético a la derecha Rd(n) = Rd(n + 1), n = 0.. 6

18 Instrucción para el intercambio de nibbles. Instrucción Descripción Operación SWAP Rd Intercambia nibbles en Rd Rd(7..4) = Rd(3..0), Rd(7..4) = Rd(3..0) Se ejecuta en 1 ciclo de reloj y no modifica banderas. Instrucciones para modificar bits en los Registros I/O. Instrucción Descripción Operación SBI P, b Pone en alto al bit b del Registro P P(b) = 1 CBI P, b Pone en bajo al bit b del Registro P P(b) = 0 Registros I/O que están en el rango de 0x00 a 0x1F. Se ejecutan en 2 ciclos de reloj y tampoco modifican banderas. Instrucciones para transferencia de bits. Instrucción Descripción Operación BTS Rs, b Almacena al bit b de un registro en T T = Rs(b) BTL Rd, b Carga en el bit b de un registro desde T Rd(b) = T Se ejecutan en 1 ciclo de reloj.

19 Instrucción para manipular los bits del registro Estado Instrucción Descripción Operación BSET s Pone en alto al bit s del registro Estado SREG(s) = 1 BCLR s Pone en bajo al bit s del registro Estado SREG(s) = 0 SEI Pone en alto al habilitador de interrupciones I = 1 CLI Pone en bajo al habilitador de interrupciones I = 0 SET Pone en alto al bit de transferencias T = 1 CLT Pone en bajo al bit de transferencias T = 0 SEH Pone en alto a la bandera de acarreo del nibble bajo H = 1 CLH Pone en bajo a la bandera de acarreo del nibble bajo H = 0 SES Pone en alto a la bandera de signo S = 1 CLS Pone en bajo a la bandera de signo S = 0 SEV Pone en alto a la bandera de sobreflujo V = 1 CLV Pone en bajo a la bandera de sobreflujo V = 0 SEN Pone en alto a la bandera de negativo N = 1 CLN Pone en bajo a la bandera de negativo N = 0 SEZ Pone en alto a la bandera de cero Z = 1 CLZ Pone en bajo a la bandera de cero Z = 0 SEC Pone en alto a la bandera de acarreo C = 1 CLC Pone en bajo a la bandera de acarreo C = 0

20 Instrucciones Especiales Instrucción NOP SLEEP WDR BREAK Descripción No operación, empleada para forzar una espera de 1 ciclo de reloj Introduce al MCU al modo de bajo consumo previamente seleccionado Reinicia al Watchdog Timer, para evitar reinicios por su desbordamiento Utilizada para depuración desde la interfaz DebugWire

21 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: 1. Directo por registro 2. Directo a registros I/O 3. Directo a memoria de datos 4. Indirecto a memoria de datos 5. Indirecto a memoria de código 6. Inmediato 7. Direccionamientos en bifurcaciones

22 Direccionamiento directo por registro Un registro: 11 bits 5 bits OPCODE Rd 5 2=32 REGISTROS R0 R1... Ejemplos: COM R3 INC R5 SER R7 R30 R31

23 Direccionamiento directo por registro Dos registros: 6 bits 5 bits 5 bits OPCODE Rr Rd Ejemplos: ADD R1, R2 SUB R1, R2 AND R1, R2 MOV R1, R2

24 Direccionamiento directo a I/O 5 bits 5 bits 6 bits OPCODE REGISTROS R0 R 5 2=32 P 6 2=64 REGISTROS I/O SREG R1 SPH...... R30 R31 Ejemplos: OUT PORTB, R13 IN R15, PINA

25 Direccionamiento directo a Memoria de Datos 11 bits 5 bits REGISTROS R0 R1 OPCODE DIRECCIÓN DE DATOS n... R30 16 2 = 64k SRAM.... 0 1... R31 0x45F (limitado por el dispositivo) Ejemplos: STS 0x0100, R5 LDS R16, 0x0110

26 Direccionamiento indirecto a Memoria de Datos 11 bits 5 bits OPCODE Rd 5 REGISTROS 2=32 R0 R1 SRAM 0 Ejemplos: LD R5, Y ST X, R11 X, Y o Z quedan especificados como parte del opcode X Y Z.... R26 R27 R28 R29 R30 R31 1... 0x045F

Direccionamiento indirecto a Memoria de Datos Con desplazamiento 27 Y o Z SRAM 5 bits 5 bits 6 bits OPCODE n q R0 R1... R30 R31 Ejemplos: LDD R5, Y+0x020 STD Z+0x10, R11 Y o Z quedan especificados como parte del opcode

Direccionamiento indirecto a Memoria de Datos Con pre-decremento 28 X, Y o Z + SRAM -1 REGISTROS R0 11 bits 5 bits R1 OPCODE Ejemplos: LD R5, -Y ST Z, R11 n... R30 R31

29 Direccionamiento indirecto a Memoria de Datos Con post-incremento X, Y o Z + SRAM 1 REGISTROS R0 11 bits 5 bits R1 OPCODE Ejemplos: LD R5, Y+ ST X+, R6 n... R30 R31

30 Direccionamiento indirecto a Memoria de Código Z FLASH REGISTROS R0 11 bits 5 bits R1 OPCODE n... Ejemplos: LPM LPM SPM (R0 y Z implícitos) R3, Z (R1:R0 y Z implícitos) R30 R31 Nota: También existe una carga indirecta de memoria de código con post-incremento del apuntador Z.

31 Direccionamiento inmediato 4 bits 4 bits 8 bits OPCODE REGISTROS R16 R 4 2 =16 K R17... R30 Ejemplos: R31 ANDI SUBI ORI R17, 0xF3 R19, 0x12 R31, 0x03

32 Direccionamientos en Bifurcaciones Las bifurcaciones o saltos (pueden ser condicionales o incondicionales) permiten cambiar el flujo secuencial, durante la ejecución de un programa. Esto se consigue modificando el valor del registro contador del programa (Program Counter). Cuando no hay una bifurcación, el PC automáticamente debe incrementarse en 1. Indirectas Z PC Ejemplos: IJMP ICALL Nota: El apuntador Z queda implícito en la instrucción.

Direccionamientos en Bifurcaciones 33 Relativas PC + + 1 OPCODE K Ejemplos: RJMP -20 RCALL 32 BREQ 15 BRNE -10 BRGE 10 En bifurcaciones incondicionales, se dispone de 12 bits para K. En bifurcaciones condicionales, Solo se dispone de 7 bits. Notas: 1. En un programa se utilizan etiquetas, el ensamblador calcula el valor de las constantes. 2. Existen bifurcaciones condicionales que sólo brincan la siguiente instrucción, también son relativas al PC.

34 Direccionamientos en Bifurcaciones Absolutas 10 bits 6 bits OPCODE K ( 15 : 0 ) K ( 21 : 16 ) PC Ejemplos: JMP CALL 0x300000 0x1FFFFF Nota: Estos saltos absolutos no están en el ATMega8, pero si en el ATMega16. Para el ATMega8, las bifurcaciones relativas son suficientes para cubrir todo el espacio de memoria de código.

35 Ejercicio: Ignorando como se llevó un conjunto de 20 enteros sin signo a la memoria SRAM, ubicados a partir de la dirección 0x0200 y ocupando un byte por cada entero, realice una secuencia de instrucciones en ensamblador que use direccionamiento indirecto e incluya comparaciones para que, al final de la secuencia en el registro R20 quede el mayor de los 20 enteros. Sugerencia: Revise cómo se resolvería el problema en alto nivel.

36 Directivas comunes: INCLUDE: Se utiliza para leer el código fuente de otro archivo En un ATMega328 se debe agregar:.include <m328pdef.inc>

37 Directivas para definir diferentes tipos de segmentos en un programa: CSEG: Segmento de Código (por omisión). Se crea un archivo.hex para la memoria FLASH. DSEG: Segmento de Datos. Para reservar espacio en la SRAM. ESEG: Segmento de EEPROM. Se crea un archivo.eep, a descargarse en la memoria EEPROM.

38.DSEG ; Inicia un segmento de datos var1:.byte 1 ; Variable de 1 byte en SRAM.CSEG ; Inicia un segmento de código ldi R16, 0x25 ; Instrucciones para alguna tarea mov r0,r16... const:.db 0x02 ; Constante con 0x02 en flash.eseg ; Inicia un segmento de EEPROM eevar1:.db 0x3f ; Constante con 0x3f en EEPROM

39 DB y DW (Define Byte y Define Word) Directivas para definir constantes o variables, en memoria de programa o en EEPROM..CSEG ; Constantes en memoria FLASH const1:.db 0x33 consts1:.db 0, 255, 0b01010101, -128, 0xaa consts2:.dw 0, 0xffff, 0b1001110001010101, -32768, 65535.ESEG ; Constantes en EEPROM eevar1:.db 0x37 eelist1:.db 1,2,3,4 eelist2:.dw 0,0xffff,10

40 EQU: Define una constante simbólica, que puede usarse dentro de las instrucciones. Ejemplo:.EQU io_offset = 0x23.EQU porta = io_offset + 2.CSEG ; Inicia el segmento de código clr r2 ; Limpia el registro 2 out porta, r2 ; Escribe a porta

ORG: Organizar a cualquiera de los segmentos de memoria, indica en qué dirección se ubicará la información subsecuente, pudiendo ser variables en SRAM, constantes en EEPROM o en FLASH, o código en FLASH. 41.DSEG.ORG 0x120 var1:.byte 1 ; Variable en la dirección 0x120 del ; segmento de datos.cseg.org 0x000 ; Código ubicado en la dirección 0x00 RJMP inicio.org 0x010 inicio: MOV R1, R2.... ; Código ubicado en la dirección 0x10

42 HIGH y LOW : Se utilizan para separar constantes de 16 bits. HIGH: Byte alto. LOW: Byte bajo. LDI R20, LOW (1022) LDI R21, HIGH (1022) LDI R30, LOW(tabla) LDI R31, HIGH(tabla).... tabla:.db 0x01,0x02,0x03,0x04

BYTE: Reserva uno o más bytes en SRAM o EEPROM para el manejo de variables, la cantidad de bytes debe especificarse. Este espacio no es inicializado y posteriormente será referido con una etiqueta. 43.DSEG var1:.byte 1 ; variable de 1 byte var2:.byte 10 ; variable de 10 bytes.cseg STS var1, R17 ; acceso a var1 por dir. Directo LDI R30, LOW (var2) ; Z apunta a Var2 LDI R31, HIGH (var2) LD R1, Z ; acceso indirecto a var2

44 PROGRAMACIÓN EN ALTO NIVEL Lenguaje C

45 Tipos de Datos Tipo Tamaño (bits) Rango char 8-128 a 127 unsigned char 8 0 a 255 signed char 8-128 a 127 int 16-32, 768 a 32, 767 short int 16-32, 768 a 32, 767 unsigned int 16 0 a 65, 535 signed int 16-32, 768 a 32, 767 long int 32-2, 147, 483, 648 a 2, 147, 483, 647 unsigned long int 32 0 a 4, 294, 967, 295 signed long int 32-2, 147, 483, 648 a 2, 147, 483, 647 float 32 +/- 1.175 x 10-38 a +/- 3.402 x 10 +38 double 32 +/- 1.175 x 10-38 a +/- 3.402 x 10 +38

46 Definiciones en WINAVR typedef signed char typedef unsigned char typedef signed int typedef unsigned int typedef signed long int typedef unsigned long int int8_t uint8_t int16_t uint16_t int32_t uint32_t

47 Operadores ejemplo z *= 12; equivalente a z = z * 12; z /= 2; equivalente a z = z / 12 Operador ternario Expresión1? Expresión2 : Expresión3; Asignación después de una manipulación de bits.

48 Operadores de manipulación de bits Complemento Uno ~ Desplazamiento a la Izquierda Trabajan sobre operandos que no son punto flotante (char, int, long) y afectan el resultado al nivel de bits. Operadores Lógicos << Desplazamiento a la Derecha >> AND AND & OR OR Exclusiva && OR NOT! Tratan a los operandos como expresiones FALSAS o VERDADERAS. ^

49 15 Estructuras de control Secuencial Selección simple Selección Doble // Expresiones en secuencia a = conta + 5;... contador++; if(expresión) Proposición if(expresión) proposición1 else proposición2

50 15 Estructuras de control Selección Múltiple Repetición Mientras switch (expresión){ case exp-const: proposiciones case exp-const: proposiciones default: proposiciones } while(expresión) proposición

51 15 Estructuras de control Repetición Hacer/Mientras Repetición Para/Hasta do proposición for (expr1; expr2; expr3) while(expresión); proposición

52 Tipos de Memoria Datos en SRAM Variables: Datos que van a ser leídos o escritos repetitivamente. SRAM este es el espacio de almacenamiento por default. unsigned char x, y; unsigned int a, b, c; Si es posible, el compilador utilizará los registros de propósito general (R0 a R31). Los apuntadores son manejados en SRAM y hacen referencia a objetos de SRAM, un ejemplo de declaraciones y uso es: char cadena[] = "hola mundo"; char *pcad; pcad = cadena;

53 Datos en FLASH Constantes: Datos que no cambiarán durante la ejecución normal de un programa. Si las constantes se manejan en memoria FLASH, se liberarán espacios significativos de SRAM. Útil para cadenas de texto o tablas de búsqueda. Se requiere el uso de la palabra reservada const e incluir al atributo PROGMEM, definido en la biblioteca pgmspace.h (en WinAVR). Ejemplos de declaraciones: const char cadena[] PROGMEM = Cadena con un mensaje constante ; const unsigned char tabla[] PROGMEM = { 0x24, 0x36, 0x48, 0x5A, 0x6C };

54 Declaración de constantes -> ámbito global. Acceso -> funciones de la biblioteca pgmspace.h Ejemplos: pgm_read_byte(address); pgm_read_word(address); pgm_read_dword(address); // Lee 8 bits // Lee 16 bits // Lee 32 bits Reciben como argumento la dirección del dato en FLASH. x = pgm_read_byte(&tabla[i]); Es posible el manejo de apuntadores, un apuntador a datos en memoria FLASH se declara como PGM_P.

55 La biblioteca incluye funciones que trabajan con bloques completos de memoria FLASH. strcpy_p: Sirve para leer una cadena de memoria FLASH y depositarla en SRAM. char buf[32]; // Buffer destino, en SRAM PGM_P p; // Apuntador a memoria FLASH p = cadena; strcpy_p(buf, p); // p apunta a la cadena en FLASH // copia de FLASH a SRAM

56 Datos en EEPROM Variables en las que se requiera conservar su contenido aún en ausencia de energía. Deberán almacenarse en la EEPROM. Deberá utilizarse el atributo EEMEM, definido en la biblioteca eeprom.h, también en WinAVR. Son declaraciones globales y se deben hacer antes de cualquier declaración enfocada hacia la SRAM. #include <avr/eeprom.h> //Biblioteca para la EEPROM EEMEM int contador = 0x1234; // Un entero:2 bytes EEMEM unsigned char clave[4] = { 1, 2, 3, 4}; // 4 bytes En la EEPROM: 34 12 01 02 03 04 FF FF FF...

57 Para el acceso a los datos en la EEPROM: Por medio de los registros EEAR, EEDR y EECR. Funciones en la biblioteca eeprom.h, ejemplos: eeprom_read_byte: Lee un byte de la EEPROM, en la dirección que recibe como argumento. eeprom_write_byte: Escribe un byte en la EEPROM, como argumentos recibe la dirección y el dato. También se incluyen funciones para datos de 16 y 32 bits, así como para el manejo de bloques de memoria.

58 PROGRAMAS DE EJEMPLO En Ensamblador y en Lenguaje C

59 Parpadeo de un LED Realice un programa que haga parpadear un LED conectado en la terminal PB0 a una frecuencia aproximada de 1 Hz (periodo de 1 seg.), considerando un ciclo útil del 50 % (½ seg. encendido y ½ seg. apagado).

60 Decodificador de binario a 7 Segmentos Desarrolle un programa que lea los 4 bits menos significativos del Puerto D [PD3:PD0] y genere su código en 7 segmentos en el Puerto B. Num g f e d c b a HEX 0 0 1 1 1 1 1 1 0x3F 1 0 0 0 0 1 1 0 0x06 2 1 0 1 1 0 1 1 0x5B 3 1 0 0 1 1 1 1 0x4F 4 1 1 0 0 1 1 0 0x66 5 1 1 0 1 1 0 1 0x6D 6 1 1 1 1 1 0 1 0x7D 7 0 0 0 0 1 1 1 0x07 8 1 1 1 1 1 1 1 0x7F 9 1 1 0 0 1 1 1 0x67 A 1 1 1 0 1 1 1 0x77 B 1 1 1 1 1 0 0 0x7C C 0 1 1 1 0 0 1 0x39 D 1 0 1 1 1 1 0 0x5E E 1 1 1 1 0 0 1 0x79 F 1 1 1 0 0 0 1 0x71

61 Decodificador de binario a 7 Segmentos INICIO PortD como Entrada PortB como Salida Dato! PinD & 0x0F Portb = 0x00 = 0x01 Dato? = 0x02 = 0x0E = 0x0F! 0x3F Portb! 0x06 Portb! 0x 5B... Portb! 0x79 Portb! 0x71

Diseño de una ALU de 4 bits 62 Construya una ALU de 4 bits utilizando un ATMega8, en donde los operandos se lean del puerto B (nibble bajo para el operando A y nibble alto para el operando B), el resultado se genere en el puerto D y con los 3 bits menos significativos del puerto C se defina la operación. PortC[2:0] Operación 000 R = A + B 001 R = A - B 010 R = A * B 011 R = A AND B 100 R = A OR B 101 a 111 R = 0

Diseño de una ALU de 4 bits 63 INICIO PortB y PortC como Entradas PortD como Salida A! PinB & 0x0F B! ( PinB & 0xF0) >> 4 Op! PinC & 0x07 = 000 Op? otros = 001 = 100 = 010 = 011 R! A + B R! A - B R! A * B R! A & B R! A B R! 0 PortD! R