Upload
handreshenao
View
87
Download
1
Embed Size (px)
Citation preview
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
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 R27,0x01 LDI R26,0x23 LD R10,X X = 0123H Almacena el contenido de la posición 123h en el registro R10 X no cambia Con post incremento LDI R27,0x01 LDI R26,0x23 LD R10,X+ X = 0123H Almacena el contenido de la posición 123h en el registro R10 X = 124H Con predecremento LDI R27,0x01 LDI R26,0x23 X = 0123H 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 Rd, Y 2 BYTES, 1 CICLO LD Rd, Y+ 2 BYTES, 1 CICLO LD Rd, -Y 2 BYTES, 2 CICLOS LD Rd, Z LD Rd, Z+ LD Rd, -Z
LDD (Load Indirect with Displacement)
No se implementa con el registro X. LDI R18,0xB9 STS 0x123, R18 (123h) = B9h LDI R29,0x01 LDI R28,0x20 Y= 120h LDD R10, Y+3 R= (123h) Y=120h ALMACENAMIENTO INDIRECTO
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 ;SPL ldi r16, 0x08 out 0x3E,r16 ;SPH
INSTRUCCIONES ARITMETICAS
REGISTRO DE ESTADO
ADD
Ocupa 2 bytes 1 Ciclos de máquina.
LDI R18,0b00001000 LDI R19,0b00001000 ADD R18,R19 R18= 16 H=1 LDI R18,52 00110100 LDI R19,-20 11101100 ADD R18,R19 1 00100000 R18 = 32 H=1, C=1
ADC (SUMA CON CARRY)
ADIW (Add Immediate to Word)
Sólo es válido para los pares: 25:24, 27:26, 29:28, 31:30 LDI R27, 50 LDI R26, 80
ADIW 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 R21,50 LDI 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 r20,0b11101000 1.8125 LDI r18,0b10110000 1.375 FMUL r18, r20 R1:R0 = 3F00 C=1 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
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 Coloca el bit de la posición 2 (100) en 0 sin alterar los bits restantes. CBR R18, 3 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 SEC – Set Carry Flag
CLZ – Clear Zero 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