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
Lesezeichen