17
1 MICROCONTROLADORES ATmega8515 Dr. Evelio J. González Microcontroladores El programa en código binario puede ocupar hasta 8 Kb Más que suficiente para la gran mayoría de las aplicaciones ATmega8515 Compatible con versión anterior: AT90S8515 (salvo ciertos aspectos, que pueden ser ignorados en momento de programación). Binario Obviamente no se codifica el programa en binario Ensamblador Lenguaje que emplea la arquitectura interna del dispositivo Binario Se puede programar en C, pero en esta asignatura se considera más pedagógico el ensamblador: ruptura mental, mayor dominio de la arquitectura del dispositivo, etc… Microcontroladores Por lo tanto, es necesario estudiar la arquitectura del microcontrolador En este documento solamente se darán unas nociones del ensamblador. Inabordable hablar de 130 instrucciones diferentes Complementado con la documentación del repertorio de instrucciones

Ensamblador ATMega8515

  • Upload
    mccd92

  • View
    364

  • Download
    15

Embed Size (px)

Citation preview

Page 1: Ensamblador ATMega8515

1

MICROCONTROLADORES

ATmega8515

Dr. Evelio J. González

Microcontroladores

El programa en código binario puede ocupar hasta 8 Kb

Más que suficiente para la gran mayoría de las aplicaciones

ATmega8515

Compatible con versión anterior: AT90S8515 (salvo ciertos aspectos,que pueden ser ignorados en momento de programación).

Binario

Obviamente no se codifica el programa en binario

Ensamblador

Lenguaje que emplea la arquitectura interna del dispositivo

Binario

Se puede programar en C, pero en esta asignatura se considera más pedagógico el ensamblador: ruptura mental, mayor dominio de la arquitectura del dispositivo, etc…

Microcontroladores

� Por lo tanto, es necesario estudiar la arquitectura del microcontrolador

� En este documento solamente se darán unas nociones del ensamblador.

� Inabordable hablar de 130 instrucciones diferentes

� Complementado con la documentación del repertorio de instrucciones

Page 2: Ensamblador ATMega8515

2

Microcontroladores

� Todas las funcionalidades del microcontrolador se acceden mediante registros

� Los registros son posiciones especiales de almacenamiento, con 8 bits de capacidad. Un registro tiene la siguiente apariencia:

Registros

� Un registro puede almacenar � valores numéricos de 0 a 255

(positivos sin signo) � o entre -128 a 127 (con bit de signo

en el bit 7), � caracteres ASCII � o simples conjuntos de bits sin

relaciones entre ellos.

Registros

� Existen 32 registros de propósito general� Operaciones aritméticas, mover datos

entre/hacia memoria, preparar datos para enviarlos a otros registros especiales …

� R0, R1, R2,…, R31� Accedidos mediante su dirección de memoria

� Por ejemplo:

� El registro R1 está en la dirección $01

Registros

� Complicado, engorroso� No solamente limitado a estos

registros, sino a todos� Para poder usarse mnemónicos, se

importa un fichero de definiciones....includeincludeincludeinclude "8515def.inc" "8515def.inc" "8515def.inc" "8515def.inc" ....includeincludeincludeinclude “m8515def.inc”“m8515def.inc”“m8515def.inc”“m8515def.inc”Fichero de definiciones

; Definiciones de etiquetas.equ.equ.equ.equ PORTAPORTAPORTAPORTA =$1b=$1b=$1b=$1b.equ.equ.equ.equ DDRADDRADDRADDRA =$1a=$1a=$1a=$1a.equ.equ.equ.equ PINAPINAPINAPINA =$19=$19=$19=$19.equ.equ.equ.equ PORTBPORTBPORTBPORTB =$18=$18=$18=$18...

; esto es un comentario;en vez de usar $1b puedo poner PORTA

; etiquetas como agente facilitador de cambios y de legibilidad del código

Page 3: Ensamblador ATMega8515

3

Fichero de definicionesldi r16, 1ldi r16, 1ldi r16, 1ldi r16, 1 ; poner un 1 en r16

También puede accederse mediante la definición de directivas (no generan código ejecutable, no código máquina)

Favorece la legibilidad del código.def regTemporal = r16.def regTemporal = r16.def regTemporal = r16.def regTemporal = r16ldi regTemporal, 1ldi regTemporal, 1ldi regTemporal, 1ldi regTemporal, 1Registros

� Otra instrucción interesante es la de copiar datos desde un registro a otro: la instrucción mov. El siguiente código copia el contenido del r16 al registro r20.mov r20,r16mov r20,r16mov r20,r16mov r20,r16

� Obsérvese que el primer registro es siempre el registro destino de la operación.operación destino, fuente

Registros

� Existen diferentes tipos de registros. Así una instrucción del tipoldi r15, 15ldi r15, 15ldi r15, 15ldi r15, 15

� no sería válida, ya que los únicos registros que permiten cargar un valor de forma inmediato son los registros del r16 al r31. Es decir, no se puede realizar este tipo de operación con los registros del r0 al r15.

� Excepción: limpiar los bits (poner todos los bits a 0)� clr r15clr r15clr r15clr r15

Registros

