(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(;;){} }