You are on page 1of 17

Microcontroladores

MICROCONTROLADORES
ATmega8515
El programa en cdigo binario puede ocupar hasta 8 Kb

Dr. Evelio J. Gonzlez

Ms que suficiente para la gran mayora de las aplicaciones

ATmega8515

Binario
Obviamente no se codifica el programa en binario Ensamblador Lenguaje que emplea la arquitectura interna del dispositivo

Compatible con versin anterior: AT90S8515 (salvo ciertos aspectos, que pueden ser ignorados en momento de programacin).

Binario
Se puede programar en C, pero en esta asignatura se considera ms pedaggico 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 darn unas nociones del ensamblador. Inabordable hablar de 130 instrucciones diferentes Complementado con la documentacin del repertorio de instrucciones

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 numricos 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 propsito general
Operaciones aritmticas, mover datos entre/hacia memoria, preparar datos para enviarlos a otros registros especiales R0, R1, R2,, R31 Accedidos mediante su direccin de memoria Por ejemplo:

El registro R1 est en la direccin $01

Registros
Complicado, engorroso No solamente limitado a estos registros, sino a todos Para poder usarse mnemnicos, se importa un fichero de definiciones
.include "8515def.inc" .include m8515def.inc

Fichero de definiciones
; Definiciones de etiquetas
.equ .equ .equ .equ PORTA DDRA =$1a PINA PORTB =$19 =$18 =$1b

... ; esto es un comentario ;en vez de usar $1b puedo poner PORTA ; etiquetas como agente facilitador de cambios y de legibilidad del cdigo

Fichero de definiciones
ldi r16, 1

Registros
Otra instruccin interesante es la de copiar datos desde un registro a otro: la instruccin mov. El siguiente cdigo copia el contenido del r16 al registro r20.
mov r20,r16

; poner un 1 en r16

Tambin puede accederse mediante la definicin de directivas (no generan cdigo ejecutable, no cdigo mquina) Favorece la legibilidad del cdigo
.def regTemporal = r16

ldi regTemporal, 1

Obsrvese que el primer registro es siempre el registro destino de la operacin. operacin destino, fuente

Registros
Existen diferentes tipos de registros. As una instruccin del tipo
ldi r15, 15

Registros
andi r15,4 ;Realiza el y lgico entre el registro y un nmero cbr r14,45 ;Limpia los bits en el registro determinados por ;una mscara de bits cpi r13,6 ;Compara el contenido del registro con una ;constante sbci r9,7 ;Resta al registro el valor del contenido de la ;constante y del resultado actual del bit de carry sbr r12,89 ; Coloca a '1' los bits en el registro determinados ;por una mscara de bits ser r3 ;Coloca todos los bits del registro a 1 subi r15,9 ;Resta al registro el valor del contenido de la ;constante.
Aparte del comando ldi, las siguientes instrucciones no pueden emplearse con los registros r0 a r15:

no sera vlida, 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 operacin con los registros del r0 al r15. Excepcin: limpiar los bits (poner todos los bits a 0)
clr r15

Registros puntero
Un papel especial es desempeado 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 direccin se coloca en el registro de ndice ms alto, mientras que la parte baja de la direccin se almacena en el registro de ndice ms bajo. Accedidas mediante sus propios nombres R30: ZL R31: ZH YL, YH, XL, XH

Registros puntero
.EQU direccion = RAMEND

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

;en este comentario indicaremos ;que RAMEND es ;la direccin ms alta en la SRAM
ldi YH,high(direccion)

; Lee de la direccin X, sin cambiar el fichero


st X+,r1

; carga la parte alta de la direccin


ldi YL,low(direccion)

;Escribe en la direccin X, e incrementa el puntero a ;la siguiente direccin


ld r1,r1,-X

; carga la parte baja de la direccin

;Decrementa el puntero a la anterior direccin y lee de la ; direccin X

Registros puntero

Directivas de definiciones de datos


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

ld r1,X 10F4H A3

Ejemplos:
.DB 123,56,34,1 ; una lista de 4 bytes .DB Esto es un texto ; una lista de bytes, cadena de caracteres. .DW 13454 ; una palabra

X R1 = A3 R26 = F4 R27 = 10 (XL) (XH)

En las definiciones es recomendable usar un nmero par de bytes ya que el ensamblador aadir un 0 al final, lo cual puede no ser deseado. (alineacin de memoria)

Directivas de definiciones de datos


Reservar espacio de memoria para datos posteriores
.BYTE 8 ; reservar 8 bytes de memoria

Expresiones numricas
Decimales:
ldi r17, 2

Binarias:
ldi r17, 0b11111110

Hexadecimales:
ldi r17, 0xE0