� Aparte del comando ldi, las siguientes instrucciones no pueden emplearse con los registros r0 a r15:andi r15,4 ;Realiza el y lógico entre el registro y un númeroandi r15,4 ;Realiza el y lógico entre el registro y un númeroandi r15,4 ;Realiza el y lógico entre el registro y un númeroandi r15,4 ;Realiza el y lógico entre el registro y un númerocbr r14,45 ;Limpia los bits en el registro determinados por cbr r14,45 ;Limpia los bits en el registro determinados por cbr r14,45 ;Limpia los bits en el registro determinados por cbr r14,45 ;Limpia los bits en el registro determinados por ;una máscara de bits;una máscara de bits;una máscara de bits;una máscara de bitscpi r13,6 ;Compara el contenido del registro con una cpi r13,6 ;Compara el contenido del registro con una cpi r13,6 ;Compara el contenido del registro con una cpi r13,6 ;Compara el contenido del registro con una ;constante;constante;constante;constantesbci r9,7 ;Resta al registro el valor del contenido de la sbci r9,7 ;Resta al registro el valor del contenido de la sbci r9,7 ;Resta al registro el valor del contenido de la sbci r9,7 ;Resta al registro el valor del contenido de la ;constante y del resultado actual del bit de carry;constante y del resultado actual del bit de carry;constante y del resultado actual del bit de carry;constante y del resultado actual del bit de carrysbr r12,89 ; Coloca a '1' los bits en el registro determinados sbr r12,89 ; Coloca a '1' los bits en el registro determinados sbr r12,89 ; Coloca a '1' los bits en el registro determinados sbr r12,89 ; Coloca a '1' los bits en el registro determinados ;por una máscara de bits;por una máscara de bits;por una máscara de bits;por una máscara de bitsser r3 ;Coloca todos los bits del registro a 1ser r3 ;Coloca todos los bits del registro a 1ser r3 ;Coloca todos los bits del registro a 1ser r3 ;Coloca todos los bits del registro a 1subi r15,9 ;Resta al registro el valor del contenido de lasubi r15,9 ;Resta al registro el valor del contenido de lasubi r15,9 ;Resta al registro el valor del contenido de lasubi r15,9 ;Resta al registro el valor del contenido de la;constante.;constante.;constante.;constante.

Registros puntero

� Un papel especial es desempeñado por las parejas de registros r27:r26, r29:r28 y r31:r30.

� X,Y,Z� Parejas de registros de 16 bits� Acceder a direcciones de 16 bits en

la SRAM o dentro de la memoria del programa

Registros puntero

� La parte alta de la dirección se coloca en el registro de índice más alto, mientras que la parte baja de la dirección se almacena en el registro de índice más bajo.

� Accedidas mediante sus propios nombres� R30: ZL� R31: ZH� YL, YH, XL, XH

Page 4: Ensamblador ATMega8515

4

Registros puntero.EQU direccion = RAMEND.EQU direccion = RAMEND.EQU direccion = RAMEND.EQU direccion = RAMEND;en este comentario indicaremos ;que RAMEND es;la dirección más alta en la SRAMldi YH,high(direccion)ldi YH,high(direccion)ldi YH,high(direccion)ldi YH,high(direccion)

; carga la parte alta de la direcciónldi YL,low(direccion) ldi YL,low(direccion) ldi YL,low(direccion) ldi YL,low(direccion) ; carga la parte baja de la dirección

Registros puntero

Operaciones de escritura/lectura (st, ld) (no confundir con ldi)ld r1,X ld r1,X ld r1,X ld r1,X

; Lee de la dirección X, sin cambiar el ficherost X+,r1 st X+,r1 st X+,r1 st X+,r1 ;Escribe en la dirección X, e incrementa el puntero a;la siguiente direcciónld r1,ld r1,ld r1,ld r1,----X X X X ;Decrementa el puntero a la anterior dirección y lee de la; dirección X

Registros puntero

A3X10F4H

ld r1,X

R1 = A3

R26 = F4 (XL)

R27 = 10 (XH)

Directivas de definiciones de datos

� .DB para bytes, .DW para palabras (16 bits)

� Ejemplos:.DB 123,56,34,1 ; una lista de 4 bytes.DB 123,56,34,1 ; una lista de 4 bytes.DB 123,56,34,1 ; una lista de 4 bytes.DB 123,56,34,1 ; una lista de 4 bytes.DB “Esto es un texto” ; una lista de bytes, cadena de .DB “Esto es un texto” ; una lista de bytes, cadena de .DB “Esto es un texto” ; una lista de bytes, cadena de .DB “Esto es un texto” ; una lista de bytes, cadena de caracteres.caracteres.caracteres.caracteres..DW 13454 ; una palabra.DW 13454 ; una palabra.DW 13454 ; una palabra.DW 13454 ; una palabra� En las definiciones es recomendable usar un

número par de bytes ya que el ensamblador añadirá un 0 al final, lo cual puede no ser deseado. (alineación de memoria)

Directivas de definiciones de datos

Reservar espacio de memoria para datos posteriores.BYTE 8 ; reservar 8 bytes de memoria.BYTE 8 ; reservar 8 bytes de memoria.BYTE 8 ; reservar 8 bytes de memoria.BYTE 8 ; reservar 8 bytes de memoria Expresiones numéricas

