PDF de programación - Programación en ensamblador y en algo nivel (C)

Imágen de pdf Programación en ensamblador y en algo nivel (C)

Programación en ensamblador y en algo nivel (C)gráfica de visualizaciones

Publicado el 2 de Agosto del 2017
768 visualizaciones desde el 2 de Agosto del 2017
103,1 KB
18 paginas
Creado hace 8a (03/10/2012)
Programación en

ensamblador y en alto nivel

(C)

Taller de Microcontroladores

año 2012

Optativa de grado y
Curso de Posgrado

El ISA del AVR

Preliminares
Preliminares…………
Preliminares
Preliminares

• 32 registros de 8 bits: R0 a R31
• Los registros pueden ser usados por su nombre genérico (Rx) o

renombrados mediante una directiva .def

.def registroTemporal = r16

• Las instrucciones son –en general- de 16 bits, con cero, uno o dos

operandos

• para instrucciones diádicas, el resultado es el primer operando

Add r5, r4

; r5 = r5 + r4

• en las instrucciones con operandos inmediatos el destino sólo puede

ser un registro del segundo grupo (r16..r31)

Addi r5, 4

; INVALIDO!!!
INVALIDO!!!
INVALIDO!!!
INVALIDO!!!

Addi r20, 4

; VALIDO!!!
VALIDO!!!
VALIDO!!!
VALIDO!!!

El ISA del AVR

• Los pares de registros r26:r27, r28:r29 y r30:r31 actúan como los

registros de 16 bits X, Y y Z respectivamente.

• X, Y y Z se usan para acceder a la SRAM y Z para acceso a la memoria

de programa

• Las partes alta y baja de los registros indice (X, Y y Z) se acceden como

XH, XL; YH, YL y ZH, ZL respectivamente.

• Los puertos (A, B, C y D) tienen siempre una dirección fija independien-

temente del modelo de procesador.

• La SRAM no se accede directamente por al ALU de la CPU.
• El acceso a la SRAM se realiza a través de dos instrucciones específicas:

STS y LDS.

STS 0x0060, r1
LDS r1, 0x0060

; M[0x0060] = r1
; r1 = M[0x0060]

• El AVR soporta pila de hardware apuntada por un registro de 16 bits

SPH:SPL.

El ISA del AVR

• La pila crece hacia zonas bajas de memoria.
• La variable (de ensamblador) RAMEND aporta el valor de la dirección

mas alta de la memoria SRAM (la cual debe ser cargada en el SP)

Ldi r16, HIGH(RAMEND)
Out SPH, r16
Ldi r16, LOW(RAMEND)
Out SPL, r16

• Las instrucciones PUSH y POP escriben y leen directamente de la pila

El ISA del AVR

Diseño optimizado para ejecución eficiente de código C.
Las estructuras mas frecuentes de C se ensamblan en pocas (1, 2 ó 3)
instrucciones del procesador.

Aritméticas y lógicas

Salto

Grupos de
instrucciones

Transferencia de datos

Bit y bit-test

Control de CPU

Instrucciones aritmético-lógicas

Add

rd, rs

; rd = rd + rs

Adiw rdl, W ; rdh:rdl = rdh:rdl + W

Inc

rd

; rd = rd + 1

Mul

rd, rs

; R1:R0 = rd * rs

Fmul

rd, rs

; R1:R0 = (rd * rs) << 1

Mulsu rd, rs

; R1:R0 = rd * rs

rd

; rd = rd • rd

Tst

…..

Instrucciones de salto

Rjmp

k

; PC = PC + k + 1

Ijmp

; PC = PC + Z

Jmp

k

; PC = k

Cpse

rd, rs

; if (rd==rs) PC = PC + (2 else 3)

Sbrc

rs, b

; if (rs(b)==0) PC = PC + (2 else 3)

Sbrs

rs, b

; if (rs(b)==1) PC = PC + (2 else 3)

k

k

Breq

Call

Ret

; if (Z==1) PC = PC + k + 1

; push PC , PC = k

; pop PC

Instrucciones de transferencia de datos
Mov

; rd = rs

rd, rs

Movw rd, rs

; rd+1:rd = rs+1:rs

Ldi

Ld

Ld

Ld

Ldd

Lds

Lpm

rd, k

; rd = k

rd, X

; rd = (X)

rd, X+ ; rd = (X) , X = X + 1

rd, -X ; X = X – 1 , rd = (X)

rd, Y+q ; rd = (Y+q)

rd, k

; rd = (k)

; R0 = (Z)

Lpm rd, Z

; rd = (Z)

Spm

; (Z) = R1:R0

Spm k, rs

; (Z) = rs+1:rs

; St

; St

; St

X, rs

X+, rs

-X, rs

; Std

Y+q, rs

; Sts

k, rs

In

rd, P

; rd = P

; Out

P, rs

Tratamiento de bits

Sbi

P, b

; IO(P,b) = 1

; Cbi

P, b

Bset

s

; SREG(s) = 1

; Bclr

s

Bst

rd, b

; T = rd(b)

; Bld

rd, s

; C = 1

; I = 1

