Hallo,

um es ein wenig übersichtlicher zu gestalten lager die Programmteile aus die im Moment nicht genutzt werden und binde sie später per Include ein.

So wie cih dich verstehe versuchst du die RS232 bzw die UART zum laufen zu bringen. Im zweiten Post erstes Programm wird nach der Startsequenz ein RCALL LOOP aufegrufen welches aber in dem LOOP mit einem RJMP beendet wird. Erstmal weiter nicht tragisch nur solltest du zu Testzwecken es eher:

Start:
....
RJMP LOOP

oder du schreibst es einfach ganz normal drunter weg

Start:
...
...
...
RJMP LOOP ;oder lääst das nach der Initialisierung in die loop laufen also ohne RJMP

die .org 0x020 kannst du weg lassen wenn du halt fortlaufend arbeitest brauch man nur wenn du mit nem BOOTLOADER arbeiten willst ..... sonst weg damit.. erstmal

loop:
mov data, lsb
sleep
cp data, lsb
breq loop
mov temp1, lsb
rcall seroutdez
rjmp loop



Code:
;;;Kleines Testprogramm
;;Tiny2313 als empfänger
;;Empfängt ein Byte und gibt dieses via usart aus
;;USI als SPI Master
;;interruptausgang von RFM an INT0
;;SPI standartverdrahtung
;;
.list
.include "tn2313def.inc"

.nolist
.equ XTAL=1000000
.equ t5ms = ( XTAL * 5 / 606 ) / 1000

.def temp1=r16
.def temp2=r17
.def temp3=r18
.def data=r19
.def lsb=r21
.def msb=r22
.def datain=r23
.def counter=r20

.equ spiddr=ddrb
.equ spiport=portb
.equ nsel=0

.org 0x0000
rjmp start
.org 0x0001
    rjmp Ext0_int_handle
    reti
    reti
    reti
    reti
.org 0x0006
    rjmp Timer0OFL
    reti
    reti
    reti
    reti

start:
ldi temp1, low(ramend)
out spl, temp1                            ;Stackpointer init

rcall initrs232
rcall hallo
rjmp loop                          ;kannst auch weg lassen

loop:
mov data, lsb
sleep
cp data, lsb
breq loop
mov temp1, lsb
rcall seroutdez
rjmp loop

hallo:
ldi temp1, 'O'
rcall serout
ldi temp1, 'K'
rcall serout
ldi temp1, ' '
rcall serout
ldi temp1, 'R'
rcall serout
ldi temp1, 'S'
rcall serout
ldi temp1, ' '
rcall serout
ldi temp1, '2'
rcall serout
ldi temp1, '3'
rcall serout
ldi temp1, '2'
rcall serout
ret

;******************************************************************
;RS232 Routine
;******************************************************************
initrs232:
.equ takt = 1000000 ; 16/8 MHz Systemtakt
.equ baud =2400    ; Baudrate
.equ ubrr_val = ((takt+baud*8)/(baud*16)-1)    ; clever Runden
.equ baud_real = (takt/(16*(ubrr_val+1)))    ; tatsächliche Baudrate
.equ baud_error = ((baud_real*1000)/baud-1000)    ; Fahler in Promille
;
;
.if ((baud_error> 10) || (baud_error <-10))        ; max +/- 10 Promill Fehler
    .error "Systematischer Fehler der Baudrate größer als 1 Prozent und damit zu hoch!"
.else
    .message "Systematischer Fehler der Baudrate hält sich in Grenzen - OK!"
.endif
rcall serinit
ret

serout:
    sbis ucsra,udre                    ; udre-bit ist gesetzt, wenn der Sendepuffer leer ist
                                    ; UART Data Register Empty
    rjmp serout
    out     udr, temp1                    ; Zeichen senden
    ret                                ; zurück aus der Subroutine

    ; Zeichen über RS232 einlesen
    ; temp1: gibt das Zeichen zurück 
serin:
    sbis ucsra, rxc    
    rjmp serin                        ; wir warten bis ein Byte angekommen ist

    in temp1, udr                    ; Zeichen einlesen
    ;rcall serout                    ; und zurücksenden    
    ret

