ich habs nur kurz überflogen, aber folgende Fehler fallen mir auf:
==========
.ORG 0x0000
RJMP START
.org INT0addr
RJMP ISERVE
START:
damit löst jeder Interrupt größer als INT0addr einen Sprung irgendwo
nach start aus, sicherer wäre: (statt den .. die entsprechende Anzahl
von Int-Vektoren vom 1200
.org 0x00
rjmp START
reti
reti
..
rjmp ISERVE
..
reti
START:
==========
ISERVE
clt sollte vermutlich cli lauten, ist aber unnötig, wird duch den
Sprung zum int-Vektor vom uP erledigt, detto ist sei unnötig das mach
RETI
==========
getchar:
3* bitdelay bedeutet dass du erstmals mittig im 1.Bit abtastest, du
kontrollierst nicht ob überhaubt ein ganzes Startbyte empfangen wurde,
jede Flanke am int0 löst die komplette Empfangsroutine aus.
Kontrolliere nach dem ersten bitDelay ob immer noch der Pegel des
Startbits anliegt, ansonsten Abbruch.
==========
clc
sbic portD, 0
sec
ror rx_byte
dieses Stück darf nicht vom dec vom Counter unterbrochen werden. sbic
testet ob Eingang Null und überspringt gegebenenfalls das Set vom
Carry. Dieses wird mit ror nämlich in den Empfangsbuffer geschoben.
Details zu den Befehlen findet man übrigends in der Dokumentation von
Atmel ;-)
==========
ror rx_byte
muß durch rol ersetzt werden. Seriell wird das Bit7 zuerst übertragen
==========
bitcnt
wird nicht initialisiert, die Empfangsroutine wird zufällig oft
durchlaufen und die eingelesenen Bits haben nichts mehr mit dem
seriellen Signal zu tun
==========
putchar
das ror muß ebenfalls unmittelbar vor der Carry-Abfrage kommen.
ror durch rol ersetzen
bitcnt nicht initialisiert
Der Rest scheint recht stimmig. Verbessere mal die Tx-Routine und
schick ein paar Byte an den PC "Hello world", wenn das klappt
verbessere die Rx-Routine und schick jedes empfangene Byte an den PC
zurück (Echo) und wenn das alles spielt wird das ansteuern der LEDs
auch bald klappen.
grüsse leo9