Programación en ensamblador y en alto nivel Taller de Microcontroladores año 2012 Optativa de grado y Curso de Posgrado
El ISA del AVR 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!!!
Addi r20, 4
; VALIDO!!!
El ISA del AVR • !os pares de registros r2+:r2/, r28:r2 y r30:r31 actan co"o los registros de 1+ bits , y 4 respectiva"ente' • , 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 $, y 4& se acceden co"o , !9 , ! y 4, 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 LDS r1, 0x0060
; M[0x0060] = r1 ; r1 = M[0x0060]
• =l 6@ soporta pila de AardBare apuntada por un registro de 1+ bits 5P:5P!'
El ISA del AVR • !a pila crece Aacia >onas ba7as de "e"oria' • !a variable $de ensa"blador& 6M=; 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<5 y POP escriben y leen directa"ente de la pila
El ISA del AVR ;iseño 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' 6rit"#ticas y l.gicas 5alto Drupos de instrucciones
Trans(erencia de datos it y bit*test
Control de CP<
Instrucciones aritmético-lógicas 6dd
rd, 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''
9 rd E rd F rs
Instrucciones de salto 7"p
H7"p
9 PC E PC F F 1 9 PC E PC F 4
N"p
9 PC E
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&
re
9 i( $4EE1& PC E PC F F 1
Call
9 pusA PC , PC E
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,
9 rd E
!d
rd,
9 rd E $&
!d
9 5t
, rs
rd, F 9 rd E $& , E F 1
9 5t
F, rs
!d
rd, *
9 5t
*, rs
!dd
rd, F 9 rd E $F&
9 5td
F, rs
!ds
rd,
9 5ts
, rs
9 Out
P, rs
!p" !p"
9 E ) 1 , rd E $&
9 rd E $& 9 0 E $4&
rd, 4
5p"
9 rd E $4& 9 $4& E 1:0
5p"
, rs
9 $4& E rsF1:rs
Hn
rd, P
9 rd E P
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
9CE1
9 Clc
5ei
9HE1
9 Cli
!sl Clt L'
rd
9 rd$nF1& E rd$n& , rd$0& E 0 9TE0
9 5et
Control del !rocesador op
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 8Q1Qde('incR 'include R
9 Hncluye el arcAivo co"pleto en este punto del arcAivo actual
• eserva de espacio de "e"oria $';& '; 123,Q+,3,1 '; R=sto es un te%toS ';G 13Q
• ;e(inici.n de s?"bolos $'de( & 'de( registroTe"poralEr1+ ldi registroTe"poral, 1Q0
9 lista de bytes 9 lista de bytes, cadena de caracteres' 9 una palabra
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, Q 'org 0%0010 '; 1,2,3,,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 '=;M6CO
Programando en C" Hints importantes en un código 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 • avrYs(rZde(s'A • avrYportpins'A • avrYversion'A
9 descripci.n de registros co"unes a todos los 6@ 9 de(inici.n de registros especiales
Programando en C" Hints importantes en un código C: • !a rutina principal //Función principal int main(void) { //Declaración e inicializaciones //Ciclo infinito while(1){ //Código del programa prinicpal }
o y n e s > i l i a p c i o c i n i r u 6 c - i n t e r iv o t c a l i> a g a e e r o o l in s o i t a c e p n i ( n l o i o s e A iv o s c i c i t yW e l = n r a " a d i s p o s r o g a l o s p l e
} NOTAR QUE:
Programando en C" !a rutina principal Vinclude KavrYio'AX Vinclude KutilYdelay'AX int "ain$void& ] WWPuerto ; co"o salida ;;; E 0%JJ9 BAile $1&] ZdelayZ"s$1Q0&9 port;$0%=&9 port;$0%=8&9 port;$0%;8&9 port;$0%;&9 ^ ^
'include "8de('inc 'org 'de( 'de( 'de( 'de(
0%0000 r7"p
=5=T
9eset andle
Te"p1 E r1+ Te"p2 E r1/ Te"p3 E r18 5tep E r20
9 genera un delay de 2Q+I2Q+ unidades de tie"po ;elay: !oop1: ldi Te"p2,0 !oop2: inc Te"p2 bre !oop1=nd r7"p !oop2 !oop1=nd: inc Te"p1 bre !oop1=nd r7"p !oop1 !oop1=nd: ret =5=T: ldi Te"p1, loB$6M=;& out 5P!, Te"p1 ldi Te"p1, AigA$6M=;& out 5P, Te"p1 ldi Te"p1, 0%(( out ;;;, Te"p1 ldi Te"p1, 0
Programando en C" !as interrupcionesL #include #include 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<
Programando en C" !as interrupcionesL void USART_Tx( unsigned int data ){ /* Wait for empty transmit buffer */ while ( !( UCSRA & (1<
int main(void){ USART_Init(); ENABLE_IRQ; USART_Tx('O'); USART_Tx('K'); USART_Tx(':'); for(;;){} }