DMX läuft mit
250000 8n2 ... die 2 Stopbit sind wichtig.
Vom Quarz her hab ich dann 16MHz genommen, 8 gehn aber auch
Bei der Baudrate sind die "runden" Taktraten besser, da weniger
Fehler.
Als zusätzlichen Indikator kann man auch den ersten Frame
noch dazunehmen, der 0 sein sollte.
also Frame Error und nächstes byte ist null, dann Anfang
ist zwar bascom, aber mit dem code hab ich gearbeitet mit dmx
für nen Dimmer:
Code:' ####################################### ' DAS IST DER CODE !!!!!! $regfile = "m8def.dat" $crystal = 16000000 $baud = 250000 Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 2 , Databits = 8 Dim Timeout_counter As Byte , X As Byte , Y As Byte , Z As Byte , Fe_error As Byte Dim Adresse As Byte , Adresse2 As Byte , Pointer As Byte At &H82 Dim Timercounter As Byte , Flag As Byte , Summe_pwm As Word Dim Pwm_werte(5) As Byte Dim Rotation_byte As Byte , Rotation_zaehler As Byte On Urxc Zeichenempfang Enable Urxc Const Pwm_teiler = 255 / 46 Config Int0 = Falling On Int0 Nulldurchgang Enable Int0 Config Timer0 = Timer , Prescale = 64 On Timer0 Timer_irq Const Timervorgabe = 220 Enable Timer0 Enable Interrupts Config Portd.2 = Input Config Portb = Output Config Portc = Input ' interne Pullups an Portc = &HFF 485_rw Alias Portc.6 Config 485_rw = Output 485_rw = 0 Led Alias Portb.0 Adresse = 24 'Adresse = Pinc 'Adresse = Not Adresse 'Adresse = Adresse And &B00111111 'Adresse = Pinc Adresse2 = Adresse Shift Adresse , Left , 2 For Z = 1 To 4 Pwm_werte(z) = 2 Next Rotation_byte = &B10001000 Do If Flag = 1 Then Flag = 0 Y = Pointer Shift Y , Right , 2 If Y = Adresse2 Then Y = Pointer Y = Y And &B00000011 Incr Y Summe_pwm = Summe_pwm + X Pwm_werte(y) = X / Pwm_teiler Pwm_werte(y) = 49 - Pwm_werte(y) End If End If If Summe_pwm = 1020 Then If Rotation_zaehler > 30 Then Rotation_zaehler = 0 Rotate Rotation_byte , Right , 1 End If For Y = 1 To 4 If Rotation_byte.y = 0 Then Pwm_werte(y) = 60 End If Next End If If Timercounter < 48 Then If Pwm_werte(1) <= Timercounter Then Set Portb.1 Else Reset Portb.1 End If If Pwm_werte(2) <= Timercounter Then Set Portb.2 Else Reset Portb.2 End If If Pwm_werte(3) <= Timercounter Then Set Portb.3 Else Reset Portb.3 End If If Pwm_werte(4) <= Timercounter Then Set Portb.4 Else Reset Portb.4 End If End If Waitus 10 Portb = 0 If Timeout_counter > 150 Then For Z = 1 To 4 Pwm_werte(z) = 100 Next Summe_pwm = 0 End If Loop End Zeichenempfang: X = Udr If Fe_error = 1 And X = 0 Then Fe_error = 0 Pointer = 0 Summe_pwm = 0 End If If Ucsra.fe = 1 Then Fe_error = 1 Ucsra.fe = 0 End If Incr Pointer Flag = 1 'Toggle Led Timeout_counter = 0 Return End Nulldurchgang: Timercounter = 0 Incr Timeout_counter Incr Rotation_zaehler Return End Timer_irq: Timer0 = Timervorgabe Incr Timercounter Return End








Zitieren

Lesezeichen