� Decimales: � ldi r17, 2ldi r17, 2ldi r17, 2ldi r17, 2

� Binarias:� ldi r17, 0b11111110ldi r17, 0b11111110ldi r17, 0b11111110ldi r17, 0b11111110

� Hexadecimales:� ldi r17, ldi r17, ldi r17, ldi r17, 0xE00xE00xE00xE0

Page 5: Ensamblador ATMega8515

5

Expresiones numéricas

� Combinación de expresiones� Operaciones numéricas (+,-,*,/)

� ldi r16, 3+8ldi r16, 3+8ldi r16, 3+8ldi r16, 3+8� Binarios (&,|,~,...)

� ldi r16,1<<ldi r16,1<<ldi r16,1<<ldi r16,1<<PA7PA7PA7PA7� Lógicas (&&, ||, <=, ...)

Etiquetas

� Etiquetar (asignar un nombre a una dirección de memoria: datos o instrucción)Etiqueta: ldi r16, 1 Etiqueta: ldi r16, 1 Etiqueta: ldi r16, 1 Etiqueta: ldi r16, 1 …………rjmp Etiqueta ; salto incondicionalrjmp Etiqueta ; salto incondicionalrjmp Etiqueta ; salto incondicionalrjmp Etiqueta ; salto incondicional

Etiquetas

� En el caso de datosdato: .BYTE 1dato: .BYTE 1dato: .BYTE 1dato: .BYTE 1…………lds r16, (dato)lds r16, (dato)lds r16, (dato)lds r16, (dato)sts (dato), r16sts (dato), r16sts (dato), r16sts (dato), r16Puertos

� Los puertos son puertas entre la unidad de procesamiento central hasta hardware o software externo.

� La CPU se comunica con estos componentes, los lee y/o los escribe.

� Conjunto de bits de los cuales leer el estado lógico (entrada) o fijarlos a un estado lógico (salida)

Puertos de E/S

� Los puertos tienen direcciones fijas, independientemente del microprocesador AVR.

� Así, por ejemplo el puerto B se encuentra siempre en la dirección 0x18 (notación hexadecimal). (fichero de encabezado)

� Los puertos generalmente se organizan en conjunto de 8 bits relacionados entre sí, pero pueden estar organizados en conjuntos sin relación.

Page 6: Ensamblador ATMega8515

6

Puertos de E/S

� No solamente funcionalidad de E/S, dependiendo de la configuración, puede cumplir otros cometidos.

� Dispone de 4 puertos de E/S de 8 bits, y un puerto de 3 bits� A,B,C,D (AT90S8515)� E

� es habitual que cada uno de los bits tenga su propio nombre y función determinados� PA7, PB1, PD5

Puertos de E/S

� Operaciones de escritura� out PORTA, r17out PORTA, r17out PORTA, r17out PORTA, r17

� Operaciones de lectura� in r17, PINAin r17, PINAin r17, PINAin r17, PINA� Estas operaciones (in, out) se emplean

en todas las operaciones de lectura/escritura de los puertos

Puertos de E/S

3 registros, equivalente en el resto de puertos E/S

Puertos E/S

� Fijar la dirección del puerto (entrada/salida) con DDRA y hacer las operaciones de lectura/escritura correspondientes

Puertos E/S

� Configurar el puerto A del modo que � 4 bits más

significativos: ENTRADA� 4 bits menos

significativos: SALIDAldi r22, 0b00001111ldi r22, 0b00001111ldi r22, 0b00001111ldi r22, 0b00001111out DDRA, r22out DDRA, r22out DDRA, r22out DDRA, r22PA0

PA1

PA2

PA3

PA4

PA5

PA6

PA7

Puertos E/S

PA0

PA1

PA2

PA3

PA4

PA5

PA6

PA7

� Leer el contenido del puerto (las entradas)in r22, PINAin r22, PINAin r22, PINAin r22, PINAldi r23, 0b11110000ldi r23, 0b11110000ldi r23, 0b11110000ldi r23, 0b11110000and r22, r23and r22, r23and r22, r23and r22, r23Los bits de salida se anulan

y se mantienen los de entrada

1 0 11 01 0 0

1 0 01 01 0 0

Page 7: Ensamblador ATMega8515

7

Puertos E/S

� Es frecuente que se desee poner a 0 ó 1 un bit concreto de un puerto.

� Una opción para ello consistiría en leer el registro correspondiente, emplear las operaciones lógicas para alterar el bit seleccionado (AND, OR) y reenviar el byte al puerto. Sin embargo, esto se puede llevar a cabo mediante las instrucciones sbi (poner el bit a 1) y cbi (poner el bit a 0)..EQU bitCambiado = 5.EQU bitCambiado = 5.EQU bitCambiado = 5.EQU bitCambiado = 5sbi PortB, bitCambiadosbi PortB, bitCambiadosbi PortB, bitCambiadosbi PortB, bitCambiadocbi PortB, bitCambiadocbi PortB, bitCambiadocbi PortB, bitCambiadocbi PortB, bitCambiado

Puertos

