Vous êtes sur la page 1sur 58

3.

PROGRAMACIN
Microcontroladores
M. C. Felipe Santiago Espinosa

Marzo de 2016

Conjunto de Instrucciones
El repertorio de instrucciones cuenta con 128

instrucciones para el ATMega8 y 131 para el ATMega16 y


ATMega328 , las cuales estn organizadas en 5 grupos:
Instrucciones Aritmticas y lgicas (28)
Instrucciones de control de flujo (Bifurcaciones) (34 o 36)
Instrucciones de transferencia de datos (35)

Instrucciones para el manejo y evaluacin de bits (28)


Instrucciones especiales (3 o 4)

La mayora de las instrucciones son de 16 bits.

Instrucciones Aritmticas y Lgicas


Sumas y restas

Instruccin
Descripcin
ADD
Rd, Rs Suma sin acarreo

Operacin
Rd = Rd + Rs

Banderas
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

[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

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

Z,C,N,V,S

Suma constante a palabra

Resta constante

[Rd + 1:Rd] = [Rd + 1:Rd] - k

Las que trabajan con palabras se ejecutan en 2 ciclos de reloj, las dems nicamente en
1 ciclo.

Multiplicaciones enteras y fraccionales.


Instruccin
MUL
Rd, Rs
MULS
Rd, Rs

MULSU Rd, Rs
FMUL

Rd, Rs

FMULS

Rd, Rs

FMULSU Rd, Rs

Descripcin
Multiplicacin sin signo
Multiplicacin con signo
Multiplicacin de un nmero con
signo y otro sin signo
Multiplicacin fraccional sin
signo
Multiplicacin fraccional con
signo
Multiplicacin fraccional de un
nmero con signo y otro sin
signo

Todas se ejecutan en 2 ciclos de reloj.

Operacin
R1:R0 = Rd * Rs
R1:R0 = Rd * Rs

Banderas
Z,C
Z,C

R1:R0 = Rd * Rs

Z,C

R1:R0 = ( Rd * Rs ) << 1

Z,C

R1:R0 = ( Rd * Rs ) << 1

Z,C

R1:R0 = ( Rd * Rs ) << 1

Z,C

Instrucciones Lgicas Binarias


Instruccin
AND
Rd, Rs
ANDI
Rd, k
OR
Rd, Rs
ORI
Rd, k
EOR
Rd, Rs

Descripcin
Operacin lgica AND
Operacin lgica AND con una constante
Operacin lgica OR
Operacin lgica OR con una constante
Operacin lgica OR Exclusiva

Operacin
Rd = Rd AND Rs
Rd = Rd AND k
Rd = Rd OR Rs
Rd = Rd OR k
Rd = Rd XOR Rs

Todas se ejecutan en 2 ciclos de reloj.


Instrucciones para enmascarar informacin

Instruccin
SBR
Rd, k
CBR
Rd, k

Descripcin
Pone en alto los bits indicados en la constante
Pone en bajo los bits indicados en la constante

Operacin
Rd = Rd OR k
Rd = Rd AND (0xFF k)

Se ejecutan en 1 ciclo de reloj y modifican a las banderas Z, C, N, V y S.

Instrucciones Aritmticas o Lgicas Unarias


Instruccin

Descripcin

Operacin

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

Evala 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.

Instrucciones de Control de Flujo


Saltos Incondicionales

Instruccin
RJMP
k
IJMP
*JMP
k

Descripcin
Salto relativo
Salto indirecto
Salto absoluto

Operacin
PC = PC + k + 1
PC = Z
PC = k

Nota: Los saltos absolutos:


JMP y CALL no estn
implementados en el
ATMega8

Los saltos relativo e indirecto se ejecutan en 2 ciclos de reloj, el salto absoluto en 3.

Instrucciones para el manejo de Rutinas

Instruccin
RCALL
k
ICALL
*CALL
k
RET
RETI

Descripcin
Llamada relativa a una rutina
Llamada indirecta a una rutina
Llamada absoluta a una rutina
Retorno de una rutina
Retorno de rutina de interrupcin

Operacin
PC = PC + k + 1, PILA PC + 1
PC = Z, PILA PC + 1
PC = k, PILA PC + 1
PC PILA
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.

Instrucciones para la comparacin de datos.

Instruccin
CP
Rd, Rs
CPC
Rd, Rs
CPI
Rd, k

Descripcin
Compara dos registros
Compara registros con acarreo
Compara un registro con una constante

Modifican las banderas Z, C, N, V, H y S.

Operacin
Rd Rs
Rd Rs C
Rd k

Brincos Condicionales.
Instruccin
BRBS
s, k
BRBC
s, k
BRIE
k
BRID
k
BRTS
k
BRTC
k
BRHS
k
BRHC
k
BRGE
k
BRLT
k
BRVS
k
BRVC
k
BRMI
k
BRPL
k
BREQ
k
BRNE
k
BRSH
k
BRLO
k
BRCS
k
BRCC
k

Descripcin
Brinca si el bit s del registro estado est en alto
Brinca si el bit s del registro estado est en bajo
Brinca si las interrupciones estn habilitadas
Brinca si las interrupciones estn deshabilitadas
Brinca si el bit T est en alto
Brinca si el bit T est en bajo
Brinca si la bandera H est en alto
Brinca si la bandera H est en bajo
Brinca si es mayor o igual que (con signo)
Brinca si es menor que (con signo)
Brinca si la bandera V est en alto
Brinca si la bandera V est en bajo
Brinca si es negativo
Brinca si no es negativo
Brinca si los datos son iguales
Brinca si los datos no son iguales
Brinca si es mayor o igual
Brinca si es menor
Brinca si la bandera C est en alto
Brinca si la bandera C est en bajo

Pueden tardar 1 o 2 ciclos de reloj.

Operacin
si(SREG(s) == 1) PC = PC + k + 1
si (SREG(s) == 0) PC = PC + k + 1
si (I == 1) PC = PC + k + 1
si (I == 0) PC = PC + k + 1
si (T == 1) PC = PC + k + 1
si (T == 0) PC = PC + k + 1
si (H == 1) PC = PC + k + 1
si (H == 0) PC = PC + k + 1
si (S == 0) PC = PC + k + 1
si (S == 1) PC = PC + k + 1
si (V == 1) PC = PC + k + 1
si (V == 0) PC = PC + k + 1
si (N == 1) PC = PC + k + 1
si (N == 0) PC = PC + k + 1
si (Z == 1) PC = PC + k + 1
si (Z == 0) PC = PC + k + 1
si (C == 0) PC = PC + k + 1
si (C == 1) PC = PC + k + 1
si (C == 1) PC = PC + k + 1
si (C == 0) PC = PC + k + 1

10

Saltitos Condicionales.
Instruccin
Descripcin
CPSE
Rd, Rs Un saltito si los registros son iguales
Un saltito si el bit b del registro Rs est en
SBRS
Rs, b
alto
Un saltito si el bit b del registro Rs est en
SBRC
Rs, b
bajo
Un saltito si el bit b del registro P est en
SBIS
P, b
alto, P es un registro I/O
Un saltito si el bit b del registro P est en
SBIC
P, b
bajo, P es un registro I/O
Pueden tardar 1, 2 o 3 ciclos de reloj.

Operacin
si(Rd == Rs) PC = PC + 2 o 3
si(Rs(b) == 1) PC = PC + 2 o 3
si(Rs(b) == 0) PC = PC + 2 o 3
si(I/O(P, b) == 1)
PC = PC + 2 o 3
si(I/O(P, b) == 0)
PC = PC + 2 o 3

11

Instrucciones de Transferencia
de Datos
Flash
Registro de Instruccin (IR)
Archivo de Registros

SRAM

Transferencias entre registros

Transferencia de una constante


a registro

Transferencias entre memoria de


datos y registros

Transferencias entre memoria de


cdigo y registros

Transferencias entre registros I/O


y de propsito general

Memoria
de Programa

32 x 8
Registros
de propsito
general

1024 x 8
Espacio de
Propsito
General

Registros I/O

64 x 8
5

Registros
para el
manejo de
Recursos

12

Trasferencia entre registros.

Instruccin
MOV
Rd, Rs

Descripcin
Copia un registro

MOVW

Copia un par de registros

Rd, Rs

Operacin
Rd = Rs
Rd + 1: Rd = Rs + 1: Rs, Rd y Rs
registros pares

Trasferencia de una constante a un registro.

Instruccin
LDI
Rd, k

Descripcin
Copia la constante en el registro

Operacin
Rd = k

13

Transferencias entre memoria de datos y registros (cargas)

Instruccin
LDS
Rd, k
LD
Rd, X
LD
Rd, X+
LD
Rd, -X
LD
Rd, Y
LD
Rd, Y+
LD
Rd, -Y
LDD
Rd, Y + q
LD
Rd, Z
LD
Rd, Z+
LD
Rd, -Z
LDD
Rd, Z + q

Descripcin
Carga directa de memoria
Carga indirecta de memoria
Carga indirecta con post-incremento
Carga indirecta con pre-decremento
Carga indirecta de memoria
Carga indirecta con post-incremento
Carga indirecta con pre-decremento
Carga indirecta con desplazamiento
Carga indirecta de memoria
Carga indirecta con post-incremento
Carga indirecta con pre-decremento
Carga indirecta con desplazamiento

Operacin
Rd = Mem[k]
Rd = Mem[X]
Rd = Mem[X], X = X + 1
X = X - 1, Rd = Mem[X]
Rd = Mem[Y]
Rd = Mem[Y], Y = Y + 1
Y = Y - 1, Rd = Mem[Y]
Rd = Mem[Y + q]
Rd = Mem[Z]
Rd = Mem[Z], Z = Z + 1
Z = Z - 1, Rd = Mem[Z]
Rd = Mem[Z + q]

14

Transferencias entre registros y memoria de datos

(Almacenamientos)
Instruccin
STS
k, Rs
ST
X, Rs
ST
X+, Rs
ST
-X, Rs
ST
Y, Rs
ST
Y+, Rs
ST
-Y, Rs
STD
Y + q, Rs
ST
Z, Rs
ST
Z+, Rs
ST
-Z, Rs
STD
Z + q, Rs

Descripcin
Almacenamiento directo en memoria
Almacenamiento indirecto en memoria
Almacenamiento indirecto con post-incremento
Almacenamiento indirecto con pre-decremento
Almacenamiento indirecto en memoria
Almacenamiento indirecto con post-incremento
Almacenamiento indirecto con pre-decremento
Almacenamiento indirecto con desplazamiento
Almacenamiento indirecto en memoria
Almacenamiento indirecto con post-incremento
Almacenamiento indirecto con pre-decremento
Almacenamiento indirecto con desplazamiento

Operacin
Mem[k] = Rs
Mem[X] = Rs
Mem[X] = Rs, X = X + 1
X = X - 1, Mem[X] = Rs
Mem[Y] = Rs
Mem[Y] = Rs, Y = Y + 1
Y = Y - 1, Mem[Y] = Rs
Mem[Y + q] = Rs
Mem[Z] = Rs
Mem[Z] = Rs, Z = Z + 1
Z = Z - 1, Mem[Z] = Rs
Mem[Z + q] = Rs

15

Transferencias entre memoria de datos y registros (Acceso a la Pila)

Instruccin
Descripcin
PUSH
Rs
Inserta a Rs en la pila
POP
Rd
Extrae de la pila y coloca en Rd

Operacin
Mem[SP] = Rs, SP = SP 1
SP = SP + 1, Rd = Mem[SP]

Transferencias entre memoria de cdigo y registros

Instruccin
Descripcin
LPM
Carga indirecta de memoria de programa en R0
LPM
Rd, Z Carga indirecta de memoria de programa en Rd
LPM
Rd, Z+ Carga indirecta con post-incremento
Almacenamiento indirecto en memoria de
SPM
programa

Operacin
R0 = Flash[Z]
Rd = Flash[Z]
Rd = Flash[Z], Z = Z + 1
Flash[Z] = R1:R0

Transferencias entre Registros I/O y registros de propsito general

Instruccin
IN
Rd, P
OUT
P, Rs

Descripcin
Lee de un registro I/O, deja el resultado en Rd
Escribe en un registro I/O, el valor de Rs

Operacin
Rd = P
P = Rs

16

Instrucciones para el manejo y evaluacin de bits


Desplazamientos y rotaciones

Instruccin
LSL
Rd
LSR
Rd
ROL
Rd
ROR
Rd
ASR
Rd

Descripcin
Desplazamiento lgico a la izquierda
Desplazamiento lgico a la derecha
Rotacin a la izquierda
Rotacin a la derecha
Desplazamiento aritmtico a la derecha

Operacin
C = Rd(7), Rd(n+1) = Rd(n), Rd(0) = 0
C = Rd(0), Rd(n) = Rd(n + 1), Rd(7) = 0
C = Rd(7), Rd(n + 1) = Rd(n), Rd(0) = C
C = Rd(0), Rd(n) = Rd(n + 1), Rd(7) = C
Rd(n) = Rd(n + 1), n = 0 .. 6

17

Instruccin para el intercambio de nibbles.

Instruccin
SWAP
Rd

Descripcin
Intercambia nibbles en Rd

Operacin
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.

Instruccin
SBI
P, b
CBI
P, b

Descripcin
Pone en alto al bit b del Registro P
Pone en bajo al bit b del Registro P

Operacin
P(b) = 1
P(b) = 0

Registros I/O que estn en el rango de 0x00 a 0x1F. Se ejecutan en 2 ciclos de


reloj y tampoco modifican banderas.
Instrucciones para transferencia de bits.

Instruccin
BTS
Rs, b
BTL
Rd, b

Descripcin
Almacena al bit b de un registro en T
Carga en el bit b de un registro desde T

Se ejecutan en 1 ciclo de reloj.

Operacin
T = Rs(b)
Rd(b) = T

18

Instruccin para manipular los bits del registro Estado


Instruccin

Descripcin

Operacin

BSET

Pone en alto al bit s del registro Estado

SREG(s) = 1

BCLR
SEI
CLI
SET
CLT
SEH
CLH
SES
CLS
SEV
CLV
SEN
CLN
SEZ
CLZ
SEC
CLC

Pone en bajo al bit s del registro Estado


Pone en alto al habilitador de interrupciones
Pone en bajo al habilitador de interrupciones
Pone en alto al bit de transferencias
Pone en bajo al bit de transferencias
Pone en alto a la bandera de acarreo del nibble bajo
Pone en bajo a la bandera de acarreo del nibble bajo
Pone en alto a la bandera de signo
Pone en bajo a la bandera de signo
Pone en alto a la bandera de sobreflujo
Pone en bajo a la bandera de sobreflujo
Pone en alto a la bandera de negativo
Pone en bajo a la bandera de negativo
Pone en alto a la bandera de cero
Pone en bajo a la bandera de cero
Pone en alto a la bandera de acarreo
Pone en bajo a la bandera de acarreo

SREG(s) = 0
I=1
I=0
T=1
T=0
H=1
H=0
S=1
S=0
V=1
V=0
N=1
N=0
Z=1
Z=0
C=1
C=0

19

Instrucciones Especiales
Instruccin
Descripcin
NOP
No operacin, empleada para forzar una espera de 1 ciclo de reloj
SLEEP
Introduce al MCU al modo de bajo consumo previamente seleccionado
Reinicia al Watchdog Timer, para evitar reinicios por su
WDR
desbordamiento
Utilizada para depuracin, desde la interfaz JTAG en un ATMega16 o
BREAK
DebugWire en un ATMega328

20

Modos de direccionamiento
Los Modos de Direccionamiento indican la ubicacin de los
datos sobre los que operan las instrucciones. Los
Microcontroladores AVR manejan los siguientes modos de
direccionamiento:
1.
2.
3.
4.
5.
6.
7.

Directo por registro


Directo a registros I/O
Directo a memoria de datos
Indirecto a memoria de datos
Indirecto a memoria de cdigo
Inmediato
Direccionamientos en bifurcaciones

21

Direccionamiento directo por registro


Un registro:
11 bits

5 bits

OPCODE

Rd
REGISTROS
R0
5

2=32
R1
...
R30
R31

Ejemplos:

COM
INC
SER

R3
R5
R7

22

Direccionamiento directo por registro

Dos registros:

6 bits

5 bits

5 bits

OPCODE

Rr

Rd

Ejemplos:
ADD
SUB
AND
MOV

R1,
R1,
R1,
R1,

R2
R2
R2
R2

23

Direccionamiento directo a I/O


5 bits

5 bits

6 bits

OPCODE

REGISTROS I/O
REGISTROS
5

R0

2=32

2=64

SREG

R1

SPH

...

...

R30
R31

Ejemplos:
OUT
IN

PORTB, R13
R15, PINA

24

Direccionamiento directo a Memoria de Datos


REGISTROS
R0
5 bits

11 bits

R1
...

OPCODE

R30

DIRECCIN DE DATOS

R31

SRAM
0
16

2 = 64k

....

...
0x45F (limitado por el dispositivo)

Ejemplos:
STS 0x0100, R5
LDS R16, 0x0110

25

Direccionamiento indirecto a Memoria de Datos


11 bits

5 bits

OPCODE

Rd

2=32

REGISTROS

SRAM

R0
R1

Ejemplos:
LD R5, Y
ST X, R11

....

R26

...

R27
R28

X, Y o Z quedan
especificados como
parte del opcode

R29
R30

R31

0x045F

26

Direccionamiento indirecto a Memoria de Datos


Con desplazamiento
YoZ

SRAM

5 bits

5 bits

6 bits

OPCODE

R0
R1
...

Ejemplos:
R30
R31

LDD
STD

R5, Y+0x020
Z+0x10, R11

Y o Z quedan especificados
como parte del opcode

27

Direccionamiento indirecto a Memoria de Datos


Con pre-decremento
X, Y o Z

SRAM

-1

REGISTROS
R0
5 bits

11 bits

OPCODE

R1
...
R30

Ejemplos:

LD R5, -Y
ST Z, R11

R31

28

Direccionamiento indirecto a Memoria de Datos

Con post-incremento
X, Y o Z

SRAM

REGISTROS
R0
5 bits

11 bits

OPCODE

R1
...
R30

Ejemplos:
LD R5, Y+
ST X+, R6

R31

29

Direccionamiento indirecto a Memoria de Cdigo

Z
FLASH

REGISTROS
R0
11 bits
OPCODE

5 bits
n

R1
...
R30

Ejemplos:
LPM
LPM
SPM

(R0 y Z implcitos)
R3, Z
(R1:R0 y Z implcitos)

R31

Nota: Tambin existe una carga indirecta de memoria de cdigo con


post-incremento del apuntador Z.

30

Direccionamiento inmediato
4 bits

4 bits

OPCODE

8 bits

REGISTROS
4

R16

2 =16

R17
...
R30
R31

Ejemplos:

ANDI
SUBI
ORI

R17, 0xF3
R19, 0x12
R31, 0x03

31

Direccionamientos en Bifurcaciones
Las bifurcaciones o saltos (pueden ser condicionales o incondicionales)
permiten cambiar el flujo secuencial, durante la ejecucin de un
programa. Esto se consigue modificando el valor del registro contador
del programa (Program Counter).
Cuando no hay una bifurcacin, el PC automticamente debe
incrementarse en 1.

Indirectas
Z

PC

Ejemplos:
IJMP
ICALL
Nota: El apuntador Z queda implcito en la instruccin.

32

Direccionamientos en Bifurcaciones

Relativas
PC
+

1
OPCODE

Ejemplos:
RJMP
RCALL

-20
32

BREQ
BRNE
BRGE

15
-10
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 slo brincan la siguiente instruccin, tambin
son relativas al PC.

33

Direccionamientos en Bifurcaciones
Absolutas
6 bits

10 bits

K ( 21 : 16 )

OPCODE

PC
K ( 15 : 0 )

Ejemplos:
JMP
CALL

Nota:

0x300000
0x1FFFFF

Estos saltos absolutos no estn en el ATMega8, pero si en el


ATMega16. Para el ATMega8, las bifurcaciones relativas son
suficientes para cubrir todo el espacio de memoria de cdigo.

34

Lenguaje ensamblador
Un programa en Ensamblador puede incluir:
Instrucciones: Elementos del lenguaje que se traducen a

cdigo mquina. Cada instruccin 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

organizacin de un programa, indicando diferentes


aspectos, como la ubicacin del cdigo, definiciones, etc.
Las directicas no generan cdigo mquina, son elementos
propios de la herramienta que se emplee para ensamblar
un programa.

35

Directivas comunes:
INCLUDE: Se utiliza para leer el cdigo fuente de otro archivo

En un ATMega8 se debe agregar:


.include
<m8def.inc>
En un ATMega16 debe agregarse:
.include
<m16def.inc>

36

Directivas para definir diferentes tipos de segmentos en un


programa:
CSEG: Segmento de Cdigo (por omisin). 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.

37

var1:

const:

.DSEG
.BYTE 1

; Inicia un segmento de datos


; Variable de 1 byte en SRAM

.CSEG
ldi
R16, 0x25
mov
r0,r16
...

; Inicia un segmento de cdigo


; Instrucciones para alguna tarea

.DB 0x02

; Constante con 0x02 en flash

.ESEG
eevar1:.DB
0x3f

; Inicia un segmento de EEPROM


; Constante con 0x3f en EEPROM

38

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

39

EQU: Define una constante simblica, que puede usarse dentro

de las instrucciones.
Ejemplo:

.EQU io_offset = 0x23


.EQU portA = io_offset + 2
.CSEG
clr
out

; Inicia el segmento de cdigo


r2
portA, r2

; Limpia el registro 2
; Escribe a portA

40

ORG: Organizar a cualquiera de los segmentos de memoria,

indica en qu direccin se ubicar la informacin subsecuente,


pudiendo ser variables en SRAM, constantes en EEPROM o en
FLASH, o cdigo en FLASH.

var1:

.DSEG
.ORG 0x120
.Byte 1

.CSEG
.ORG 0x000
RJMP inicio
.ORG 0x010
inicio:
MOV R1, R2
....

; Variable en la direccin 0x120 del


; segmento de datos
; Cdigo ubicado en la direccin 0x00

; Cdigo ubicado en la direccin 0x10

41

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

42

BYTE: Reserva uno o ms 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.

var1:
var2:

.DSEG
.BYTE 1
.BYTE 10

; variable de 1 byte
; variable de 10 bytes

.CSEG
STS
var1, R17

; acceso a var1 por dir. Directo

LDI
LDI
LD

R30, LOW (var2)


R31, HIGH (var2)
R1, Z

; Z apunta a Var2
; acceso indirecto a var2

43

Consideraciones para Alto Nivel


Tipos de Datos
Tipo

Tamao (bits)

Rango

char

-128 a 127

unsigned char

0 a 255

signed char

-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

44

Definiciones en WINAVR

typedef
typedef
typedef
typedef
typedef
typedef

signed char
unsigned char
signed int
unsigned int
signed long int
unsigned long int

int8_t
uint8_t
int16_t
uint16_t
int32_t
uint32_t

45

Operadores sobre bits

Operadores Lgicos

Complemento Uno

AND

&&

Desplazamiento a la
Izquierda

<<

OR

||

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.

Tratan a los operandos como


expresiones FALSAS o
VERDADERAS.

46

Tipos de Memoria
Datos en SRAM
Variables: Datos que van a ser ledos 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 propsito


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;

47

Datos en FLASH
Constantes: Datos que no cambiarn durante la ejecucin normal
de un programa.
Si las constantes se manejan en memoria FLASH, se liberarn
espacios significativos de SRAM. til para cadenas de texto o
tablas de bsqueda.
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 };

