MICROCONTROLADORES DE LA SERIE ATMEGA Diagrama de Bloques simplificado
Se tomará como referencia el ATMEGA32 Características Generales -
131 Instrucciones Reloj de hasta 16M 32Kbytes de memoria de programa tipo Flash 2 Kbytes de memoria SRAM 32 registros de 8 bits de propósito general. 64 Registros de propósito especifico 21 fuentes de interrupción cada una con su respectivo vector de interrupciones 4 puertos de E/S
Características Adicionales -
1024 bytes de memoria de datos tipo EEPROM Posibilidad de seleccionar entre diferentes fuentes para la señal de reloj. Módulos Temporizadores y Contadores Generador de PWM Comunicación serial (USART, SPI, I2C). 2 Comparadores análogos 8 Entradas con conversión Análogo digital de 10 bits. Programación on board.
DISTRIBUCIÓN DE MEMORIA Contiene 32 registros de 8 bits de acceso rápido permitiendo ejecutar operaciones en un ciclo de reloj. Ocupan las direcciones de la 00h a la 1Fh. 6 de los 32 registros se unen en pares y pueden emplearse para direccionamiento indirecto de 16 bits, estos son los registros X, Y y Z. La ALU opera directamente con los 32 registros de propósito general
Se tomará como referencia el ATMEGA32 Características Generales -
131 Instrucciones Reloj de hasta 16M 32Kbytes de memoria de programa tipo Flash 2 Kbytes de memoria SRAM 32 registros de 8 bits de propósito general. 64 Registros de propósito especifico 21 fuentes de interrupción cada una con su respectivo vector de interrupciones 4 puertos de E/S
Características Adicionales -
1024 bytes de memoria de datos tipo EEPROM Posibilidad de seleccionar entre diferentes fuentes para la señal de reloj. Módulos Temporizadores y Contadores Generador de PWM Comunicación serial (USART, SPI, I2C). 2 Comparadores análogos 8 Entradas con conversión Análogo digital de 10 bits. Programación on board.
DISTRIBUCIÓN DE MEMORIA Contiene 32 registros de 8 bits de acceso rápido permitiendo ejecutar operaciones en un ciclo de reloj. Ocupan las direcciones de la 00h a la 1Fh. 6 de los 32 registros se unen en pares y pueden emplearse para direccionamiento indirecto de 16 bits, estos son los registros X, Y y Z. La ALU opera directamente con los 32 registros de propósito general
Estos registros son mapeados junto con la memoria de datos SRAM aunque no están implementados físicamente dentro de esta.
Se tiene un espacio de 64 registros de propósito específico que en los AVR se les denomina registros I/O. Estos registros van implementados de 00h a 3Fh, pero se mapean en la memoria de datos de la posición 20h a 5Fh como se muestra en la figura.
La memoria de datos SRAM comienza en la posición 60h (96) y finaliza en la posición 85Fh (2143).
Instrucciones de acceso a la memoria de datos MOV
Ej. MOV R5, R12 Copia el contenido del registro R12 en el registro R5 Ocupa 2 bytes 1 Ciclo de máquina. MOVW
MOVW R9:R8, R15:R14 Copia la palabra (16 bits) contenida en los registros R15:R14 a la posición R8:R7 Los pares de registros deben ser 1:0, 3:2, 5,4 (La parte alta impar y la baja par). Ocupa 2 bytes 1 Ciclo de máquina.
LDI (LOAD INMEDIATE)
Sólo permite acceder a los 16 últimos registros. LDI
R25, $F0
Carga el valor F0h en el registro R25. Ocupa 2 bytes 1 Ciclo de máquina. LDS (LOAD DIRECT FROM SRAM)
Ocupa 4 bytes 2 Ciclos de máquina. LDS R2, 0x212 Carga el contenido de la posición 212h en el registro R2 STS (STORE DIRECT TO SRAM)
Ocupa 4 bytes 2 Ciclos de máquina. STS 0x120, R5 Almacena el valor del registro R5 en la posición 120h
DIRECCIONAMIENTO INDIRECTO LD (LOAD INDIRECT)
X => 27:26 LDI LDI LD
R27,0x01 R26,0x23 R10,X
X = 0123H Almacena el contenido de la posición 123h en el registro R10 X no cambia Con post incremento LDI LDI LD
R27,0x01 R26,0x23 R10,X+
X = 0123H Almacena el contenido de la posición 123h en el registro R10 X = 124H Con predecremento
X = 0123H
LDI LDI
R27,0x01 R26,0x23
LD
R10,-X
X = 0122H Almacena el contenido de la posición 122h en el registro R10 X = 122H
Las mismas operaciones pueden realizarse empleando los registros Y, Z X = 27:26 Y = 29:28 Z = 31:30 LD LD LD
Rd, Y Rd, Y+ Rd, -Y
LD LD LD
Rd, Z Rd, Z+ Rd, -Z
2 BYTES, 1 CICLO 2 BYTES, 1 CICLO 2 BYTES, 2 CICLOS
LDD (Load Indirect with Displacement)
No se implementa con el registro X. LDI
R18,0xB9
STS
0x123, R18
(123h) = B9h
LDI LDI
R29,0x01 R28,0x20
Y= 120h
LDD
R10, Y+3
R= (123h)
ALMACENAMIENTO INDIRECTO
Y=120h
Almacena en la posición apuntada por X el dato almacenado en Rr. Idéntico para los registros Y, Z. Para estos dos últimos se tiene adicionalmente el almacenamiento con desplazamiento.
OPERACIONES ESPECIALES
IN - Load an I/O Location to Register
Carga el valor de un registro de propósito específico I/O (Puerto, timer, etc) en el registro de propósito general de destino. Ocupa 2 bytes 1 Ciclos de máquina.
OUT – Store Register to I/O Location
Carga el valor de un registro de propósito general en un registro de propósito específico I/O.
PUSH – Push Register on Stack
Guarda el contenido del registro Rr en la pila Ocupa 2 bytes 2 Ciclos de máquina.
POP – Pop Register from Stack
Carga el registro Rd con el byte de la cima de la pila. Los AVR emplean la memoria SRAM para la implementación de la PILA (STACK), ésta se decrementa en forma automática. Es necesario establecer el comienzo de la pila; suele utilizarse la última posición de la memoria SRAM. ldi r16, 0x5F out 0x3D,r16 ldi r16, 0x08 out 0x3E,r16
;SPL ;SPH
INSTRUCCIONES ARITMETICAS REGISTRO DE ESTADO
ADD
Ocupa 2 bytes 1 Ciclos de máquina.
LDI LDI ADD
R18,0b00001000 R19,0b00001000 R18,R19
LDI LDI ADD
R18,52 R19,-20 R18,R19
R18= 16
00110100 11101100 1 00100000
ADC (SUMA CON CARRY)
H=1
R18 = 32 H=1, C=1
ADIW (Add Immediate to Word )
Sólo es válido para los pares: 25:24, 27:26, 29:28, 31:30 LDI LDI ADIW
R27, 50 R26, 80 R27:R26, 30
R27:R26 = 50:110
SUBI – Subtract Immediate
SBCI – Subtract Immediate with Carry
SUB
Ocupa 2 bytes 1 Ciclos de máquina. SBC
SBIW – Subtract Immediate from Word
MUL – Multiply Unsigned
Rd y Rr contienen nùmeros sin signo. El carry C=1 si el bit 15 del resultado es 1. Ocupa 2 bytes 2 Ciclos de máquina. LDI LDI
R21,50 R20,80
MUL
R20,R21
R1:R0 = 0F:A0 (4000).
MULS – Multiply Signed
En este caso los registros deben seleccionarse entre los 16 más altos.
MULSU – Multiply Signed with Unsigned
Rd se considera un número signado y Rr no signado.
Para los números fraccionales se emplea el formato 1.7. Los bits 0 a 6 expresan la fracción y el bit 7 la parte entera. Permite representar números entre 0 y 2 para números no signados, y -1 a 1 para signados. El número 1011 0010 Si se interpreta como un entero sin signo sería el 178 Si se interpreta como un entero con signo sería el -122
(178 – 256)
Si se interpreta como una fracción sin signo sería 1 + 1/ 4 + 1/8 + 1/64 = 1.390625 Si se interpreta como una fracción con signo sería -0.609375
(1.390625 -2)
LDI LDI FMUL
r20,0b11101000 r18,0b10110000 r18, r20
1.8125 1.375 R1:R0 = 3F00
R1:R0 = 3F00 00111111 = ¼ +1/8 +1/16 +1/32 +1/64 + 1/128 = 0.49218 Se debe tener en cuenta el Carry
INC – Incremento
DEC – Decremento
NEG – Two’s Complement
C=1
CLR – Clear Register
SER – Set all Bits in Register
OPERACIONES LÓGICAS AND – Logical AND
ANDI – Logical AND with Immediate
OR – Logical OR
ORI – Logical OR with Immediate
EOR – Exclusive OR
COM – One’s Complement
INSTRUCCIONES ENFOCADAS A LA MANIPULACIÓN DE BYTES
CLR – Clear Register
Coloca todos los bits en 0. En el registro de estado S=0, V=0, N=0, Z=1
SER – Set all Bits in Register
Coloca todos los bits en 1. - No altera el registro de estado. - Sólo se emplea con los últimos 16 registros.
LSL – Logical Shift Left
LSR – Logical Shift Right
ROL – Rotate Left trough Carry
ROR – Rotate Right through Carry
ASR – Arithmetic Shift Right
El bit 7 permanece constante, mientras los demás bits se desplazan a la derecha pasando por el carry. No hay instrucción ASL.
SWAP – Swap Nibbles
Intercambia la parte alta (4 bits) y la parte baja del byte entre sí.
TST – Test for Zero or Minus
Actualiza los bits N y Z del registro de estado sin alterar el valor del registro.
INSTRUCCIONES ENFOCADAS A LA MANIPULACIÓN DE BITS
CBR – Clear Bits in Register
Realiza una ADN entre el contenido del registro R y el complemento de la máscara K.
CBR R18, 4 CBR R18, 3
Coloca el bit de la posición 2 (100) en 0 sin alterar los bits restantes. Coloca los bits de la posición 0 y 1 (011) en 0 sin alterar los bits restantes.
SBR – Set Bits in Register
Realiza una OR con la máscara.
SBI – Set Bit in I/O Register
Establece el bit de la posición b del registro A. Esta instrucción sólo se puede emplear con los primeros 32 registros de propósito específico I/O. No se emplea con los registro de propósito general.
BST – Bit Store from Bit in Register to T Flag in SREG
Almacena el bit de la posición b del registro Rd en la bandera T del registro de estado.
BLD – Bit Load from the T Flag in SREG to a Bit in Register
Copia el valor de la bandera T del registro de estado en la posición b del registro Rd.
BSET – Bit Set in SREG
Coloca en 1 el bit de la posición s en el registro de estado SREG. BSET 5
Establece el flag H en 1
BCLR – Bit Clear in SREG
CLC – Clear Carry Flag
CLZ – Clear Zero Flag
SEC – Set Carry Flag
SEZ – Set Zero Flag
Z=1
CLN – Clear Negative Flag
SEN – Set Negative Flag
N=1
CLV – Clear Overflow Flag
SEV – Set Overflow Flag
V=1
CLS – Clear Signed Flag
SES – Set Signed Flag
S=1
CLH – Clear Half Carry Flag
SEH – Set Half Carry Flag
H=1
CLT – Clear T Flag
SET – Set T Flag
T=1
CLI – Clear Global Interrupt Flag
SEI – Set Global Interrupt Flag
I=1
INSTRUCCIONES DE SALTO
RJMP – Relative Jump
Permite hacer saltos con desplazamientos de 2k por encima o por debajo de la dirección actual. RJMP 0x700
Salta a la dirección 700h
Ocupa 2 bytes 2 Ciclos de máquina.
JMP – Jump
Ocupa 4 bytes 3 Ciclos de máquina. Permite direccional hasta 4M de direcciones.
IJMP – Indirect Jump
Salta a la dirección indicada por el registro de 16 bits Z. (64k posiciones). Ocupa 2 bytes 2 Ciclos de máquina.
CP – Compare
Se utiliza junto con instrucciones de salto Los registros no cambian
CPC – Compare with Carry
CPI – Compare with Immediate
BREQ – Branch if Equal
Revisa el flan Z para determinar si los operandos son iguales después de alguna operación como CP o SUB. El salto es de máximo 63 posiciones. Ocupa 2 bytes 1 Ciclo de máquina si la condición es falsa 2 Ciclos de máquina si es verdadera.
BRNE – Branch if Not Equal
BRSH – Branch if Same or Higher (Unsigned)
Ocupa 2 bytes 1 Ciclo de máquina si la condición es falsa 2 Ciclos de máquina si es verdadera.
BRGE – Branch if Greater or Equal (Signed)
Ocupa 2 bytes 1 Ciclo de máquina si la condición es falsa 2 Ciclos de máquina si es verdadera.
BRLO – Branch if Lower (Unsigned)
BRLT – Branch if Less Than (Signed)
BRMI – Branch if Minus
Salta si el resultado es negativo.
BRPL – Branch if Plus
Salta si el resultado es positivo.
CPSE – Compare Skip if Equal
Si Rd=Rr salta la siguiente instrucción
SBRC – Skip if Bit in Register is Cleared
Si el bit b del registro Rr es 0 salta la siguiente instrucción.
SBRS – Skip if Bit in Register is Set
Si el bit b del registro Rr es 1 salta la siguiente instrucción.
SBIC – Skip if Bit in I/O Register is Cleared
SBIS – Skip if Bit in I/O Register is Set
Igual que las instrucciones anteriores pero aplica sobre los primeros 32 registros I/O de propósito específico.
BRBC – Branch if Bit in SREG is Cleared
Si la bandera s del registro de estado es 0 salta a k.
BRBS – Branch if Bit in SREG is Set
Si la bandera s del registro de estado es 1 salta a k. BRCC – Branch if Carry Cleared
Salta si carry es 0 Ocupa 2 bytes 1 Ciclo de máquina si la condición es falsa 2 Ciclos de máquina si es verdadera.
BRCS – Branch if Carry Set
BRHC – Branch if Half Carry Flag is Cleared
BRHS – Branch if Half Carry Flag is Set
BRTC – Branch if the T Flag is Cleared
BRTS – Branch if the T Flag is Set
BRVC – Branch if Overflow Cleared
BRVS – Branch if Overflow Set
BRIE – Branch if Global Interrupt is Enabled
BRID – Branch if Global Interrupt is Disabled
SUBRUTINAS
RCALL – Relative Call to Subroutine
La subrutina debe estar almacenada en una posición cercana al punto de invocación. Ocupa 2 bytes 3 Ciclos de máquina
CALL – Long Call to a Subroutine
Ocupa 4 bytes 4 Ciclos de máquina
ICALL – Indirect Call to Subroutine
Ocupa 2 bytes 3 Ciclos de máquina
RET – Return from Subroutine
Ocupa 2 bytes 4 Ciclos de máquina
RETI – Return from Interrupt
CONJUNTO DE INSTRUCCIONES