� Aplicable al resto de registros a puertos.

� Las dos instrucciones cbi, sbi tienen una limitación, solamente afectan a puertos con una dirección inferior a 0x20

RAM ESTÁTICA, SRAM

� La SRAM es una memoria que no es accesible directamente por la CPU (ALU) como es el caso de los registros.

� Para acceder a esta parte de la memoria se deben emplear los registros como paso intermedio.

� Por lo tanto las operaciones que involucran a la SRAM son más lentas que la de los registros.

� A partir del modelo AT90S8515 se permite conectar una RAM externa adicional.

RAM ESTÁTICA, SRAM

� El acceso a la SRAM se lleva a cabo mediante las instrucciones STS y LDS.sts 0x0060, R1 sts 0x0060, R1 sts 0x0060, R1 sts 0x0060, R1 ; el contenido del ; el contenido del ; el contenido del ; el contenido del registro R1 se copia en la dirección registro R1 se copia en la dirección registro R1 se copia en la dirección registro R1 se copia en la dirección 0x00600x00600x00600x0060lds R1, 0x0060 ; lds R1, 0x0060 ; lds R1, 0x0060 ; lds R1, 0x0060 ; el contenido de la el contenido de la el contenido de la el contenido de la dirección 0x0060 se copia en el dirección 0x0060 se copia en el dirección 0x0060 se copia en el dirección 0x0060 se copia en el registro R1registro R1registro R1registro R1

RAM ESTÁTICA, SRAM

� Se suelen emplear nombres simbólicos para evitar emplear direcciones fijas..EQU direccionMemoria = 0x0060.EQU direccionMemoria = 0x0060.EQU direccionMemoria = 0x0060.EQU direccionMemoria = 0x0060STS direccionMemoria, R1STS direccionMemoria, R1STS direccionMemoria, R1STS direccionMemoria, R1

• En el caso de direcciones de memoria etiquetadasdato: .BYTE 1dato: .BYTE 1dato: .BYTE 1dato: .BYTE 1…………lds r19, (dato)lds r19, (dato)lds r19, (dato)lds r19, (dato)sts (dato), r21sts (dato), r21sts (dato), r21sts (dato), r21

Page 8: Ensamblador ATMega8515

8

RAM ESTÁTICA, SRAM

� El uso más común de la SRAM es como pila.

� La pila es como una torre de bloques.� Cada bloque que se añade se coloca en el

tope de la pila, cada vez que se extrae un dato de la pila también se saca del tope de pila.

� Esta estructura es llamada LIFO (last in, first out, el último en entrar, el primero en salir).

RAM ESTÁTICA, SRAM

� Para emplear la SRAM como pila se necesita definir el puntero de pila.

� El puntero de pila es de 16 bits, accesible como un puerto. SPH es la parte más significativa y SPL la parte menos significativa.

� Para construir la pila, el puntero se carga con el valor de la dirección más alta de la SRAM (la pila crece hacia las direcciones más bajas).

RAM ESTÁTICA, SRAMldi r16, HIGH(RAMEND)ldi r16, HIGH(RAMEND)ldi r16, HIGH(RAMEND)ldi r16, HIGH(RAMEND)out SPH, r16out SPH, r16out SPH, r16out SPH, r16ldi r16, LOW(RAMEND)ldi r16, LOW(RAMEND)ldi r16, LOW(RAMEND)ldi r16, LOW(RAMEND)out SPL, r16out SPL, r16out SPL, r16out SPL, r16Primeras líneas ejecutables de cualquier

programa (la pila se emplea para guardar la dirección de retorno de subrutinas, entre otras cosas)

RAM ESTÁTICA, SRAM

� El empleo de la pila es sencillo. � Los contenidos de los registros pueden

volcarse en la pila de la siguiente formapush r16push r16push r16push r16Y para extraer elementos de la pila,pop r16pop r16pop r16pop r16

PILA

R16 = 1AR17 = 3BR18 = 25

push r16

push r17

push r18

pop r16

pop r18

pop r17

1A

PILA

R16 = 1AR17 = 3BR18 = 25

push r16

push r17

push r18

pop r16

pop r18

pop r17

1A

3B

Page 9: Ensamblador ATMega8515

9

PILA

R16 = 1AR17 = 3BR18 = 25

push r16

push r17

push r18

pop r16

pop r18

pop r17

1A

3B

25

1A

3B

PILA

R16 = 1AR17 = 3BR18 = 25

push r16

push r17

push r18

pop r16

pop r18

pop r17

1A

3B

25

1A

3B

PILA

R16 = 1AR17 = 3BR18 = 25

push r16

push r17

push r18

pop r16

pop r18

pop r17

25

1A

3B

PILA

R16 = 1AR17 = 3BR18 = 25

push r16

push r17

push r18

pop r16

pop r18

pop r17

25

1A

3B

RAM ESTÁTICA, SRAM

� Útil para hacer transparentes las subrutinas a los registrosRUTINA:RUTINA:RUTINA:RUTINA:push r16push r16push r16push r16…………mov r16, r23mov r16, r23mov r16, r23mov r16, r23…………pop r16pop r16pop r16pop r16RETRETRETRET