48

Declaracin 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 direccin 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.

49

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];
PGM_P p;
p = cadena;
strcpy_P(buf, p);

// Buffer destino, en SRAM


// Apuntador a memoria FLASH
// p apunta a la cadena en FLASH
// copia de FLASH a SRAM

50

Datos en EEPROM
Variables en las que se requiera conservar su contenido an en
ausencia de energa. Debern almacenarse en la EEPROM.
Deber utilizarse el atributo EEMEM, definido en la biblioteca
eeprom.h, tambin en WinAVR.
Son declaraciones globales y se deben hacer antes de cualquier
declaracin 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 . . .

51

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
direccin que recibe como argumento.

eeprom_write_byte: Escribe un byte en la EEPROM, como


argumentos recibe la direccin y el dato.
Tambin se incluyen funciones para datos de 16 y 32 bits, as
como para el manejo de bloques de memoria.

52

PROGRAMAS DE
EJEMPLO
En Ensamblador y en Lenguaje C

53

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).

54

Parpadeo de un LED

55

Decodificador de binario a 7 Segmentos


Desarrolle un programa que lea los 4 bits menos

significativos del Puerto D [PD3:PD0] y genere su


cdigo en 7 segmentos en el Puerto B.
ATMEGA8

a
2
3
4
5

PD0
PD1
PD2
PD3

