$crystal = 16000000 $baud = 115200 Dim Dmxdata(1 To 512) As Byte Dim I As Integer , J As Integer Dim Rxcount As Byte Dim Channel As Integer Dim Value As Byte Dim Zerocount As Byte Dim Tmp As Byte Dim Bytecount As Byte 'Portb.0 ist der DMX Ausgabe Port Config Portb = Output $asm ldi r16, 0xFF Out Ddrb , R16 $end Asm 'Interrupts initialisieren On Urxc Onrxd Enable Urxc Enable Interrupts 'Initialisieren $asm ldi r24,0b00000001 Out Portb , R24 rcall pause574 $end Asm 'Hauptschleife Do $asm ldi r24,0b00000000 'Reset senden Out Portb , R24 rcall pause574 rcall pause574 rcall pause574 $end Asm $asm ldi r24,0b00000001 'Mark senden Out Portb , R24 rcall pause60 rcall pause60 nop nop nop nop $end Asm Disable Interrupts $asm ldi r24,0b00000000 'Startbyte senden Out Portb , R24 rcall pause574 ldi r24,0b00000001 Out Portb , R24 $end Asm Enable Interrupts For I = 1 To 512 Loadadr Dmxdata(i) , Z ld r16,Z Disable Interrupts $asm ldi r17,0 Out Portb , R17 'Das Startbit senden bst r16,0 bld r17,0 rcall pause60 nop Out Portb , R17 'Bit 0 senden bst r16,1 bld r17,0 rcall pause60 nop Out Portb , R17 'Bit 1 senden bst r16,2 bld r17,0 rcall pause60 nop Out Portb , R17 'Bit 2 senden bst r16,3 bld r17,0 rcall pause60 nop Out Portb , R17 'Bit 3 senden bst r16,4 bld r17,0 rcall pause60 nop Out Portb , R17 'Bit 4 senden bst r16,5 bld r17,0 rcall pause60 nop Out Portb , R17 'Bit 5 senden bst r16,6 bld r17,0 rcall pause60 nop Out Portb , R17 'Bit 6 senden bst r16,7 bld r17,0 rcall pause60 nop Out Portb , R17 'Bit 7 senden nop nop rcall pause60 ldi r17,1 Out Portb , R17 'Stopbits & Mark senden $end Asm Enable Interrupts $asm rcall pause60 rcall pause25 $end Asm Next I Loop 'Serieller Datenempfang Onrxd: Tmp = Udr If Tmp = 0 Then Zerocount = Zerocount + 1 End If If Zerocount => 1 Then Bytecount = Bytecount + 1 If Zerocount = 3 Then If Bytecount = 3 Then Print "RESET" Do Channel = Udr Loop Until Channel = 255 Channel = 0 Zerocount = 0 Bytecount = 0 Rxcount = 0 Value = 0 Return End If Else If Bytecount = 3 Then Bytecount = 0 Zerocount = 0 End If If Rxcount = 0 Then Value = Tmp If Value = 0 Then Zerocount = Zerocount + 1 Rxcount = 1 End If If Rxcount = 1 Then Channel = Tmp If Channel = 0 Then Zerocount = Zerocount + 1 Rxcount = 2 End If If Rxcount = 2 Then Channel = Channel * Tmp If Channel = 0 Then Zerocount = Zerocount + 1 Rxcount = 0 Dmxdata(channel) = Value End If End If Return $asm Pause60: ldi r25,0 ldi r27,1 Schleife: add r25,r27 cpi r25,13 brne Schleife ret Pause574: ldi r25,0 ldi r27,1 Schleife2: add r25,r27 cpi r25,141 brne Schleife2 nop nop ret Pause25: ldi r25,0 ldi r27,1 Schleife3: add r25,r27 cpi r25,4 brne Schleife3 nop ret $end Asm