CUIDADO CON DESCOMPENSAR LA PILA!!!!!!!

RAM ESTÁTICA, SRAM� Cuando se usan dos o más registros, se almacenan

y se recuperan en orden inversoRUTINA:RUTINA:RUTINA:RUTINA:push r16push r16push r16push r16push r17push r17push r17push r17…………mov r16, r23mov r16, r23mov r16, r23mov r16, r23…………pop r17pop r17pop r17pop r17pop r16pop r16pop r16pop r16RETRETRETRETCUIDADO CON DESCOMPENSAR LA PILA!!!!!!!

Page 10: Ensamblador ATMega8515

10

RAM ESTÁTICA, SRAM

� Al llamar a la subrutina el programa almacena en la pila la dirección de la próxima instrucción a ejecutar (de ahí no descompensar la pila dentro de la subrutina)rcall rutina ;saltar a la subrutinarcall rutina ;saltar a la subrutinarcall rutina ;saltar a la subrutinarcall rutina ;saltar a la subrutina............rutina:rutina:rutina:rutina:; aquí las instrucciones de la subrutina; aquí las instrucciones de la subrutina; aquí las instrucciones de la subrutina; aquí las instrucciones de la subrutinaret ; instrucción de retorno de la subrutinaret ; instrucción de retorno de la subrutinaret ; instrucción de retorno de la subrutinaret ; instrucción de retorno de la subrutina

rcall rutina

rutina:

ret

Direc1

PILA

rcall rutina

rutina:

push r16

ret

Direc1

PILA R16= 01

Directivas

.CSEG

Para indicar el comienzo de un código de un programa.

.DSEG

La sección de la SRAM en el integrado (datos).ESEG

La sección EEPROM.ORG

Para indicar que el segmento de código o datos comienza en una dirección distinta de la de por defecto.

Directivas

Por ejemplo, para cambiar el segmento de datos a la dirección 100.ORG 100.ORG 100.ORG 100.ORG 100.DSEG.DSEG.DSEG.DSEG

Saltos

� La ejecución de un programa es lineal. Sin embargo, las instrucciones de bifurcación (branches) y los saltos incondicionales alteran esta ejecución lineal.

� Supóngase que se desea implementar un contador de 32 bits empleando los registros r1 a r4. El byte menos significativo en r1 se incrementa en 1 (operación inc). Si el registro se desborda, el registro tendrá el valor de 0 (255+1=0), y se tendrá que sumar 1 al r2 (siguiente byte más significativo).

� Y así sucesivamente

Page 11: Ensamblador ATMega8515

11

Saltos Condicionalesinc r1inc r1inc r1inc r1brne siguebrne siguebrne siguebrne sigueinc r2inc r2inc r2inc r2brne siguebrne siguebrne siguebrne sigueinc r3inc r3inc r3inc r3brne siguebrne siguebrne siguebrne sigueinc r4inc r4inc r4inc r4sigue:sigue:sigue:sigue: 0 0 0 0

R4 R3 R1R2

1

Saltos Condicionalesinc r1inc r1inc r1inc r1brne siguebrne siguebrne siguebrne sigueinc r2inc r2inc r2inc r2brne siguebrne siguebrne siguebrne sigueinc r3inc r3inc r3inc r3brne siguebrne siguebrne siguebrne sigueinc r4inc r4inc r4inc r4sigue:sigue:sigue:sigue: 0 0 0 255

R4 R3 R1R2

01 0

Saltos Condicionales; adc: sumar con acarreo; adc: sumar con acarreo; adc: sumar con acarreo; adc: sumar con acarreor18 r19r20 r21+

o Dos números de 16 bits (dos registros de propósito general)

o Si el resultado parcial al sumar r19 más r21 supera el 255, me llevo uno (es como máximo lo que se puede “llevar”)

o De modo equivalente a la suma decimaladd r19, r21add r19, r21add r19, r21add r19, r21adc r18, r20 adc r18, r20 adc r18, r20 adc r18, r20 R19 + R21

1

1 +R18 + R20

Saltos Condicionales; adc: sumar con acarreo; adc: sumar con acarreo; adc: sumar con acarreo; adc: sumar con acarreoldi r16,0ldi r16,0ldi r16,0ldi r16,0ldi r17,1ldi r17,1ldi r17,1ldi r17,1add r1, r17add r1, r17add r1, r17add r1, r17adc r2, r16adc r2, r16adc r2, r16adc r2, r16adc r3, r16 adc r3, r16 adc r3, r16 adc r3, r16 adc r4, r16adc r4, r16adc r4, r16adc r4, r16sigue:sigue:sigue:sigue:Saltos Condicionalesbrge ; mayor o igual (con bit de signo)brge ; mayor o igual (con bit de signo)brge ; mayor o igual (con bit de signo)brge ; mayor o igual (con bit de signo)brlt ; menor que (con bit de signo)brlt ; menor que (con bit de signo)brlt ; menor que (con bit de signo)brlt ; menor que (con bit de signo)…

Saltos Condicionales

