DDRB_o  = 0x4 
PORTB_o = 0x5
DDRD_o  = 0x0a 
PORTD_o = 0x0b

UCSR0A = 0xc0
UCSR0B = 0xc1
UCSR0C = 0xc2
UBRR0L = 0xc4
UBRR0H = 0xc5
UDR0   = 0xc6

.global main
.global __vector_18

/* rutina de transmissió de byte, el valor a transmetre és al registre r16 */
tx:
	lds	r17,UCSR0A  
	sbrs	r17,5
	rjmp	tx 	
	sts	UDR0,r16 
	ret 

/* defineixo la rutina d'interrupció
per recepció de byte a la USART */
__vector_18:
	lds	r16,UDR0 
	call	tx 
	reti

main:
	/* set baud rate a 9600*/
	ldi	r16, 0 
	sts	UBRR0H,r16 
	ldi	r16, 103 
	sts	UBRR0L,r16

	/* set frame format */
	/* tot i que el valor dels registres després d'un reset ja és correcte
	(asíncron, 8 bits de dades, 1 bit de parada, sense paritat,
	velocitat normal, comunicació no multiprocessor)
	assegurem aquesta configuració escrivint el valor als registres*/
	ldi	r16, 0b00100000 
	sts	UCSR0A, r16

	ldi	r16, 0b00000110
	sts	UCSR0C, r16
	
	/* enable rx, tx, amb interrupció de rx */ 
	ldi	r16, 0b10011000 
	sts	UCSR0B,r16 

	/* configuració dels pins */ 
	ldi	r16,0b00000010 
	out	DDRD_o,r16

	/* habilitem interrupcions globals */
	sei

/* el bucle principal no fa res */
loop:
	rjmp	loop
	ret
