Está en la página 1de 18

Programacin en

ensamblador y en alto nivel


(C)
Taller de Microcontroladores
ao 2012
Optativa de grado y
Curso de Posgrado
El ISA del AVR
Preliminares Preliminares Preliminares Preliminares
32 registros de 8 bits: 0 a 31
!os registros pueden ser usados por su no"bre gen#rico $%& o
reno"brados "ediante una directiva 'de(
.def registroTemporal = r16
!as instrucciones son )en general* de 1+ bits, con cero, uno o dos
operandos
para instrucciones di-dicas, el resultado es el pri"er operando
Add r5, r4 ; r5 = r5 + r4
en las instrucciones con operandos in"ediatos el destino s.lo puede
ser un registro del segundo grupo $r1+''r31&
Addi r5, 4 ; INVALIDO!!! INVALIDO!!! INVALIDO!!! INVALIDO!!!
Addi r20, 4 ; VALIDO!!! VALIDO!!! VALIDO!!! VALIDO!!!
El ISA del AVR
!os pares de registros r2+:r2/, r28:r20 y r30:r31 act1an co"o los
registros de 1+ bits 2, 3 y 4 respectiva"ente'
2, 3 y 4 se usan para acceder a la 56M y 4 para acceso a la "e"oria
de progra"a
!as partes alta y ba7a de los registros indice $2, 3 y 4& se acceden co"o
28, 2!9 38, 3! y 48, 4! respectiva"ente'
!os puertos $6, :, C y ;& tienen sie"pre una direcci.n (i7a independien*
te"ente del "odelo de procesador'
!a 56M no se accede directa"ente por al 6!< de la CP<'
=l acceso a la 56M se reali>a a trav#s de dos instrucciones espec?(icas:
5T5 y !;5'
STS 0x0060, r1 ; M[0x0060] = r1
LDS r1, 0x0060 ; r1 = M[0x0060]
=l 6@ soporta pila de AardBare apuntada por un registro de 1+ bits
5P8:5P!'
El ISA del AVR
!a pila crece Aacia >onas ba7as de "e"oria'
!a variable $de ensa"blador& 6M=C; aporta el valor de la direcci.n
"as alta de la "e"oria 56M $la cual debe ser cargada en el 5P&
Ldi r16, HIGH(RAMEND)
Out SPH, r16
Ldi r16, LOW(RAMEND)
Out SPL, r16
!as instrucciones P<58 y POP escriben y leen directa"ente de la pila
El ISA del AVR
;iseo opti"i>ado para e7ecuci.n e(iciente de c.digo C'
!as estructuras "as (recuentes de C se ensa"blan en pocas $1, 2 . 3&
instrucciones del procesador'
Drupos de
instrucciones
6rit"#ticas y l.gicas
5alto
Trans(erencia de datos
:it y bit*test
Control de CP<
Instrucciones aritmtico-lgicas
6dd rd, rs 9 rd E rd F rs
6diB rdl, G 9 rdA:rdl E rdA:rdl F G
Hnc rd 9 rd E rd F 1
Mul rd, rs 9 1:0 E rd I rs
J"ul rd, rs 9 1:0 E $rd I rs& KK 1
Mulsu rd, rs 9 1:0 E rd I rs
Tst rd 9 rd E rd rd
L''
Instrucciones de salto
7"p M 9 PC E PC F M F 1
H7"p 9 PC E PC F 4
N"p M 9 PC E M
Cpse rd, rs 9 i( $rdEErs& PC E PC F $2 else 3&
5brc rs, b 9 i( $rs$b&EE0& PC E PC F $2 else 3&
5brs rs, b 9 i( $rs$b&EE1& PC E PC F $2 else 3&
:reO M 9 i( $4EE1& PC E PC F M F 1
Call M 9 pusA PC , PC E M
et 9 pop PC
Instrucciones de transferencia de datos
Mov rd, rs 9 rd E rs
MovB rd, rs 9 rdF1:rd E rsF1:rs
!di rd, M 9 rd E M
!d rd, 2 9 rd E $2& 9 5t 2, rs
!d rd, 2F 9 rd E $2& , 2 E 2 F 1 9 5t 2F, rs
!d rd, *2 9 2 E 2 ) 1 , rd E $2& 9 5t *2, rs
!dd rd, 3FO9 rd E $3FO& 9 5td 3FO, rs
!ds rd, M 9 rd E $M& 9 5ts M, rs
!p" 9 0 E $4&
!p" rd, 4 9 rd E $4&
5p" 9 $4& E 1:0
5p" M, rs 9 $4& E rsF1:rs
Hn rd, P 9 rd E P 9 Out P, rs
ratamiento de bits
5bi P, b 9 HO$P,b& E 1 9 Cbi P, b
:set s 9 5=D$s& E 1 9 :clr s
:st rd, b 9 T E rd$b& 9 :ld rd, s
5ec 9 C E 1 9 Clc
5ei 9 H E 1 9 Cli
!sl rd 9 rd$nF1& E rd$n& , rd$0& E 0
Clt 9 T E 0 9 5et
L'
Control del !rocesador
Cop 9 no operation
5leep 9 sleep processor
Gdr 9 BatcA dog reset
Estructura de un !rograma en
ensamblador
Posee los siguientes ele"entos:
6rcAivos a incluir $'include&
'include P8Q1Qde('incR 9 Hncluye el arcAivo co"pleto en
'include R<art'as"S este punto del arcAivo actual
eserva de espacio de "e"oria $';:&
';: 123,Q+,3T,1 9 lista de T bytes
';: R=sto es un te%toS 9 lista de bytes, cadena de caracteres'
';G 13TQT 9 una palabra
;e(inici.n de s?"bolos $'de(&
'de( registroTe"poralEr1+
ldi registroTe"poral, 1Q0
Estructura de un !rograma en
ensamblador
;e(inici.n de constantes $'=U<&
'=U< bitCa"biado E Q
sbi Port:, bitCa"biado
cbi Port:, bitCa"biado
Modi(icaci.n de direcci.n por de(ecto $'org&
'org 0%0000
r7"p reset
'org 0%001+
ldi r1, QT
'org 0%0010
';: 1,2,3,T,Q,+
Estructura de un !rograma en
ensamblador
Hnicio de c.digo e7ecutable $'CO;=&
6signaci.n a "e"oria 56M $';5=D&
;e(inici.n de secci.n de eepro" $'=5=D&
;e(inici.n de "acros $'M6CO&
'M6CO ;elay
nop
nop
nop
'=C;M6CO
Programando en C"
Hints importantes en un cdigo C:
6rcAivos include i"portantes:
Vinclude KavrWio'AX 9 ;e(iniciones de HO espec?(icas para el
dispositivo en uso
=l arcAivo incluye:
avrYco""on'A 9 descripci.n de registros co"unes a
todos los 6@
avrYs(rZde(s'A 9 de(inici.n de registros especiales
avrYportpins'A
avrYversion'A
Programando en C"
Hints importantes en un cdigo C:
!a rutina principal
//Funcin principal
int main(void)
{
//Declaracin e inicializaciones
//Ciclo infinito
while(1){
//Cdigo del programa prinicpal
}
}
6
c
-
i
n
i
c
i
a
l
i
>
o

y

a
c
t
i
v
o

i
n
t
e
r
r
u
p
c
i
o
n
e
s
6
c
-
i
n
i
c
i
a
l
i
>
o

y

a
c
t
i
v
o

i
n
t
e
r
r
u
p
c
i
o
n
e
s
=
n

e
l

c
i
c
l
o

i
n
(
i
n
i
t
o

s
e

r
e
a
l
i
>
a
e
l

p
r
o
g
r
a
"
a

y
W
o

s
e

A
a
c
e

p
o
o
l
i
n
g
a

l
o
s

d
i
s
p
o
s
i
t
i
v
o
s
NOTAR QUE: <n progra"a C sie"pre arranca e7ecutando la rutina "ain
<n progra"a en asse"bler sie"pre arranca e7ecutando
la interrupci.n 0 [eset\
Programando en C"
Vinclude KavrYio'AX
Vinclude KutilYdelay'AX
int "ain$void& ]
WWPuerto ; co"o salida
;;; E 0%JJ9
BAile $1&]
ZdelayZ"s$1Q0&9
port;$0%=T&9
port;$0%=8&9
port;$0%;8&9
port;$0%;T&9
^
^
'include P"8de('incP
'org 0%0000
r7"p =5=T 9eset 8andle
'de( Te"p1 E r1+
'de( Te"p2 E r1/
'de( Te"p3 E r18
'de( 5tep E r20
9 genera un delay de 2Q+I2Q+ unidades de tie"po
;elay:
!oop1: ldi Te"p2,0
!oop2: inc Te"p2
breO !oop1=nd
r7"p !oop2
!oop1=nd: inc Te"p1
breO !oop1=nd
r7"p !oop1
!oop1=nd: ret
=5=T: ldi Te"p1, loB$6M=C;&
out 5P!, Te"p1
ldi Te"p1, AigA$6M=C;&
out 5P8, Te"p1
ldi Te"p1, 0%((
out ;;;, Te"p1
ldi Te"p1, 0
!oop0: ldi Te"p3, QQ
!a rutina principal
Programando en C"
!as interrupcionesL
#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; //low byte
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)
|(1<<UCSZ1)|(1<<UCSZ0);
//Enable Receiver and Interrupt on receive complete
UCSRB=(1<<RXEN)|(1<<RXCIE);
}
Programando en C"
!as interrupcionesL
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(;;){}
}

También podría gustarte