o Empleadas frecuentemente con las instrucciones de comparacióncpi r22, 68 ; hace la resta r22cpi r22, 68 ; hace la resta r22cpi r22, 68 ; hace la resta r22cpi r22, 68 ; hace la resta r22----68686868; sin guardar el resultado; sin guardar el resultado; sin guardar el resultado; sin guardar el resultadobrne r22distinto68brne r22distinto68brne r22distinto68brne r22distinto68…………r22distinto68:r22distinto68:r22distinto68:r22distinto68:

Page 12: Ensamblador ATMega8515

12

Saltos Condicionales

Las instrucciones de salto condicional y la instrucción adc se refieren a la instrucción inmediatamente anterior. Por tanto, se debe evitar insertar nuevas instrucciones entre la condición de comparación y la del salto condicional/adc.

Saltos Incondicionalesrcallrcallrcallrcall : Salto a las subrutinas (limitado a un desplazamiento de instrucciones limitados. Cambio de orden de las subrutinas en el código o etiquetas auxiliares)rjmprjmprjmprjmp : saltar directamente a la dirección deseada.

Saltos Incondicionalesrcall rutinarcall rutinarcall rutinarcall rutina…………rutina:rutina:rutina:rutina:rjmp rutina1rjmp rutina1rjmp rutina1rjmp rutina1…………rutina1:rutina1:rutina1:rutina1:MACROS

� Una macro permite la utilización repetida de secuencias de instrucciones. Por ejemplo:.MACRO Delay.MACRO Delay.MACRO Delay.MACRO Delaynopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnop.ENDMACRO.ENDMACRO.ENDMACRO.ENDMACRO; instrucciones; instrucciones; instrucciones; instruccionesDelayDelayDelayDelay; más instrucciones; más instrucciones; más instrucciones; más instrucciones

� Una macro no ahorra espacio de memoria puesto que al compilar la etiqueta de la macro es reemplazada por el conjunto de instrucciones correspondientes.

Saltos de instrucción

� permiten saltarse (skip) la siguiente instrucción a ejecutarsbrc r1,7 ;saltarse la siguiente dirección si el sbrc r1,7 ;saltarse la siguiente dirección si el sbrc r1,7 ;saltarse la siguiente dirección si el sbrc r1,7 ;saltarse la siguiente dirección si el bit 7 del registro está a bajabit 7 del registro está a bajabit 7 del registro está a bajabit 7 del registro está a bajarcall siBitDistinto7 ;ejecutada solamente si el rcall siBitDistinto7 ;ejecutada solamente si el rcall siBitDistinto7 ;ejecutada solamente si el rcall siBitDistinto7 ;ejecutada solamente si el bit 7 está a 1bit 7 está a 1bit 7 está a 1bit 7 está a 1rcall otro ;ejecutada de todas manerasrcall otro ;ejecutada de todas manerasrcall otro ;ejecutada de todas manerasrcall otro ;ejecutada de todas maneras

Skip if Bit in Register is Clear

Saltos de instrucción

Diferente al uso en Puertossbic PINB,0 ; saltarse la siguiente sbic PINB,0 ; saltarse la siguiente sbic PINB,0 ; saltarse la siguiente sbic PINB,0 ; saltarse la siguiente instrucción si el bit 0 del puerto b está instrucción si el bit 0 del puerto b está instrucción si el bit 0 del puerto b está instrucción si el bit 0 del puerto b está a bajaa bajaa bajaa bajaSkip if Bit Is Clear

Page 13: Ensamblador ATMega8515

13

Saltos de instrucción

� Otro tipo de instrucción de skip es la de comparación de registroscpse r1,r2 ;saltarse la siguientecpse r1,r2 ;saltarse la siguientecpse r1,r2 ;saltarse la siguientecpse r1,r2 ;saltarse la siguiente; instrucción si los contenidos de r1; instrucción si los contenidos de r1; instrucción si los contenidos de r1; instrucción si los contenidos de r1; y r2 son iguales; y r2 son iguales; y r2 son iguales; y r2 son iguales

Interrupciones

� Con frecuencia se debe reaccionar ante condiciones hardware u otros eventos� Cambio de valor en un bit de un puerto

de entrada, teclado, temporización…� Posible solución: bucle continuo de

lectura del puerto� Ineficiente en cuanto a recursos: no podría hacer otra cosa

Interrupciones

� Las interrupciones se disparan por alguna condición, que debe ser habilitada primero, ya que todas las interrupciones hardware se encuentran deshabilitadas por defecto.

� El microprocesador posee un bit en su registro de estado para permitir que se procesen las interrupciones.

� Para activar/desactivar este bit se emplean las instrucciones sei y cli.

Interrupciones

� Si la condición de la interrupción se produce, el procesador coloca en la pila, la dirección de la siguiente instrucción a ejecutar.

� De este modo, la ejecución del programa puede continuar después de procesar la interrupción.

Interrupciones

� Después procesa la instrucción correspondiente en su vector de interrupción, que generalmente es un salto incondicional a la subrutina de procesamiento de interrupción.

� El vector de interrupción es una posición dependiente del procesador.

� Cuando se produce la interrupción, si está habilitada, se busca la instrucción almacenada en la posición correspondiente (salto)

Page 14: Ensamblador ATMega8515

14

Interrupciones

