Son teil hab ich mal gebaut mit nem Transistor, der per PWM die Motorleistung regelt und ein Relais mit zwei Umschaltern für die Richtungskontrolle...
Hier is der Asm Code, die Hardware kannste dir ja dann gerade drum rum aufbauen:
---
; DMX PWM Code
;
; Speed: 8Mhz
; Input: DMX 512 TTL Signal (250000 Baud)
; Output: PWM & Direction Signal (TTL)
; Target: AT90S2313
;
; Port B,0-7 -> 9x DIP (1-8)
; Port D,6 -> 9x DIP (0)
;
; Port D,0 (RxD) -> 75176,Y
; Port D,1 (TxD) -> NC
; Port D,2 -> NC
; Port D,3 -> PWM
; Port D,4 -> Direction
; Port D,5 -> DMX OK LED
.include "2313def.inc"
; Definitions
.equ PWM =3 ;PWM Output Pin
.equ DIR =4 ;Direction Select
.equ DMX_OK =5 ;DMX OK LED
.def PWM_IN_H =r4
.def PWM_IN_L =r5
.def PWM_STAT_H =r6
.def PWM_STAT_L =r7
.def SREG_BACK =r8
.def DMX_IND_H =r20
.def DMX_IND_L =r21
.def DMX_STATE =r22
.def DMX_BYTE =r23 ;Wird nur im UART Interrupt verwendet
.def INT_LOAD =r23 ;Wird nur in anderen Interrupts verwendet
.def INT_TEMP =r24 ;Must be r24 because of an adiw Instruction
.def TEMP =r25 ;Must be r25 because of an adiw Instruction
; r26,r27 (X) -> DMX Startadress
; r28,r29 (Y) -> Current DMX Adress
; r30,r31 (Y) -> Temp DMX Adress
.org $0000
;Interrupts
rjmp RESET
reti
reti
reti
reti
reti
reti
rjmp RX_INT
reti
reti
reti
;UART Interrupt
RX_INT: in SREG_BACK,SREG ;Save SREG
in DMX_BYTE,UDR
sbic UCR,1 ;Break?
rjmp NO_BREAK
ldi YL,0x00
ldi YH,0x00
cbr DMX_STATE,1 ;Clr Wait_for_next_Break
sbr DMX_STATE,2 ;Set DMX_STATEwas_in_last_Frame
rjmp ENDE_RX_INT
NO_BREAK: sbrc DMX_STATE,0 ;Is Wait_for_next_Break set?
rjmp ENDE_RX_INT
sbrs DMX_STATE,1 ;No! -> Was there a Break in the last Frame?
rjmp DATA_BYTE_REC
tst DMX_BYTE ;Yes! -> Is DMX_BYTE = 0?
brbc 1,SET_WB_U_EXIT
cbr DMX_STATE,2
ldi DMX_IND_H,0xFF
ldi DMX_IND_L,0xFF
rjmp ENDE_RX_INT
DATA_BYTE_REC: cp YH,XH
brlo INC_Y_U_EXIT
cp YL,XL
brlo INC_Y_U_EXIT
mov ZL,XL
mov ZH,XH
rjmp TEST_X_PLUS_0
TEST_X_PLUS_0: cp YL,ZL
brne TEST_X_PLUS_1
cp YH,ZH
brne TEST_X_PLUS_1
mov r0,DMX_BYTE
rjmp INC_Y_U_EXIT
TEST_X_PLUS_1: adiw r30,0x01
cp YL,ZL
brne TEST_X_PLUS_2
cp YH,ZH
brne TEST_X_PLUS_2
mov r1,DMX_BYTE
rjmp INC_Y_U_EXIT
TEST_X_PLUS_2: adiw r30,0x01
cp YL,ZL
brne SET_WB_U_EXIT
cp YH,ZH
brne SET_WB_U_EXIT
mov r2,DMX_BYTE
rjmp INC_Y_U_EXIT
INC_Y_U_EXIT: adiw r28,0x01
rjmp ENDE_RX_INT
SET_WB_U_EXIT: sbr DMX_STATE,1 ;Set WAIT_FOR_NEXT_BREAK Bit and Exit
ENDE_RX_INT: out SREG,SREG_BACK
reti
;Main Routines:
READ_DMX_START: clr XH
in XL,PINB ;Read DMX Startadress
com XL
lsl XL
rol XH
in TEMP,PIND
com TEMP
andi TEMP,0x40
lsr TEMP
lsr TEMP
lsr TEMP
lsr TEMP
lsr TEMP
lsr TEMP
or XL,TEMP
ret
RESET: ldi TEMP,low(RAMEND) ;Set SP to last Byte in RAM
out SPL,TEMP
;Init Watchdog Timer
ldi TEMP,0x0D ;Enable Watchdog Timer with 0.49s Timeout
out WDTCR,TEMP
;Set TRI-States
ldi TEMP,0x00
out DDRB,TEMP
ldi TEMP,0xFF
out PORTB,TEMP
ldi TEMP,0x38
out DDRD,TEMP
ldi TEMP,0x41
out PORTD,TEMP
;Init Variables
ldi TEMP,0x00 ;Set Channel Registers and Current DMX Adress to 0x00
mov r0,TEMP
mov r1,TEMP
mov r2,TEMP
;Init 16 Bit Timer
ldi TEMP,0x00
out TCNT1H,TEMP ;Set Timer Count Registers (High Register first!)
ldi TEMP,0x00
out TCNT1L,TEMP
ldi TEMP,0x01
out TCCR1B,TEMP ;Enable 16 Bit Timer with full OSC Speed
;Init UART for DMX Data Receive
clr XL ;Clear DMX Start Register
clr XH
ldi DMX_STATE,0x01 ;Init DMX Status Register
out UBRR,DMX_STATE ;Load UART Bautrate Register with 0x01
sbi UCR,7 ;Enable RX Interrupt
sbi UCR,2 ;Enable 9-Bit Mode
sbi UCR,4 ;Enable RX-UART
sei ;Enable Globale Interrupt
MAIN: rcall READ_DMX_START
wdr ;Watchdog Reset
MAIN_PROC: ;Process Data
mov TEMP,r0
cpi TEMP,0x80
brsh MAIN_PROC_DIR2
cbi PORTD,DIR
rjmp MAIN_PROC_END
MAIN_PROC_DIR2: sbi PORTD,DIR
nop
MAIN_PROC_END: mov PWM_IN_H,r1 ;-> 12 Bit Resolution
mov PWM_IN_L,r2
lsr PWM_IN_H
ror PWM_IN_L
lsr PWM_IN_H
ror PWM_IN_L
lsr PWM_IN_H
ror PWM_IN_L
lsr PWM_IN_H
ror PWM_IN_L
MAIN_PWM: ;PWM
ldi TEMP,0x0F ;12 Bit PWM Only
and PWM_IN_H,TEMP
in PWM_STAT_L,TCNT1L ;Get Timer, Low byte first at read
in PWM_STAT_H,TCNT1H
and PWM_STAT_H,TEMP
cp PWM_STAT_L,PWM_IN_L
cpc PWM_STAT_H,PWM_IN_H
brlo MAIN_PWM_OFF
cbi PORTD,PWM
rjmp MAIN_PWM_END
MAIN_PWM_OFF: sbi PORTD,PWM
nop ;Avoid Jitter
MAIN_PWM_END:
MAIN_DMX_IND: ;DMX Indicator Count check
clr TEMP
cp DMX_IND_L,TEMP
cpc DMX_IND_H,TEMP
breq MAIN_DMX_L_OFF
subi DMX_IND_L,0x01
sbci DMX_IND_H,0x00
sbi PORTD,DMX_OK
rjmp MAIN_DMX_END
MAIN_DMX_L_OFF: cbi PORTD,DMX_OK
clr r0
clr r1
clr r2
MAIN_DMX_END:
rjmp MAIN
.exit