Expresiones numricas
Combinacin de expresiones
Operaciones numricas (+,-,*,/)
ldi r16, 3+8

Etiquetas
Etiquetar (asignar un nombre a una direccin de memoria: datos o instruccin)
Etiqueta: ldi r16, 1 rjmp Etiqueta ; salto incondicional

Binarios (&,|,~,...)
ldi r16,1<<PA7 r16,1<<PA7

Lgicas (&&, ||, <=, ...)

Etiquetas
En el caso de datos
dato: .BYTE 1 lds r16, (dato) sts (dato), r16

Puertos
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 lgico (entrada) o fijarlos a un estado lgico (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 direccin 0x18 (notacin hexadecimal). (fichero de encabezado) Los puertos generalmente se organizan en conjunto de 8 bits relacionados entre s, pero pueden estar organizados en conjuntos sin relacin.

Puertos de E/S
No solamente funcionalidad de E/S, dependiendo de la configuracin, 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

Puertos de E/S
Operaciones de escritura
out PORTA, r17

Operaciones de lectura
in r17, PINA

es habitual que cada uno de los bits tenga su propio nombre y funcin determinados
PA7, PB1, PD5

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 direccin del puerto (entrada/salida) con DDRA y hacer las operaciones de lectura/escritura correspondientes

Puertos E/S
PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7
ldi r22, 0b00001111 out DDRA, r22

Puertos E/S
Configurar el puerto A del modo que
4 bits ms significativos: ENTRADA 4 bits menos significativos: SALIDA
PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7
in r22, PINA ldi r23, 0b11110000 and r22, r23

Leer el contenido del puerto (las entradas)

Los bits de salida se anulan y se mantienen los de entrada


1 0 1 1 0 0 0 1

1 0 1 1 0 0 0 0

Puertos E/S
Es frecuente que se desee poner a 0 1 un bit concreto de un puerto. Una opcin para ello consistira en leer el registro correspondiente, emplear las operaciones lgicas 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 sbi PortB, bitCambiado cbi PortB, bitCambiado

Puertos
Aplicable al resto de registros a puertos. Las dos instrucciones cbi, sbi tienen una limitacin, solamente afectan a puertos con una direccin inferior a 0x20

RAM ESTTICA, 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 ms lentas que la de los registros. A partir del modelo AT90S8515 se permite conectar una RAM externa adicional.

RAM ESTTICA, SRAM


El acceso a la SRAM se lleva a cabo mediante las instrucciones STS y LDS.
sts 0x0060, R1 ; el contenido del

RAM ESTTICA, SRAM


Se suelen emplear nombres simblicos para evitar emplear direcciones fijas.
.EQU direccionMemoria = 0x0060 STS direccionMemoria, R1

registro R1 se copia en la direccin 0x0060


lds R1, 0x0060 ; el contenido de la

En el caso de direcciones de memoria etiquetadas

dato: .BYTE 1 lds r19, (dato) sts (dato), r21

direccin 0x0060 se copia en el registro R1

RAM ESTTICA, SRAM


El uso ms comn de la SRAM es como pila. La pila es como una torre de bloques. Cada bloque que se aade se coloca en el tope de la pila, cada vez que se extrae un dato de la pila tambin se saca del tope de pila. Esta estructura es llamada LIFO (last in, first out, el ltimo en entrar, el primero en salir).

RAM ESTTICA, 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 ms significativa y SPL la parte menos significativa. Para construir la pila, el puntero se carga con el valor de la direccin ms alta de la SRAM (la pila crece hacia las direcciones ms bajas).

RAM ESTTICA, SRAM


ldi r16, HIGH(RAMEND) out SPH, r16 ldi r16, LOW(RAMEND) out SPL, r16

RAM ESTTICA, SRAM


El empleo de la pila es sencillo. Los contenidos de los registros pueden volcarse en la pila de la siguiente forma
push r16

Primeras lneas ejecutables de cualquier programa (la pila se emplea para guardar la direccin de retorno de subrutinas, entre otras cosas)

Y para extraer elementos de la pila,


pop r16

PILA
R16 = 1A R17 = 3B R18 = 25
push r16 push r17 push r18

PILA
R16 = 1A R17 = 3B R18 = 25
push r16 push r17

3B 1A

push r18 pop r16 pop r18 pop r17

1A

pop r16 pop r18 pop r17

PILA
R16 = 1A R17 = 3B R18 = 25
25 3B 3B
1A 1A push r16 push r17 push r18 pop r16 pop r18 pop r17

PILA
R16 = 1A R17 = 3B R18 = 25
25 3B 3B
1A 1A push r16 push r17 push r18 pop r16 pop r18 pop r17

PILA
25 R16 = 1A R17 = 3B R18 = 25
push r16 push r17

PILA
25 R16 = 1A R17 = 3B R18 = 25 3B
push r16 push r17 push r18

3B 1A

push r18 pop r16 pop r18 pop r17

1A

pop r16 pop r18 pop r17

RAM ESTTICA, SRAM


til para hacer transparentes las subrutinas a los registros
RUTINA: push r16 mov r16, r23 pop r16 RET

RAM ESTTICA, SRAM


Cuando se usan dos o ms registros, se almacenan y se recuperan en orden inverso

RUTINA:
push r16 push r17

mov r16, r23


pop r17 pop r16

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

RET

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

RAM ESTTICA, SRAM


Al llamar a la subrutina el programa almacena en la pila la direccin de la prxima instruccin a ejecutar (de ah no descompensar la pila dentro de la subrutina)
rcall rutina ;saltar a la subrutina ... rutina: ; aqu las instrucciones de la subrutina ret ; instruccin de retorno de la subrutina

rutina:

rcall rutina
Direc1

ret PILA

rutina: push r16 rcall rutina


Direc1

Directivas
.CSEG Para indicar el comienzo de un cdigo de un programa. .DSEG La seccin de la SRAM en el integrado (datos) .ESEG La seccin EEPROM .ORG Para indicar que el segmento de cdigo o datos comienza en una direccin distinta de la de por defecto.

ret PILA
R16= 01

Directivas
Por ejemplo, para cambiar el segmento de datos a la direccin 100

Saltos
La ejecucin de un programa es lineal. Sin embargo, las instrucciones de bifurcacin (branches) y los saltos incondicionales alteran esta ejecucin lineal. Supngase 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 (operacin 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 ms significativo). Y as sucesivamente

.ORG 100 .DSEG

10

Saltos Condicionales
inc r1 brne sigue inc r2 brne sigue inc r3 brne sigue inc r4 sigue:

Saltos Condicionales
inc r1 brne sigue

R4 0

R3 0

R2 0

R1 0 1

inc r2 brne sigue inc r3 brne sigue inc r4 sigue:

R4 0

R3 0

R2 0 1

R1 255 0

Saltos Condicionales
; adc: sumar con acarreo

Saltos Condicionales
; adc: sumar con acarreo ldi r16,0 ldi r17,1 add r1, r17 adc r2, r16 adc r3, r16 adc r4, r16 sigue:

r18 + r20
1 +R18 + R20

r19 r21
R19 + R21 1

o Dos nmeros de 16 bits (dos registros de propsito general) o Si el resultado parcial al sumar r19 ms r21 supera el 255, me llevo uno (es como mximo lo que se puede llevar) o De modo equivalente a la suma decimal
add r19, r21 adc r18, r20

Saltos Condicionales
brge ; mayor o igual (con bit de signo) brlt ; menor que (con bit de signo)

Saltos Condicionales
o

Empleadas frecuentemente con las instrucciones de comparacin

cpi r22, 68 ; hace la resta r22r22-68 ; sin guardar el resultado brne r22distinto68 r22distinto68:

11

Saltos Condicionales
Las instrucciones de salto condicional y la instruccin adc se refieren a la instruccin inmediatamente anterior. Por tanto, se debe evitar insertar nuevas instrucciones entre la condicin de comparacin y la del salto condicional/adc.

Saltos Incondicionales
rcall

: Salto a las subrutinas (limitado a un desplazamiento de instrucciones limitados. Cambio de orden de las subrutinas en el cdigo o etiquetas auxiliares)

rjmp

: saltar directamente a la direccin deseada.

Saltos Incondicionales
rcall rutina

MACROS
Una macro permite la utilizacin repetida de secuencias de instrucciones. Por ejemplo:

rutina: rjmp rutina1

.MACRO Delay nop nop nop nop .ENDMACRO ; instrucciones Delay ; ms 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.

rutina1:

Saltos de instruccin
permiten saltarse (skip) la siguiente instruccin a ejecutar
sbrc r1,7 ;saltarse la siguiente direccin si el bit 7 del registro est a baja rcall siBitDistinto7 ;ejecutada solamente si el bit 7 est a 1 rcall otro ;ejecutada de todas maneras

Saltos de instruccin
Diferente al uso en Puertos
sbic PINB,0 ; saltarse la siguiente instruccin si el bit 0 del puerto b est a baja

Skip if Bit in Register is Clear

Skip if Bit Is Clear

12

Saltos de instruccin
Otro tipo de instruccin de skip es la de comparacin de registros
cpse r1,r2 ;saltarse la siguiente ; instruccin si los contenidos de r1 ; 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, temporizacin Posible solucin: bucle continuo de lectura del puerto Ineficiente en cuanto a recursos: no podra hacer otra cosa

Interrupciones
Las interrupciones se disparan por alguna condicin, 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 condicin de la interrupcin se produce, el procesador coloca en la pila, la direccin de la siguiente instruccin a ejecutar. De este modo, la ejecucin del programa puede continuar despus de procesar la interrupcin.

Interrupciones
Despus procesa la instruccin correspondiente en su vector de interrupcin, que generalmente es un salto incondicional a la subrutina de procesamiento de interrupcin. El vector de interrupcin es una posicin dependiente del procesador. Cuando se produce la interrupcin, si est habilitada, se busca la instruccin almacenada en la posicin correspondiente (salto)

13

Interrupciones
Por ejemplo, si se habilita la INT Externa 0, cuando se produce, el microcontrolador ir a la direccin $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 ms interrupciones habilitadas se producen simultneamente solamente ser procesada la de mayor prioridad. Las dems simplemente esperarn a que se haya procesado la de mayor prioridad.

Interrupciones
La rutina de interrupcin debera terminar con la instruccin RETI Las direcciones ms bajas de memoria coincide con los vectores de interrupcin. Es buena prctica de programacin 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 cdigo

Estructura tpica de un programa


; incluir el archivo donde estn todos los parmetros

Estructura tpica de un programa


;definiciones y etiquetas

.include m8515def.inc" m8515def.inc" rjmp Init reti reti reti reti reti reti reti reti rjmp UARTINT reti reti reti

;vectores de interrupciones

.equ tiempo =

50

.def TWIdelay= r16

; External 0 interrupt Vector ; External 1 interrupt Vector ; Timer 1 Capture Vector ; Timer 1 CompareA Vector ; Timer 1 CompareB Vector ; Timer 1 Overflow Vector ; Timer 0 Overflow Vector ; SPI Vector ; UART Receive Vector ; UDR Empty Vector ; UART Transmit Vector ; Analogue Comparator Vector

; segmento de datos
.DSEG temporal: .BYTE 128 med1prod1: .BYTE 2 ; medida1 producto1

; se inicia el programa principal (segmento de cdigo)


.CSEG

; subrutinas
ASCII: push r16 pop r16 RET

14

Estructura tpica de un programa


Init:

Estructura tpica de un programa


; rutinas de interrupciones
UARTINT: cli ; si no se quiere que una interrupcin de mayor prioridad ; intervenga

; se inicializa el programa
ldi temp,low(RAMEND) out SPL,temp ldi temp,high(RAMEND) out SPH,temp ;init Stack Pointer

;configuraciones de los elementos empleados para el programa ; puertos E/S


ldi r16, 1 out DDRA, r16

. sei RETI ; habilitar de nuevo las interrupciones

;timer, interrupciones, UART ; habilitar las interrupciones


sei

Configuracin de dispositivos
A partir de la documentacin del integrado. Configuracin de los registros asociados al dispositivo empleado ATmega8515 ofrece:
EEPROM (memoria perdurable) 512 bytes Ms 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)

