Hallo Bonze,
1.) Welche Baudrate und Taktfrequenz hast du eingestellt?
Es ist zwar wenig wahrscheinlich, aber du benutzt in der Interruptroutine das Empfangsregister (UDR) direkt, ohne es in einer Variablen zwischenzuspeichern. Der AVR hat nur ein 2-Byte Fifo (inklusive UDR) und wenn die Daten zu schnell kommen bzw. deine Verarbeitung zu langsam ist, könntest du Probleme bekommen.
Es liegt an der Art des Aufrufs der Interruptroutine, dass viel Overhead erzeugt wird; z.B. werden ALLE 32 Register gepusht und gepoppt - ich hoffe, auch das Statusregister. Das sind schon mindestens
2*(32+2)*2=136 (siehe unten) Taktzyklen, ohne dass irgendetwas "gemacht wird"!
Wenn dein AVR mit 4 MHz läuft, sind das schon 34 µs. Bei einer Baudrate von 19200 Bits/s kommst du schon fast an eine Bitlänge (52 µs) heran. Wenn du die Standardeinstellungen (8N1) benutzt, hättest du theoretisch noch 9 Bitlängen zur eigentlichen Verarbeitung Zeit.
So wie du das UDR benutzt (und so wie ich es verstanden habe), nützt dir das 2.-Fifo Byte nämlich nichts - durch den Lesezugriff auf UDR wird das Register wieder frei gegeben und das nächste übertragene Byte landet wieder dort.
Auch wenn's nicht so aussieht, so eine Übertragung ist nicht so unkompliziert, wie sie auf den ersten Blick aussieht. Man muss schon einiges an Hintergrundwissen haben - weil man stolpert immer wieder darüber (z.B. wenn du zu dem internen 1 MHz Oszillator wechseln würdest).
Die Pufferung, wie sie dir Markus vorgeschlagen hat, ist mehr als sinnvoll, wenn du auf Hochsprachenebene programmieren willst.
2.) Was hast du gegen Assembler ?
< schau mal hier >
Die Routine funktioniert, ist schnell und du kannst genau sehen, was sie macht. Du könntest sogar die Taktzyklen abzählen oder zumindest recht gut abschätzen (was in einer Hochsprache relativ schlecht geht).
LG
Werner
P.S./EDIT: wenn das übertragene Zeichen direkt im UDR (bzw. dem freien Fifo-Register) zusammengebastelt wird (was ich nicht weiß), dann wäre die Übernahme in einer Variablen sogar zwingend erforderlich
P.P.S. Habe in der Bascom-Hilfe nachgelesen unter PUSHALL: es sind die Register
R0-R5, R7,R10,R11 and R16-R31, also 7 weniger