� Por ejemplo, si se habilita la INT Externa 0, cuando se produce, el microcontrolador irá a la dirección $001 y la ejecutará.

$001 ……… rjmp INT_EXT0…

INT_EXT0:…RETI

Interrupciones

� Existe un orden de prioridad en las interrupciones, de modo que si dos o más interrupciones habilitadas se producen simultáneamente solamente será procesada la de mayor prioridad.

� Las demás simplemente esperarán a que se haya procesado la de mayor prioridad.

Interrupciones

� La rutina de interrupción debería terminar con la instrucción RETI

� Las direcciones más bajas de memoria coincide con los vectores de interrupción.

� Es buena práctica de programación asignar a esas direcciones los saltos a las subrutinas de procesamiento de las interrupciones, aunque no se habiliten ni se usen � Futuras necesidades y reformas del código

Estructura típica de un programa; incluir el archivo donde están todos los parámetros....includeincludeincludeinclude “m8515def.inc“m8515def.inc“m8515def.inc“m8515def.inc"""";vectores de interrupcionesrjmprjmprjmprjmp InitInitInitInitretiretiretireti ; ; ; ; ExternalExternalExternalExternal 0 0 0 0 interruptinterruptinterruptinterrupt VectorVectorVectorVectorretiretiretireti ; ; ; ; ExternalExternalExternalExternal 1 1 1 1 interruptinterruptinterruptinterrupt Vector Vector Vector Vector retiretiretireti ; ; ; ; TimerTimerTimerTimer 1 Capture Vector 1 Capture Vector 1 Capture Vector 1 Capture Vector retiretiretireti ; ; ; ; TimerTimerTimerTimer 1 1 1 1 CompareACompareACompareACompareA VectorVectorVectorVectorretiretiretireti ; ; ; ; TimerTimerTimerTimer 1 1 1 1 CompareBCompareBCompareBCompareB Vector Vector Vector Vector retiretiretireti ; ; ; ; TimerTimerTimerTimer 1 1 1 1 OverflowOverflowOverflowOverflow Vector Vector Vector Vector retiretiretireti ; ; ; ; TimerTimerTimerTimer 0 0 0 0 OverflowOverflowOverflowOverflow Vector Vector Vector Vector retiretiretireti ; SPI Vector ; SPI Vector ; SPI Vector ; SPI Vector rjmprjmprjmprjmp UARTINTUARTINTUARTINTUARTINT ; UART ; UART ; UART ; UART ReceiveReceiveReceiveReceive Vector Vector Vector Vector retiretiretireti ; UDR ; UDR ; UDR ; UDR EmptyEmptyEmptyEmpty Vector Vector Vector Vector retiretiretireti ; UART ; UART ; UART ; UART TransmitTransmitTransmitTransmit Vector Vector Vector Vector retiretiretireti ; ; ; ; AnalogueAnalogueAnalogueAnalogue ComparatorComparatorComparatorComparator Vector Vector Vector Vector

Estructura típica de un programa;definiciones y etiquetas.equ .equ .equ .equ tiempo = 50tiempo = 50tiempo = 50tiempo = 50.def TWIdelay= r16.def TWIdelay= r16.def TWIdelay= r16.def TWIdelay= r16; segmento de datos.DSEG.DSEG.DSEG.DSEGtemporal: .BYTE 128temporal: .BYTE 128temporal: .BYTE 128temporal: .BYTE 128med1prod1: .BYTE 2 ; medida1 producto1 med1prod1: .BYTE 2 ; medida1 producto1 med1prod1: .BYTE 2 ; medida1 producto1 med1prod1: .BYTE 2 ; medida1 producto1 ; se inicia el programa principal (segmento de código).CSEG .CSEG .CSEG .CSEG ; subrutinasASCII:ASCII:ASCII:ASCII:push r16push r16push r16push r16…………pop r16pop r16pop r16pop r16RET RET RET RET

Page 15: Ensamblador ATMega8515

15

Estructura típica de un programaInit:Init:Init:Init:; se inicializa el programaldi temp,low(RAMEND)ldi temp,low(RAMEND)ldi temp,low(RAMEND)ldi temp,low(RAMEND)out SPL,tempout SPL,tempout SPL,tempout SPL,templdi temp,high(RAMEND)ldi temp,high(RAMEND)ldi temp,high(RAMEND)ldi temp,high(RAMEND)out SPH,temp ;init Stack Pointerout SPH,temp ;init Stack Pointerout SPH,temp ;init Stack Pointerout SPH,temp ;init Stack Pointer;configuraciones de los elementos empleados para el programa; puertos E/Sldi r16, 1ldi r16, 1ldi r16, 1ldi r16, 1out DDRA, r16out DDRA, r16out DDRA, r16out DDRA, r16;timer, interrupciones, UART…

; habilitar las interrupcionesseiseiseisei…

Estructura típica de un programa; rutinas de interrupcionesUARTINT:UARTINT:UARTINT:UARTINT:cli ; si no se quiere que una interrupción de mayor prioridad cli ; si no se quiere que una interrupción de mayor prioridad cli ; si no se quiere que una interrupción de mayor prioridad cli ; si no se quiere que una interrupción de mayor prioridad ; intervenga; intervenga; intervenga; intervenga….….….….sei ; habilitar de nuevo las interrupcionessei ; habilitar de nuevo las interrupcionessei ; habilitar de nuevo las interrupcionessei ; habilitar de nuevo las interrupcionesRETIRETIRETIRETI

Configuración de dispositivos

� A partir de la documentación del integrado.� Configuración de los registros asociados al

dispositivo empleado� ATmega8515 ofrece:

� EEPROM (memoria perdurable)� 512 bytes� Más cara que la memoria normal� 100000 escrituras� Uso razonable

� TIMERS (temporizadores)� Timer 0 de 8 bits con preescaler� Timer 1 de 16 bits con preescaler

� Dos comparadores A y B� Captura� PWM dual de 8, 9 y 10 bits (en tres canales)

Configuración de dispositivos

� ATmega8515 ofrece:� Comparador analógico� Watchdog programable

� un temporizador programable que reseteael microcontrolador si no se refresca en cierto tiempo

� USART programable (diferente al AT90S8515 --- UART)

� Interfaz Master/Slave SPI

Ejemplo: Timer 0

� Timer/temporizador de 8 bits� Contador que lleva la cuenta del tiempo

transcurrido� Preescalado (cada cuántos pulsos de reloj

se modifica el valor del contador del temporizador)

� Usarlo como interrupción de desbordamiento

� Contar sucesos a 35 Hz. (un suceso cada 1/35 sg.)

Ejemplo: Timer 0

� Definir la interrupción del Timer 0 (desbordamiento)rjmp Initrjmp Initrjmp Initrjmp Initreti reti reti reti ; External 0 interrupt Vector; External 0 interrupt Vector; External 0 interrupt Vector; External 0 interrupt Vectorretiretiretireti ; External 1 interrupt Vector ; External 1 interrupt Vector ; External 1 interrupt Vector ; External 1 interrupt Vector retiretiretireti ; Timer 1 Capture Vector ; Timer 1 Capture Vector ; Timer 1 Capture Vector ; Timer 1 Capture Vector retiretiretireti ; Timer 1 CompareA Vector; Timer 1 CompareA Vector; Timer 1 CompareA Vector; Timer 1 CompareA Vectorretiretiretireti ; Timer 1 CompareB Vector ; Timer 1 CompareB Vector ; Timer 1 CompareB Vector ; Timer 1 CompareB Vector retiretiretireti ; Timer 1 Overflow Vector ; Timer 1 Overflow Vector ; Timer 1 Overflow Vector ; Timer 1 Overflow Vector rrrrjmp Timer0Overjmp Timer0Overjmp Timer0Overjmp Timer0Over ; Timer 0 Overflow Vector ; Timer 0 Overflow Vector ; Timer 0 Overflow Vector ; Timer 0 Overflow Vector retiretiretireti ; SPI Vector ; SPI Vector ; SPI Vector ; SPI Vector rrrretietietieti ; UART Receive Vector ; UART Receive Vector ; UART Receive Vector ; UART Receive Vector retiretiretireti ; UDR Empty Vector ; UDR Empty Vector ; UDR Empty Vector ; UDR Empty Vector retiretiretireti ; UART Transmit Vector ; UART Transmit Vector ; UART Transmit Vector ; UART Transmit Vector retiretiretireti ; Analogue Comparator Vector; Analogue Comparator Vector; Analogue Comparator Vector; Analogue Comparator Vector

Page 16: Ensamblador ATMega8515

16

Ejemplo: Timer 0

� Escoger el preescalado

Ejemplo: Timer 0

� Escoger el preescalado� Con un reloj de 9.175 Mhz, 1 ciclo de

reloj cada 1/9175000 seg.� Con un preescalado de CK/1024 tenemos,

1 actualización de reloj cada 1024/9175000 seg.

� Un desbordamiento cada (256*1024)/9175000 seg (es un temporizador de 8 bits)

� Un suceso cada 1/34.9998 seg.

Ejemplo: Timer 0

� Escoger el preescalado

Ejemplo: Timer 0

� Escoger el preescaladoldi r16, 0b00000101ldi r16, 0b00000101ldi r16, 0b00000101ldi r16, 0b00000101out TCCR0, r16out TCCR0, r16out TCCR0, r16out TCCR0, r16

Ejemplo: Timer 0

� Poner el contador a 0

ldi r16, 0ldi r16, 0ldi r16, 0ldi r16, 0out TCNT0, r16out TCNT0, r16out TCNT0, r16out TCNT0, r16� Indicar que se desea emplear esa interrupción en caso de habilitación

Ejemplo: Timer 0

Page 17: Ensamblador ATMega8515

17

Ejemplo: Timer 0

� Indicar que se desea emplear esa interrupción en caso de habilitación ldi r16, 0b00000010ldi r16, 0b00000010ldi r16, 0b00000010ldi r16, 0b00000010out TIMSK, r16out TIMSK, r16out TIMSK, r16out TIMSK, r16

Ejemplo: Timer 0

o Habilitar las interrupciones seleccionadasseiseiseiseio Rutina de interrupción:Timer0Over:Timer0Over:Timer0Over:Timer0Over:............retiretiretireti