Configuracin de dispositivos
ATmega8515 ofrece:
Comparador analgico Watchdog programable
un temporizador programable que resetea el 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 cuntos pulsos de reloj se modifica el valor del contador del temporizador) Usarlo como interrupcin de desbordamiento Contar sucesos a 35 Hz. (un suceso cada 1/35 sg.)

Ejemplo: Timer 0
Definir la interrupcin del Timer 0 (desbordamiento)
rjmp Init reti reti reti reti reti reti rjmp Timer0Over reti reti reti reti reti ; External 0 interrupt Vector ; External 1 interrupt Vector ; Timer 1 Capture Vector ; Timer 1 CompareA Vector ; Timer 1 CompareB Vector ; Timer 1 Overflow Vector ; Timer 0 Overflow Vector ; SPI Vector ; UART Receive Vector ; UDR Empty Vector ; UART Transmit Vector ; Analogue Comparator Vector

15

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 actualizacin 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 preescalado
ldi r16, 0b00000101 out TCCR0, r16

Ejemplo: Timer 0
Poner el contador a 0

Ejemplo: Timer 0
Indicar que se desea emplear esa interrupcin en caso de habilitacin

ldi r16, 0 out TCNT0, r16

16

Ejemplo: Timer 0
Indicar que se desea emplear esa interrupcin en caso de habilitacin
ldi r16, 0b00000010 out TIMSK, r16
o

Ejemplo: Timer 0
Habilitar las interrupciones seleccionadas
sei

Rutina de interrupcin:

Timer0Over: ... reti

17

You might also like