Hallo.

Ich hab jetzt mal versucht, dass er bei "test#" zu "test:" springt. Er gibt aber wenn ich test# eingebe immer nur aus "Ich weiss nicht, was Du von mir willst" anstatt "Das ist ein Test". Hier mal der Code:

Code:
.include "m16def.inc"

;Definition für Clock und Baudrate
.equ CLOCK = 16000000 ; Processortaktfrequenz
.equ BAUD = 9600 ; Serielle Schnittstelle Baudrate
.equ UBRRVAL = CLOCK / (BAUD*16)-1
;Definition für Flagregister und Flaggen
.def Flagregister  = R16 ; Anzeige Flag Register
.def tmp = R17 ;universallregister
.equ zeileempfangen  = 7 ; Eine vollständige Zeile über UART empfangen

;Definition für Zeichen
.equ enter = $0D ; Wagenrücklauf-Zeichen für UART

;Definition für SRAM Puffer
.equ pufferzeiger = $0060 ; UART Rx Pufferzeiger
.equ pufferanfang = $0061 ; UART Rx Pufferanfang
.equ pufferende = $007E ; UART Rx Pufferende


;Interrupt-Vektoren

.org 0x000
   rjmp reset ;reset Vektor
.org URXCaddr
   rjmp empfangen

reset:
   ;Stack
   ldi tmp,HIGH(RAMEND)
   out SPH,tmp
   ldi tmp,LOW(RAMEND)
   out SPL,tmp
   
   ;UART
   ;Baudrate einstellen
   ldi tmp,UBRRVAL
   out UBRRL,tmp
   ;Frameformat 8Bit
   ldi tmp,(1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0)
   out UCSRC,tmp
   ;RX aktivieren
   sbi UCSRB,RXEN
   sbi UCSRB,RXCIE
   ;TX aktivieren
   sbi UCSRB,TXEN
   sei

loop: ;Hauptschleife
   tst Flagregister    ;Irgendeine Flagge gesetzt?
   breq loop      ;wenn nein langweilen
   ldi tmp,LOW(loop) ; Schleifenanfang als Rücksprungadresse auf den Stapel
   push tmp
   ldi tmp,HIGH(loop)
   push tmp
   sbrs Flagregister,zeileempfangen   ;teste, ob eine Zeile Komplet ist
   ret      ;wenn nein langweilen

befehlauswerten:
   ldi tmp,LOW(UartRxRet) ; Rueckkehradresse UartRxRet auf Stapel
   push tmp
   ldi tmp,HIGH(UartRxRet)
   push tmp
   ldi ZH,HIGH(2 * Cmds) ; Z zeigt auf Befehlsliste
   ldi ZL,LOW(2 * Cmds)
befehlauswerten1:
   lpm   ;Hole Zeichen
   mov tmp,R0
   cpi tmp,0xFF ; 0xFF signalisiert das ende der Befehlsliste   
   brne befehlauswerten3
befehlauswerten2: ;Ende der liste, unbekannter Befehl
   ldi ZH,HIGH(2 * kennenicht)   ;Sende Fehlermeldung
   ldi ZL,LOW(2 * kennenicht)
   rjmp UARTSend
befehlauswerten3:   ;hier fangen wir an zu vergleichen
   ldi XH,HIGH(pufferanfang)   ;X auf empfangene Zeile
   ldi XL,LOW(pufferanfang)
befehlauswerten4:
   lds tmp,pufferzeiger;Pufferzeiger lesen
   cp XL,tmp   ;Ende des Puffers erreicht?
   brcs befehlauswerten7   ;nein weiter
befehlauswerten5:
   lpm   ;lese nächstes Befehlszeichen   
   adiw ZL,1 ;Z auf nächstes zeichen
   mov tmp,R0
   cpi tmp,'#'   ;Endzeichen erreicht?
   brne befehlauswerten5
befehlauswerten6:
   adiw ZL,3   ;Springe über die Adressen   
   rjmp befehlauswerten1   ;nächster Befehl
befehlauswerten7:
   lpm
   mov tmp,R0
   cpi tmp,'#' ;Ende des Befehls?
   breq befehlauswerten8
   ld tmp,X+   ;lese nächstes Zeichen aus Puffer
   cp tmp,R0   ;Vergleiche
   brne befehlauswerten5
   adiw ZL,1   ;nächstes Zeichen
   rjmp befehlauswerten4
befehlauswerten8:
   lds tmp,pufferzeiger ;ende des Puffers erreicht?
   cpc XL,tmp
   brcc befehlauswerten2
   adiw ZL,1
   lpm
   push R0
   adiw ZL,1
   lpm
   push R0
   ret

UartSend:
   lpm;lese aus dem Flash
   adiw ZL,1
   tst R0
   brne UartSendR0
   ret
UartSendR0:
   mov tmp,R0
   rcall UARTSendChar
   rjmp UartSend
UartSendChar:
   sbis UCSRA,UDRE
   rjmp UartSendChar
   out UDR,tmp
   ret

UartRXret:
   ldi tmp,LOW(pufferanfang)
   sts pufferzeiger,tmp
   cbr Flagregister,(1<<zeileempfangen)
   ret
   
help:
   ldi ZH,HIGH(2*UartTxtHelp) ; Hilfetext
   ldi ZL,LOW(2*UartTxtHelp)
   rjmp UartSend   

test:
   ldi ZH,HIGH(2*test_txt) ; Hilfetext
   ldi ZL,LOW(2*test_txt)
   rjmp UartSend  

empfangen:
   push tmp   ;rette universallregister
   in tmp,SREG   ;rette SREG
   push tmp
   in tmp,UDR   ;Hole das empfangene Zeichen
   out UDR,tmp   ;Echo zurück
   push ZH      ;sichere Z-Register
   push ZL   ;dito
   ldi ZH,HIGH(pufferanfang) ;position fürs nächste Zeichen MSB
   lds ZL,pufferzeiger
   st Z+,tmp   ;Speichere Zeichen im sram
   cpi ZL,LOW(pufferende+1)   ;Pufferende erreicht ?
   brcc empfangen_      ;Pufferüberlauf
   sts pufferzeiger,ZL   ;speichere nächste Pufferposition
empfangen_:
   cpi tmp,enter      ;Wagenrücklauf?
   brne empfangen__
   sbr Flagregister,(1<<zeileempfangen)
empfangen__:
   pop ZL   ;Stelle Z-Register wieder her
   pop ZH   ;dito
   pop tmp   ;Stelle SREG wieder her
   out SREG,tmp   ;dito
   pop tmp      ;stelle tmp wieder her
   reti      ;verlasse Routine und schalte Interrupts wieder ein
   

         ;Hier fangen die Befehle an:
                        ;alle Befehle müssen mit # terminiert werden
Cmds:
.db "hilfe#"
.dw help
.db "test#"
.dw test
         ;0xFFFF muß zum schluß stehen, um ende der liste zu erkennen
.dw 0xFFFF


;Ende der Befehldefinition

;Texte
UartTxtHelp:
.db "Das ist ein Hilfe Text ",0x0D,0x0A,0x00
test_txt:
.db "Das ist ein Test",0x0D,0x0A,0x00
kennenicht:
.db "Ich weiss nicht, was Du von mir willst",0x0D,0x0A,0x00
MfG
Christian