.include "m16def.inc"

.def temp = R16
.equ CLOCK = 3686000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1



.org 0x00
rjmp main

.org 0x0016
rjmp int_rxc


; Hauptprogramm
main:
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp

ldi temp, 0xFF ; Port B = Ausgang
out DDRB, temp
;

; Baudrate einstellen
ldi temp, LOW(UBRRVAL)
out UBRRL, temp
ldi temp, HIGH(UBRRVAL)
out UBRRH, temp

; Frame-Format: 8 Bit
ldi temp, (1<<URSEL)|(3<<UCSZ0)
out UCSRC, temp

sbi UCSRB, RXCIE ; Interrupt bei Empfang
sbi UCSRB, RXEN ; RX (Empfang) aktivieren
sbi UCSRB,TXEN ; TX aktivieren
ldi R17, 0xff
ldi temp , 0xff

sei ; Interrupts global aktivieren

loop:
cpse temp, r17
brne loop1
rjmp loop



rjmp loop ; Endlosschleife

; Interruptroutine: wird ausgeführt sobald ein Byte über das UART empfangen wurde
int_rxc:

in temp, UDR
out PORTb, temp
reti

back:
sbis UCSRA,UDRE ; Warten bis UDR für das nächste
; Byte bereit ist
rjmp back
out UDR, temp
ldi temp, 0xff
rjmp loop ; zurück zum Hauptprogramm


loop1: ldi r18, 'e'
rcall serout ; Unterprogramm aufrufen
ldi r18, 'c'
rcall serout ; Unterprogramm aufrufen
ldi r18, 'h'
rcall serout ; ...
ldi r18, 'o'
rcall serout
ldi r18, ' '
rcall serout
rjmp back