Hallo Vitis,
der Sender läuft wieder einwandfrei, der Knackpunkt war, daß ich die Senderoutine nicht in einem Interrupt untergebracht hatte. Dadurch haben meine neuen Gimmecks im Sender (I2C-Display, Inkrementalgeber usw.) mit ihren Interrupts das Protokoll zerschossen.
Anbei die eigentliche Senderoutine. Sie ist für einen 8 MHz-Quarz ausgelegt...
Code:
Ontimer0:
Timer0 = 70
Dmxout = 1
Trigger = 0
$asm
.def Tmp1 = R17 'Marker
.def Tmp2 = R18
ldi Tmp1, $5
Make_loop1:
dec Tmp1
brne Make_loop1
nop
nop
$end Asm
For Kanal = 0 To 512 '8 'Anzahl der Kanäle
Temp = Puffer(kanal) '20
$asm
.def Temp1 = R17
.def Temp2 = R18
.def Txbyte = R19
Putchar:
LDS Txbyte, {Temp} '2
LDI Temp1 , 9 '1
COM Txbyte '1
SEC '1
Putchar0:
BRCC Putchar1 '1 oder 2
nop '1
CBI Portd,Pd7 '2
RJMP putchar2 '2
Putchar1:
SBI Portd,Pd7 '2
NOP '1
nop '1
Putchar2:
LDI Temp2 , $7 '1
Sd_loop0:
DEC Temp2 '1
BRNE Sd_loop0
nop
LSR Txbyte '1
DEC Temp1 '1
BRNE putchar0 '1 oder 2
$end Asm
nop
nop
nop
Dmxout = 1 '2 genauso schnell wie SBI PORTD,PD7 in Assembler
$asm
.def Tmp1 = R17
.def Tmp2 = R18
ldi Tmp1, $1 '1
Make_loop0: '2 Stoppbits
dec Tmp1 '1
brne Make_loop0 '1 oder 2
$end Asm
Next Kanal
Trigger = 1 '10
$asm
.def Tmp1 = R17
.def Tmp2 = R18
ldi Tmp1, $7
Make_loop3: 'zusätzlich für Kanal 512
dec Tmp1
brne Make_loop3
$end Asm
Dmxout = 0
Waitus 88
Dmxout = 1
Return
Günter
Lesezeichen