Hallo Rolf,
ich habe eine Lösung gefunden.
Das Problem ist das TXC Flag (bei euch heißt das TXready), das in meinem Fall beim Aufruf von Ser_Enable2(false) schon gesetzt ist.
Ser_Enable2(false) schaltet den TXcomplte/ready Interrupt ein. Dieser schlägt dann sofort zu und schaltet den pin aus.
Lösung: Das TXC-Flag zusätzlich in der TXEMPTY Interrupt service routine löschen, nach dem ein Byte in das UART Daten Register geschrieben wurde.
SYSTEM.$INTERRUPT_TXEMPTY1:
PUSH _ACCCLO
PUSH _ACCCHI
PUSH _ACCB
PUSH _ACCA
IN _ACCA, SREG
PUSH _ACCA
IN _ACCA, EIND
PUSH _ACCA
LDS _ACCA, _TXCOUNT2
TST _ACCA
BRNE SYSTEM._L0010
LDS _ACCA, ucsr1b
CBR _ACCA, 20h
STS ucsr1b, _ACCA
RJMP SYSTEM._L0012
SYSTEM._L0010:
LDS _ACCB, _TXOUTP2
CLR _ACCA
LDI _ACCCLO, _TXBUFF2 AND 0FFh
LDI _ACCCHI, _TXBUFF2 SHRB 8
ADD _ACCCLO, _ACCB
ADC _ACCCHI, _ACCA
LD _ACCA, Z
STS UDR1, _ACCA
;patch start
LDS _ACCA, ucsr1a
SBR _ACCA, 40h ;clear TX complete interrupt flag after writing usart data register
STS ucsr1a, _ACCA
;patch end
LDS _ACCA, _TXCOUNT2
DEC _ACCA
STS _TXCOUNT2, _ACCA
BRNE SYSTEM._L0013
LDS _ACCA, ucsr1b
CBR _ACCA, 20h
STS ucsr1b, _ACCA
SYSTEM._L0013:
INC _ACCB
CPI _ACCB, 32
BRNE SYSTEM._L0011
CLR _ACCB
SYSTEM._L0011:
STS _TXOUTP2, _ACCB
SYSTEM._L0012:
POP _ACCA
OUT EIND, _ACCA
POP _ACCA
OUT SREG, _ACCA
POP _ACCA
POP _ACCB
POP _ACCCHI
POP _ACCCLO
RETI
+
ich habe eine Lösung gefunden.
Das Problem ist das TXC Flag (bei euch heißt das TXready), das in meinem Fall beim Aufruf von Ser_Enable2(false) schon gesetzt ist.
Ser_Enable2(false) schaltet den TXcomplte/ready Interrupt ein. Dieser schlägt dann sofort zu und schaltet den pin aus.
Lösung: Das TXC-Flag zusätzlich in der TXEMPTY Interrupt service routine löschen, nach dem ein Byte in das UART Daten Register geschrieben wurde.
Code
SYSTEM.$INTERRUPT_TXEMPTY1:
PUSH _ACCCLO
PUSH _ACCCHI
PUSH _ACCB
PUSH _ACCA
IN _ACCA, SREG
PUSH _ACCA
IN _ACCA, EIND
PUSH _ACCA
LDS _ACCA, _TXCOUNT2
TST _ACCA
BRNE SYSTEM._L0010
LDS _ACCA, ucsr1b
CBR _ACCA, 20h
STS ucsr1b, _ACCA
RJMP SYSTEM._L0012
SYSTEM._L0010:
LDS _ACCB, _TXOUTP2
CLR _ACCA
LDI _ACCCLO, _TXBUFF2 AND 0FFh
LDI _ACCCHI, _TXBUFF2 SHRB 8
ADD _ACCCLO, _ACCB
ADC _ACCCHI, _ACCA
LD _ACCA, Z
STS UDR1, _ACCA
;patch start
LDS _ACCA, ucsr1a
SBR _ACCA, 40h ;clear TX complete interrupt flag after writing usart data register
STS ucsr1a, _ACCA
;patch end
LDS _ACCA, _TXCOUNT2
DEC _ACCA
STS _TXCOUNT2, _ACCA
BRNE SYSTEM._L0013
LDS _ACCA, ucsr1b
CBR _ACCA, 20h
STS ucsr1b, _ACCA
SYSTEM._L0013:
INC _ACCB
CPI _ACCB, 32
BRNE SYSTEM._L0011
CLR _ACCB
SYSTEM._L0011:
STS _TXOUTP2, _ACCB
SYSTEM._L0012:
POP _ACCA
OUT EIND, _ACCA
POP _ACCA
OUT SREG, _ACCA
POP _ACCA
POP _ACCB
POP _ACCCHI
POP _ACCCLO
RETI
+