rd

; rd(n+1) = rd(n) , rd(0) = 0

; T = 0

; Clc

; Cli

; Set

Sec

Sei

Lsl

Clt

….

Control del procesador

Nop

Sleep

Wdr

; no operation

; sleep processor

; watch dog reset

Estructura de un programa en
ensamblador

Posee los siguientes elementos:

• Archivos a incluir (.include)

.include "8515def.inc“
.include “Uart.asm”

; Incluye el archivo completo en

este punto del archivo actual

• Reserva de espacio de memoria (.DB)

.DB 123,56,34,1
.DB “Esto es un texto”
.DW 13454

; lista de 4 bytes
; lista de bytes, cadena de caracteres.
; una palabra

• Definición de símbolos (.def)

.def registroTemporal=r16
ldi registroTemporal, 150

Estructura de un programa en
ensamblador

• Definición de constantes (.EQU)

.EQU bitCambiado = 5
sbi PortB, bitCambiado
cbi PortB, bitCambiado

• Modificación de dirección por defecto (.org)

.org 0x0000

rjmp reset

.org 0x0016

ldi r1, 54

.org 0x0010

.DB 1,2,3,4,5,6

Estructura de un programa en
ensamblador

• Inicio de código ejecutable (.CODE)

• Asignación a memoria SRAM (.DSEG)

• Definición de sección de eeprom (.ESEG)

• Definición de macros (.MACRO)

.MACRO Delay

nop
nop
nop
.ENDMACRO

Programando en C…

Hints importantes en un código C:

• Archivos include importantes:

#include <avr/io.h>

; Definiciones de IO específicas para el

dispositivo en uso

El archivo incluye:

• avr\common.h

; descripción de registros comunes a

todos los AVR

; definición de registros especiales

• avr\sfr_defs.h
• avr\portpins.h
• avr\version.h

Programando en C…

Hints importantes en un código C:

• La rutina principal

//Función principal
int main(void)
{

//Declaración e inicializaciones

//Ciclo infinito
while(1){
//Código del programa prinicpal

}

}

e l



y
y
c i o
c i o

o
o
p
p

s
s

e
e

n
n

i n i c i a li z
i n i c i a li z
i n
i n

e
e

t
t

u
u

r
r

r
r

á
á

o
o

c
c
A
A
t i v
t i v

c
c

a
a

i z a

s e

r e a l
s e h a c e p o o l

i v o s

t

t o
i n i
i n f
d i s p o s i



p r o g r a m a y / o
E n e l

c i c l o
l o s

a

i n g

NOTAR QUE:

Un programa C siempre arranca ejecutando la rutina main
Un programa en assembler siempre arranca ejecutando
la interrupción 0 [Reset]

Programando en C…

La rutina principal

.include "m8def.inc"

#include <avr\io.h>
#include <util\delay.h>

int main(void) {

//Puerto D como salida

DDRD = 0xFF;

while (1){

_delay_ms(150);

portD(0xE4);
portD(0xE8);
portD(0xD8);
portD(0xD4);

}

}

.org

.def
.def
.def
.def

0x0000
rjmp

RESET

Temp1 = r16
Temp2 = r17
Temp3 = r18
Step = r20

;Reset Handle

; genera un delay de 256*256 unidades de tiempo
Delay:
Loop1:

Temp2
Loop1End
Loop2
Temp1
Loop1End
Loop1

Temp1, low(RAMEND)
SPL, Temp1
Temp1, high(RAMEND)
SPH, Temp1
Temp1, 0xff
DDRD, Temp1
Temp1, 0

ldi
Loop2:

Temp2,0
inc
breq
rjmp

Loop1End: inc

breq
rjmp

Loop1End: ret
ldi
out
ldi
out
ldi
out
ldi
ldi Temp3, 55

RESET:

Loop0:

Programando en C…

Las interrupciones…

#include <avr/io.h>
#include <avr/interrupt.h>

unsigned int incomingByte = 0x00;

#define CALC_BAUDRATE(baudrate) F_CPU/16/((baudrate)-1)
#define USART_BAUDRATE 51

void USART_Init(){

//Set baud rate
UBRRL=(unsigned char)USART_BAUDRATE;
UBRRH=(unsigned char)(USART_BAUDRATE>>8); //high byte
//Data format: asynchronous,no parity, 1 stop bit, 8 bit size
UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(0<<UCSZ2)

//low byte

|(1<<UCSZ1)|(1<<UCSZ0);

//Enable Receiver and Interrupt on receive complete
UCSRB=(1<<RXEN)|(1<<RXCIE);

}

Programando en C…

Las interrupciones…

void USART_Tx( unsigned int data ){

/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) ){}
/* Put data into buffer, sends the data */
UDR = data;

}

ISR(USART_RXC_vect) {

incomingByte = UDR;

}

int main(void){

USART_Init();
ENABLE_IRQ;
USART_Tx('O');
USART_Tx('K');
USART_Tx(':');

for(;;){}

}
  • Links de descarga
http://lwp-l.com/pdf6014

Comentarios de: Programación en ensamblador y en algo nivel (C) (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad