; Software Uart ; used register ; bitcnt - R17 ; RxByte - R18 ; TxByte - R19 ; temp - R16 ; HP: ; ldi bitcnt , 9 ; Bitcounter = 8 + SB (1) für getchar ; ldi bitcnt , 10 ; Bitcounter = 9 + SB (1) für putchar ;------------------------------------------------ ; getchar ausgelöst durch fallende Interruptflanke getchar: rcall bitDelay ; 0,5 Bit Pause (3) backRx: rcall bitDelay ; (3) rcall bitDelay ; (3) clc ; jetzt löschen wir mal das Carryflag (1) sbic portD , 0 ; Sprung bei PD0 =0 ??? muß es Pin oder Port heißen? ; funktioniert das überhaupt so? sec ; Carry-Flag setzen (1) ueq: dec bitcnt ; bitcnt -1 (1) cpi bitcnt , 0 ; is es schon vorbei? (1) breq stop ; Sprung bei gleich (1/2) ror RxByte ; rechtsschieben über Carry(1) rjmp backRx ; zurück zum nächsten Bit (2) stop: ret ; (4) ;------------------------------------------------ putchar: com TxByte ; TxByte invertieren (1) sec ; Carry setzen (1) stop1: brcc car0 ; Sprung bei Carry = 0 (1/2) cbi portD , 1 ; TxD = 0 (2) rjmp carend ; (2) car0: sbi portD , 1 ; TxD = 1 (2) carend: rcall bitDelay ; (3) rcall bitDelay ; (3) ror TxByte ; (1) dec bitcnt ; (1) cpi bitcnt , 0 ; (1) breq stop1 ; (1/2) ret ; (4) ;------------------------------------------------- bitDelay: ldi temp , 5 ; temp = 5 (1) return: dec temp ; temp-1 (1) cpi temp , 0 ; temp=0? (1) brne return ; Sprung bei ungleich (1/2) ret ; (4)