Hallo Leute,

habe mir ein kleines Programm gestrickt, dass Zeichen aus dem RAM an das Hyperterminal schicken soll. Leider bringe ich meinen Atmel nicht dazu einen Interrupt (UTXCaddr) auszulösen.

Eigentlich habe ich alles gemacht was zu tun ist:
sbi UCSRB,TXCIE ; Interrupt für "senden fertig" aktivieren
sei ; globale Interruptfreigabe
sbi UCSRA,TXC ; Initialisierung des Interrupts

Was habe ich vergessen?

Code:
 .NOLIST                    	; List-Output unterdrücken
 .INCLUDE <m8def.inc>       	; das gibt es für jeden Controllertyp


 .def temp = R16				; für Interrupt
 .def ZEICHEN = R17
 .equ VARIABLE = 0 				; Beschreibung der Variable


 ;------------------------------------------------------
 ;    Peripherie initialisieren
 ;------------------------------------------------------
.equ F_CPU = 7273800                            ; Systemtakt in Hz
.equ BAUD  = 9600                               ; Baudrate
 
; Berechnungen
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate


 .LIST                      	; List-Output wieder aufdrehen
 .CSEG                      	; was nun folgt, gehört in den FLASH-Speicher


 ;------------------------------------------------------
 ;     Start Adresse 0000 /Interruptvektoren
 ;------------------------------------------------------
 .org 0x000
	rjmp Init			; Interruptvektoren überspringen
 
 .org UTXCaddr			; UART Transmit Complete Interrupt
    rjmp serout 


 ;------------------------------------------------------
 ;     INITIALIZE
 ;------------------------------------------------------
INIT:
;Stack Pointer setzen
  ldi temp,high(RAMEND)
  out SPH,temp
  ldi temp,low(RAMEND)
  out SPL,temp

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

; Frame-Format: 1 Stop-Bits, 8 Bit 
  ldi temp, (1<<URSEL)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)
  out UCSRC, temp
  sbi UCSRB,TXEN               	; Sender aktivieren
  sbi UCSRB,TXCIE				; Interrupt für "senden fertig" aktivieren

  sei							; globale Interruptfreigabe
  sbi UCSRA,TXC    				; Initialisierung des Interrupts
 ;------------------------------------------------------
 ;   HAUPTSCHLEIFE
 ;------------------------------------------------------
Hauptschleife:					


rjmp Hauptschleife


 ;------------------------------------------------------
 ;   Subroutinen / ISRs
 ;------------------------------------------------------

;Auslesen der Zeichen und bereitstellen in ZEICHEN
;Erhöhen des Z-Pointers; bei leerem Zeichen --> Zurücksetzen des Z-Pointers

serout:
   lpm								; Erstes Byte des Strings nach R0 lesen

   mov ZEICHEN,R0
   adiw ZL, 1                       ; Adresse des Z-Pointers um 1 erhöhen
   tst R0							; Inhalt von R0 auf Bull testen

   brbc 1,sprung_b
  	ldi ZL, LOW(Daten*2)			; Adresse des ersten Strings in den
  	ldi ZH, HIGH(Daten*2)			; Z-Pointer laden
   sprung_b:

    out     UDR, ZEICHEN			; Zeichen auf UART ausgeben
reti

 ;------------------------------------------------------
 ;   Datenbereich
 ;------------------------------------------------------
Daten:
           .db 0x12, 0x12
		   .db 0x20, 0x20	
		   .db 0x63, 0x63	
		   .db 0x58, 0x00	

 ;------------------------------------------------------
 ;   ENDE
 ;------------------------------------------------------
 Ende:  
        rjmp Ende