Beruflich Dokumente
Kultur Dokumente
PROGRAMACIÓN
Microcontroladores
Marzo de 2018
2
Lenguaje ensamblador
Un programa en Ensamblador puede incluir:
Conjunto de Instrucciones
• El repertorio del ATMega328 cuenta con 131 instrucciones,
las cuales están organizadas en 5 grupos:
ADIW Rd, k Suma constante a palabra [Rd + 1:Rd] = [Rd + 1:Rd] + k Z,C,N,V,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 sólo en 1 ciclo.
5
• “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
Un saltito si el bit b del registro Rs está en
SBRS Rs, b si(Rs(b) == 1) PC = PC + 2 o 3
alto
Un saltito si el bit b del registro Rs está en
SBRC Rs, b si(Rs(b) == 0) PC = PC + 2 o 3
bajo
Un saltito si el bit b del registro P está en si(I/O(P, b) == 1)
SBIS P, b
alto, P es un registro I/O PC = PC + 2 o 3
Un saltito si el bit b del registro P está en si(I/O(P, b) == 0)
SBIC P, b
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
Flash
Registro de Instrucción (IR)
Archivo de Registros
K
1 Transferencias entre registros
4 Memoria
de Programa
2 2 Transferencia de una constante
SRAM
32 x 8 a registro
Registros 1
1024 x 8 3 Transferencias entre memoria de
de propósito Registros I/O datos y registros
Espacio de general
3
Propósito 4 Transferencias entre memoria de
General 64 x 8
código y registros
5
Registros
para el 5 Transferencias entre registros I/O
manejo de y de propósito general
Recursos
13
Instrucciones Especiales
Instrucción Descripción
NOP No operación, empleada para forzar una espera de 1 ciclo de reloj
SLEEP Introduce al MCU al modo de bajo consumo previamente seleccionado
Re i n i c i a a l Wa t c h d o g T i m e r, p a r a e v i t a r r e i n i c i o s p o r s u
WDR
desbordamiento
BREAK 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:
11 bits 5 bits
OPCODE Rd
REGISTROS
R0
2=32
5
R1
...
R30
R31
Ejemplos:
COM R3
INC R5
SER R7
23
OPCODE Rr Rd
Ejemplos:
ADD R1, R2
SUB R1, R2
AND R1, R2
MOV R1, R2
24
OPCODE R P
REGISTROS I/O
REGISTROS
2=32
5
R0 2=64
6
SREG
R1 SPH
... ...
R30
R31
Ejemplos:
OUT PORTB, R13
IN R15, PIND
25
OPCODE n ...
SRAM R31
0
16
2 = 64k
1
.... ...
Ejemplos:
STS 0x0100, R5
LDS R16, 0x0110
26
11 bits 5 bits
OPCODE Rd
2=32
5 REGISTROS
SRAM
R0
R1 0
.... 1
Ejemplos:
LD R5, Y R26 ...
X
ST X, R11 R27
0x045F
R28
Y
R29
X, Y o Z quedan
especificados como R30
Z
parte del opcode R31
27
YoZ SRAM
OPCODE n q
R0
R1
...
Ejemplos:
R30 LDD R5, Y+0x020
STD Z+0x10, R11
R31
Y o Z quedan especificados
como parte del opcode
28
X, Y o Z
SRAM
+
-1
REGISTROS
R0
11 bits 5 bits
R1
OPCODE n ...
R30
Ejemplos:
LD R5, -Y R31
ST –Z, R11
29
X, Y o Z
+
SRAM
REGISTROS
R0
11 bits 5 bits
R1
OPCODE n ...
R30
Ejemplos:
LD R5, Y+ R31
ST X+, R6
30
FLASH
REGISTROS
R0
11 bits 5 bits
R1
OPCODE n ...
R30
Ejemplos:
LPM (R0 y Z implícitos) R31
LPM R3, Z
SPM (R1:R0 y Z implícitos)
Nota: También existe una carga indirecta de memoria de código
con post-incremento del apuntador Z.
31
Direccionamiento inmediato
OPCODE R K
REGISTROS
4
2 =16
R16
R17
...
R30
Ejemplos:
R31
ANDI R17, 0xF3
SUBI R19, 0x12
ORI 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).
Indirectas
Z PC
Ejemplos:
IJMP
ICALL
Direccionamientos en Bifurcaciones
Relativas
PC
+ +
OPCODE K
Ejemplos:
RJMP -20
En bifurcaciones incondicionales,
RCALL 32
se dispone de 12 bits para K.
BREQ 15
BRNE -10 En bifurcaciones condicionales,
BRGE 10 Solo se dispone de 7 bits.
Direccionamientos en Bifurcaciones
Absolutas
10 bits 6 bits
OPCODE K ( 21 : 16 )
PC
K ( 15 : 0 )
Ejemplos:
JMP 0x300000
CALL 0x1FFFFF
35
Ejercicio:
• Ignorando cómo 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.
Directivas comunes:
• INCLUDE: Se utiliza para leer el código fuente de otro archivo
.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
• Ejemplo:
.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: ; Código ubicado en la dirección 0x10
MOV R1, R2
. . . .
42
.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
PROGRAMACIÓN EN
ALTO NIVEL
Lenguaje C
45
Tipos de Datos
Definiciones en WINAVR
Operadores
ejemplo
Operador ternario
Expresión1 ? Expresión2 : Expresión3; Asignación después de
una manipulación de bits.
48
Manipulación de bits
Complemento Uno ~
Desplazamiento a la <<
Izquierda
Desplazamiento a la Derecha >>
AND &
OR |
OR Exclusiva ^
Trabajan sobre operandos que no
son punto flotante (char, int, long) y
afectan el resultado al nivel de bits.
Operadores Lógicos
AND && Tratan a los
operandos como
OR ||
expresiones FALSAS
NOT ! o VERDADERAS.
49 15
Estructuras de control
Secuencial Selección simple Selección Doble
if(expresión) if(expresión)
Proposición proposición1
// Expresiones en secuencia else
a = conta + 5; proposición2
...
contador++;
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 es el espacio de almacenamiento por default.
unsigned char x, y;
unsigned int a, b, c;
pcad = cadena;
53
Datos en FLASH
Constantes: Datos que no cambiarán durante la ejecución normal
de un programa.
Ejemplos de declaraciones:
const char cadena[] PROGMEM = “Cadena con un mensaje constante”;
const unsigned char tabla[] PROGMEM = { 0x24, 0x36, 0x48, 0x5A, 0x6C };
54
Ejemplos:
x = pgm_read_byte(&tabla[i]);
Datos en EEPROM
En la EEPROM:
34 12 01 02 03 04 FF FF FF . . .
57
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
INICIO
= 0x00 = 0x0F
¿Dato?
= 0x01 = 0x0E
= 0x02
Portb ! 0x3F Portb ! 0x06 Portb ! 0x 5B ... Portb ! 0x79 Portb ! 0x71
62
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
63
= “000” otros
¿Op?
= “001” = “100”
= “010” = “011”
R !A + B R !A - B R !A * B R !A & B R !A | B R!0
PortD ! R
64
Motor = "00";
Cerrado
topeC = '1'
sp = '1'
topeA = '1'
sp = '0'
Abierto
Motor = "00";
sp = '1'