Documentos de Académico
Documentos de Profesional
Documentos de Cultura
y lenguaje C
El ISA del AVR
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
• 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
Aritméticas y lógicas
Salto
Control de CPU
Instrucciones aritmético-lógicas
Add rd, rs ; rd = rd + rs
Inc rd ; rd = rd + 1
Tst rd ; rd = rd • rd
…..
Instrucciones de salto
Rjmp k ; PC = PC + k + 1
Ijmp ; PC = PC + Z
Jmp k ; PC = k
Breq k ; if (Z==1) PC = PC + k + 1
Call k ; push PC , PC = k
Ret ; pop PC
Instrucciones de transferencia
de datos
Mov rd, rs ; rd = rs
Movw rd, rs ; rd+1:rd = rs+1:rs
Ldi rd, k ; rd = k
Ld rd, X ; rd = (X) ; St X, rs
Ld rd, X+ ; rd = (X) , X = X + 1 ; St X+, rs
Ld rd, -X ; X = X – 1 , rd = (X) ; St -X, rs
Ldd rd, Y+q ; rd = (Y+q) ; Std Y+q, rs
Lds rd, k ; rd = (k) ; Sts k, rs
Lpm ; R0 = (Z)
Lpm rd, Z ; rd = (Z)
Spm ; (Z) = R1:R0
Spm k, rs ; (Z) = rs+1:rs
In rd, P ; rd = P ; Out P, rs
Tratamiento de bits
Sbi P, b ; IO(P,b) = 1 ; Cbi P, b
….
Control del procesador
Nop ; no operation
.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
.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)
.MACRO Delay
nop
nop
nop
.ENDMACRO
Programando en C…
Hints importantes en un código C:
El archivo incluye:
• La rutina principal y
al iz o nes
i io
inic rupc
Acá inter
//Función principal
ct i vo
int main(void) a
{
//Declaración e inicializaciones
eal iz a g
se r o lin
ito ce p o
fin
//Ciclo infinito l o in se ha s
while(1){ e l cic a y/ o ositivo
En ram d isp
//Código del programa prinicpal o g s
} el p
r a lo
}
.org 0x0000
#include <avr\io.h>
rjmp RESET ;Reset Handle
#include <util\delay.h>
.def Temp1 = r16
int main(void) {
.def Temp2 = r17
//Puerto D como salida
.def Temp3 = r18
DDRD = 0xFF;
.def Step = r20
while (1){
; genera un delay de 256*256 unidades de tiempo
_delay_ms(150);
Delay:
Loop1: ldi Temp2,0
portD(0xE4);
Loop2: inc Temp2
portD(0xE8);
breq Loop1End
portD(0xD8);
rjmp Loop2
portD(0xD4);
Loop1End: inc Temp1
breq Loop1End
}
rjmp Loop1
}
Loop1End: ret
RESET: ldi Temp1, low(RAMEND)
out SPL, Temp1
ldi Temp1, high(RAMEND)
out SPH, Temp1
ldi Temp1, 0xff
out DDRD, Temp1
ldi Temp1, 0
Loop0: ldi Temp3, 55
Programando en C…
Las interrupciones…
#include <avr/io.h>
#include <avr/interrupt.h>
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…
Las interrupciones…
ISR(USART_RXC_vect) {
incomingByte = UDR;
}
int main(void){
USART_Init();
ENABLE_IRQ;
USART_Tx('O');
USART_Tx('K');
USART_Tx(':');
for(;;){}
}