PB0
PB1
PB2
PB3
PB4
PB5
PB6

14
15
16
17
18
19
9

a
b f
c
d
e
f e
g

c
d

Num
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F

g
0
0
1
1
1
1
1
0
1
1
1
1
0
1
1
1

f
1
0
0
0
1
1
1
0
1
1
1
1
1
0
1
1

e
1
0
1
0
0
0
1
0
1
0
1
1
1
1
1
1

d
1
0
1
1
0
1
1
0
1
0
0
1
1
1
1
0

c
1
1
0
1
1
1
1
1
1
1
1
1
0
1
0
0

b
1
1
1
1
1
0
0
1
1
1
1
0
0
1
0
0

a HEX
1 0x3F
0 0x06
1 0x5B
1 0x4F
0 0x66
1 0x6D
1 0x7D
1 0x07
1 0x7F
1 0x67
1 0x77
0 0x7C
1 0x39
0 0x5E
1 0x79
1 0x71

56

Decodificador de binario a 7 Segmentos


INICIO

PortD como Entrada


PortB como Salida

Dato ! PinD & 0x0F

= 0x00

= 0x0F

Dato?
= 0x01

= 0x0E
= 0x02

Portb ! 0x3F

Portb ! 0x06

Portb ! 0x 5B

...

Portb ! 0x79

Portb ! 0x71

57

Diseo de una ALU de 4 bits


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 operacin.

18
PB4
19
PB5
9
PB6
10
PB7

PD3

PD1
PD2

PD4
PD5

23 PC0
24 PC1
25
PC2

PD6
PD7

2
3
4
5
6
11
12
13

Resultado

Operando A

PD0

Operacin

14
PB0
15
PB1
16
PB2
17
PB3

Operando B

ATMEGA8

PortC[2:0]
000
001
010
011
100
101 a 111

Operacin
R=A+B
R=A-B
R=A*B
R = A AND B
R = A OR B
R=0

58

Diseo de una ALU de 4 bits


INICIO

PortB y PortC como Entradas


PortD como Salida

A ! PinB & 0x0F


B ! ( PinB & 0xF0) >> 4
Op ! PinC & 0x07

= 000

otros

Op?

= 001

= 100
= 010

R !A + B

R !A - B

= 011

R !A * B

R !A & B

PortD ! R

R !A | B

R!0

Vous aimerez peut-être aussi