ich weiss leider nicht mehr wo ich den code gefunden habe...
der intressante teil ist in rec_isr...
Code:' "Deklaration" m³sste klar sein $regfile = "m8def.dat" $crystal = 16000000 $baud = 250000 'Baudrate 250Kbaud $framesize = 128 $swstack = 32 $hwstack = 64 Open "Comc.4:9600,8,n,1" For Output As #1 ' ben÷tigete Variablen Dim Dmx_count As Integer 'Pakete die auf Ausgõnge zielen Dim Dmx_count_temp As Byte 'Gesendete Pakete Dim Dmx_byte As Byte 'DMX Wert Dim Dmx_clock As Byte 'Spielerei Dim Dmx_adr As Word 'DMX-Adresse Dim Dmx_adr_temp As Byte 'DMX-Adresse (Temp) Dim Dmx_adr_c As Word 'DMX-Adresse (Counter) Dim Dmx_off As Byte 'DMX-Signal noch da? ' Ports setzen und configurieren Config Portb.0 = Output 'Schaltausgõnge ' Anfangsvariablen Festlegen Dmx_count = 0 'kein Paket empfangen Dmx_clock = 16 ' Dmx_adr = 55 'DMX_Adresse 2 Config Portb.4 = Output Config Portb.3 = Output Config Portb.2 = Output Dim Ledr As Byte Dim Ledg As Byte Dim Ledb As Byte Dim Servo1 As Byte Dim Servo2 As Byte Dim Speed As Byte Dim Strobe As Bit Dim Strobo As Byte Dim Strobo_to As Byte Dim X As Byte Config Timer1 = Pwm , Prescale = 64 , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up Config Timer2 = Pwm , Pwm = On , Compare = Set , Prescale = 1 Wait 1 On Urxc Rec_isr Enable Urxc Enable Interrupts ' ****************************************************************************** ' Hauptschleife ' ****************************************************************************** Do Decr Dmx_off If Dmx_off = 0 Then Set Portb.0 End If X = 23 Disable Interrupts Printbin #1 , 1 ; Servo1 ; Servo2 ; Speed; Enable Interrupts Waitms 50 'Incr Strobo_to 'If Strobo_to >= Strobo Then ' Strobo_to = 0 ' ' Toggle Strobe 'End If 'Toggle Strobe 'If Strobe = 0 Then Pwm1a = Ledr Pwm1b = Ledg Ocr2 = Ledb 'Else ' Pwm1a = 0 ' Pwm1b = 0 ' Ocr2 = 0 'End If 'Incr Strobo_to Loop ' ****************************************************************************** ' Funktion: DMX-Signal emfangen und auswerten ' Dieser Interupt wird beim eintreffen von seriellen Daten ausgef³hrt Rec_isr: $asm 'Programmteil f³r das Auswerten der .def Uart_status = R16 'emfangenen Daten .def Uart_byte = R17 .def Uart_temp1 = R18 IN Uart_status,USR IN Uart_byte,UDR SBRC Uart_status,FE 'Auswertung ob Datenbyte OK RJMP Asm_reset 'bei ³berlõnge des Datenbyte = DMX Reset RJMP Asm_Loop1 'Daten OK---> Asm_reset: LDI Uart_temp1,$00 'Adesszõhler zur³cksetzen STS {Dmx_count_temp} , Uart_temp1 'Daten dem Basicvariablen ³bergeben STS {Dmx_byte} , Uart_byte RJMP Asm_exit Asm_loop1: STS {Dmx_byte} , Uart_byte Asm_exit: $end Asm If Dmx_count_temp <> 0 Then 'emfangene Daten im "Dmx_buf" ablegen Incr Dmx_count 'und den jeweiligen Kanal zuordnen If Dmx_adr_c = Dmx_count Then If Dmx_adr_temp < 8 Then Select Case Dmx_adr_temp Case 1: 'Ocr0a = Dmx_byte Case 2: Ledr = Dmx_byte Case 3: Ledg = Dmx_byte Case 4: Ledb = Dmx_byte Case 5: Servo1 = Dmx_byte Case 6: Servo2 = Dmx_byte Case 7: Speed = Dmx_byte End Select Incr Dmx_adr_temp Incr Dmx_adr_c End If End If Else 'bei DMX Reset Variablen setzen Dmx_count = 0 : Dmx_count_temp = 1 Dmx_adr_c = Dmx_adr : Dmx_adr_temp = 1 Decr Dmx_clock 'nur eine Spielerei Toggelt eine LED am PortD.6 beim eintreffen von korrekten DMX Daten If Dmx_clock = 0 Then : Toggle Portb.0 : Dmx_clock = 16 : End If End If Dmx_off = 64 Return







Zitieren
Lesezeichen