Documentos de Académico
Documentos de Profesional
Documentos de Cultura
3 Programacion MCUs PDF
3 Programacion MCUs PDF
3 Programacion MCUs PDF
PROGRAMACIÓN
Microcontroladores
Marzo de 2019
2
Proceso de Programación
3
¿Ensamblador o Lenguaje C?
• El ensamblador tiene una relación directa con el código máquina
generado. En alto nivel siempre se producirá código adicional.
• Antes de optar por uno u otro lenguaje es conveniente estructurar
la solución.
• Un programa mal organizado es ineficiente, aún si se codifica en
lenguaje ensamblador.
• En alto nivel se tienen estructuras de control de flujo que facilitan
la codificación de soluciones estructuradas.
• El código fuente en alto nivel es más compacto y menos confuso,
reduciendo la posibilidad de cometer errores.
• Con la velocidad de ejecución y la cantidad de memoria de los
MCU’s actuales, el código adicional no afecta la solución.
4
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.
8
• “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.
15
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
16
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
24
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
5
2=32
R1
...
R30
R31
Ejemplos:
COM R3
INC R5
SER R7
26
OPCODE Rr Rd
Ejemplos:
ADD R1, R2
SUB R1, R2
AND R1, R2
MOV R1, R2
27
OPCODE R P
REGISTROS I/O
REGISTROS
5
2=32 6
2=64 SREG
R0
R1 SPH
... ...
R30
R31
Ejemplos:
OUT PORTB, R13
IN R15, PIND
28
OPCODE n ...
SRAM R31
0
16
2 = 64k
1
.... ...
Ejemplos:
STS 0x0100, R5
LDS R16, 0x0110
29
11 bits 5 bits
OPCODE Rd
5
2=32
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
30
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
31
X, Y o Z
SRAM
+
-1
REGISTROS
R0
11 bits 5 bits
R1
OPCODE n ...
R30
Ejemplos:
LD R5, -Y R31
ST –Z, R11
32
X, Y o Z
+
SRAM
REGISTROS
R0
11 bits 5 bits
R1
OPCODE n ...
R30
Ejemplos:
LD R5, Y+ R31
ST X+, R6
33
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.
34
Direccionamiento inmediato
OPCODE R K
REGISTROS
4
2 =16
R16
R17
...
R30
Ejemplos:
R31
ANDI R17, 0xF3
SUBI R19, 0x12
ORI R31, 0x03
35
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
38
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
43
• 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
. . . .
45
.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
• Ejemplo:
IN A, PINB ; Lee A
IN B, PINC ; Lee B
ADD A, B ;A=A+B
OUT PORTB, A ; Escribe A
48
PROGRAMACIÓN EN
ALTO NIVEL
Lenguaje C
49
Tipos de Datos
Definiciones en WINAVR
Operadores
Operador ternario
Aritméticos
Operador Descripción Ejemplo Propocisión1? Proposición2 : Proposición3;
* Producto a*b
/ División a/b
V F
% Módulo a%b Proposición 1
+ Suma a+b
Proposición 2 Proposición 3
- Resta a-b
52
Trabajan sobre operandos de los tipos: Una variable con cualquier valor
char, int o long. Afectan el resultado al distinto de cero se considera
nivel de bits. verdadera.
53
Estructuras de control
Dentro de la programación
estructurada se tienen tres tipos
Secuenciales
de Estructuras de Control.
Proposición 1
1. Secuenciales.
2. Selectivas. Proposición 2
3. Repetitivas.
Proposición 3
// Expresiones en secuencia
a = b + c;
. . .
contador++;
56
Estructuras Selectivas
Selección Simple Selección Doble
F V F
Expresión Proposición 1
V
Proposición 2 Proposición 3
Proposición
if(expresión) if(expresión)
Proposición proposición1
else
proposición2
57
= Constante_1 = Default
Expresión
= Constante_2 = Constante_n
= Constante_3
Proposición 1 Proposición 2 Proposición 3 ... Proposición n Prop. Default
switch (expresión){
case Constante_1:
Proposición 1
case Constante_2:
Proposición 2
. . . .
default:
Proposición default
}
58
Estructuras Repetitivas
Repetición por Condición:
Proposición
F
Expresión
V V
Expresión
Proposición
F
do {
while(expresión) proposición
proposición } while(expresión);
59
Expresión1
F
Expresión2
Expresión3 V
Proposición
proposición
60
Tipos de Memoria
SRAM para variables
Variables: Datos que van a ser leídos o escritos continuamente. La
SRAM es el espacio de almacenamiento por default.
int x, y;
uint8_t a, b, c;
pcad = cadena;
61
Ejemplos de declaraciones:
const char cadena[] PROGMEM = “Cadena con un mensaje constante”;
const uint_8t tabla[] PROGMEM = { 0x24, 0x36, 0x48, 0x5A, 0x6C };
62
Ejemplos:
x = pgm_read_byte(&tabla[i]);
Datos en EEPROM
En la EEPROM:
34 12 01 02 03 04 FF FF FF . . .
65
PROGRAMAS DE
EJEMPLO
En Ensamblador y en Lenguaje C
67
Parpadeo de un LED
• Realice un programa que haga parpadear
INICIO
un LED conectado en la terminal PB0 a
una frecuencia aproximada de 1 Hz
(periodo de 1 seg.), considerando un ciclo PUERTO B
como Salida
útil del 50 % (½ seg. encendido y ½ seg.
apagado).
PB0 1
PB0 0
INICIO
= 0x00 = 0x0F
¿Dato?
= 0x01 = 0x0E
= 0x02
Portb 0x3F Portb 0x06 Portb 0x 5B ... Portb 0x79 Portb 0x71
70
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
71
= “000” otros
¿Op?
= “001” = “100”
= “010” = “011”
R A + B R A - B R A * B R A & B R A | B R0
PortD R
72
Motor = "00";
Cerrado
topeC = '1'
sp = '1'
topeA = '1'
sp = '0'
Abierto
Motor = "00";
sp = '1'