serinit:
    ; Baudrate für RS232 einstellen
    ldi temp1, high(ubrr_val)        ; zuerst Baudrate Highbyte (davon Lownibble)
    out ubrrh, temp1
    ldi temp1, low(ubrr_val)            ; Lowbyte schreiben und prescaler damit triggern
    out ubrrl, temp1

    ; frameformat setzen
    ldi temp1, (1<<ucsz1) | (1<<ucsz0)    ; ucsz2:0 = 0 1 1 -> 8 Bit Daten, kein Parity, 1 Stopbit
    out ucsrc, temp1

    ; Transmitter einschalten, PortD Bit1 wird überschrieben
    sbi ucsrb, txen                    ; TXE-Bit (3) setzen
    
    ; Receiver einschalten, PortD Bit0 wird überschrieben
    sbi ucsrb, rxen                    ; RXE-Bit (4) setzen
    ;sbi ucsrb, rxcie                ; RXCIE-bit (7) setzen, damit ein irq ausgelöst werden kann, wenn ein Zeichen da ist
    ret



seroutdez:
           push  temp1            ; die Funktion verändert temp1 und temp2,
           push  temp2            ; also sichern wir den Inhalt, um ihn am Ende
                                  ; wieder herstellen zu können

           mov   temp2, temp1     ; das Register temp1 frei machen
                                  ; abzählen wieviele Hunderter
                                  ; in der Zahl enthalten sind
;** Hunderter ** 
           ldi   temp1, '0'-1     ; temp1 mit ASCII '0'-1 vorladen
number_1:
           inc   temp1            ; ASCII erhöhen (somit ist nach dem ersten
                                  ; Durchlauf eine '0' in temp1)
           subi  temp2, 100       ; 100 abziehen
           brcc  number_1     ; ist dadurch kein Unterlauf entstanden?
                                  ; nein, dann zurück zu lcd_number_1
           subi  temp2, -100      ; 100 wieder dazuzählen, da die
                                  ; vorherhgehende Schleife 100 zuviel
                                  ; abgezogen hat
            cpi temp1, 0            ;Führende null weg
            breq number_2
           rcall serout        ; die Hunderterstelle ausgeben

;** Zehner  **
           ldi   temp1, '0'-1     ; temp1 mit ASCII '0'-1 vorladen
number_2:
           inc   temp1            ; ASCII erhöhen (somit ist nach dem ersten
                                  ; Durchlauf eine '0' in temp1)
           subi  temp2, 10        ; 10 abziehen
           brcc  number_2     ; ist dadurch kein Unterlauf enstanden?
                                  ; nein, dann zurück zu lcd_number_2
           subi  temp2, -10       ; 10 wieder dazuzählen, da die
                                  ; vorherhgehende Schleife 10 zuviel
                                  ; abgezogen hat
            cpi temp1, 0            ;Führende null weg
            breq number_3
           rcall serout        ; die Zehnerstelle ausgeben
 
;** Einer **        
number_3:
           ldi   temp1, '0'       ; die Zahl in temp2 ist jetzt im Bereich
           add   temp1, temp2     ; 0 bis 9. Einfach nur den ASCII Code für
           rcall serout         ; '0' dazu addieren und wir erhalten dierekt
                                  ; den ASCII Code für die Ziffer
           pop   temp2            ; den gesicherten Inhalt von temp2 und temp1
           pop   temp1            ; wieder herstellen
           ret                    ; und zurück


int0_init:
        ldi temp1,(1<<ISC01)|(0<<ISC00)
        out mcucr,temp1
        ldi temp1, (1<<INT0)
        out GIMSK,temp1
        ret

inittimer0:
        sbr temp1, TOIE0
        out TIMSK, temp1
        ldi temp1,0b00000111    ;max prescaler...bei 1mhz 255*1024=262144 takte
                                ; was bei 1 mhz 1/4sek ist
        out TCCR0B, temp1
        ret
;****************************************************************
;INTERRUPTHANDLERS
;****************************************************************
Ext0_int_handle:
;;Daten stehen bereit
;;Auslesen
rcall read_byte
reti

Timer0OFL:
inc counter
cpi counter, 229
brne schlafen
cpi counter, 229
breq wach
reti

schlafen:
sleep
ret
wach:
clr counter
ret

.include "stddelay.inc"
mal versucht den Code so zu ändern das der Ablauf einigermaßen erkennbar ist, wann von wo nach wo und zurück gesprungen wird.
Zusätzlich die Hardware geprüft ?? Also damit mein ich hast du mal tiny2313 und PC verbunden zum testen ? TX und RX geprüft ? Nicht das du die beiden 1:1 gesteckt hast richtig ist TX-RX / RX-TX.

geb dir mal den Hinweis hier rauf https://www.roboternetz.de/community...313-Bibliothek