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...
GünterCode: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







Zitieren

Lesezeichen