Dmx ontvangen (uart) 16F628A

Hallo

+ ook moving head

Ik ben nu bezig met een programma te schrijven in MPLAb voor dmx te ontvangen en zo 4 kanalen te sturen met PWM

Nu heb ik effe al wat rond gekeken op dit form
maar ik kom er niet uit hoe ik die uart kan laten werken

Wat bedoel ik;

dus als deze een break binne krijgt moet hij een fail eror geven en dan moet hij de teller starten

hij is geconfigureert dat hij 9 bits ontvangt 8 data en 1stop bit

hoe kan ik dit schijven dat hij dit uitvoert dit is men code al:

code:


config;
_CP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC  &	_LVP_OFF
_XTOSC=20



;uitgangen 8bits  
#define DLOAD 	PORTB,1	
#define DCLK	PORTB,0

;uitgangen PWM
#define	OUT1	PORTB,2
#define	OUT2	PORTB,3
#define	OUT3	PORTB,4
#define	OUT4	PORTB,5
#define OUT5	PORTB,6
#define	OUT6	PORTB,7
;ingangen dmx 
#define IN1SN	PORTA,2
;ingangen 8 bits
#define DDAT	PORTA,4




			ORG		00h
			goto INIT
ORG 	0x4
movwf	W_save
movf	status,w
movwf	s_save
movf	pclath,w
movwf	p_save
goto	inthandler
;uart instelling
init
	movlw	0x07
	movwf	cmcon
	clrf	porta
	clrf	portb
	
	bsf 	status,rp0

	clrf	trisa
	clrf	trisb
	bsf		trisb,1
	bsf		trisb.4
	
	movlw	0x4
	movwf	spbrg
	bsf		txsta,brgh
	bcf		txsta,sync
	clrf	pie1
	bsf		pie1,rcie
	BCF		STATUS.RPO
	BSF		RCTA,RX9
	movf	rcreg,w
	movf	rcreg,w
	movf	rcreg,w

	bsf 	rcta,cren
	bsf		rcta,spen
	bcf		intcon,peie
	bcf		intcon,gie

	clrf	reg1
	clrf	reg2
	CLRF	REG3
	CLRF	REG4
	clrf	d_addr
	bcf		addr9
	goto	main

main 
	movlw	0xff
	movwf	pwmcounter
	bcf		out1
	bcf		out2
	bcf		out3
	bcf		out4
	call	pwm_cycle
	goto main
;kanaal 1
	movf	reg1,w
	xorwf	pwmcounter,w
	btfsc	status,Z
	bsf		out1
;kanaal2
	movf	reg2,w
	xorwf	pwmcounter,w
	btfsc	status,z
	bsf 	out2
;kanaal3
	movf	reg3,w
	xorwf	pwmcounter,w
	btfsc	status,z
	bsf 	out3
;kanaal4
	movf	reg4,w
	xorwf	pwmcounter,w
	btfsc	status,z
	bsf 	out4

nonkel dw

Documenteer je code eens, ik kan niet eens zien waar je je uart probeert aan te spreken.

Ik zie wel een goto inthandler, maar niet de inthandler zelf.

Zet je code tussen de code tag's dan wordt het ook leesbaarder.

Koop hier uw kristallen bol - in 2008 ga ik m'n projecten afmaken, echt waar ....... nouja in 2009 dan ..... ehh 2010 ....

hoe doe ik dat tussen tags zetten ?

nonkel dw

Op 25 april 2007 21:14:53 schreef nonkel_dw:
hoe doe ik dat tussen tags zetten ?

zie: http://www.circuitsonline.net/forum/faq/2

code:


main 
movlw 0xff
movwf pwmcounter
bcf out1
bcf out2
bcf out3
bcf out4
Shiptronic

Overleden

Op 26 april 2007 07:07:18 schreef nonkel_dw:
[...]
Bedankt

Klopt deze code

en wat moet ik er nog bij aan schrijven
zo danig als er een break en bits binnen komen dat deze gelzen en uitgevoert worden

[edit] "quoten" is gelukt dus de rest van de code hiebij weggehaald dezelfde code stond hier dubbel.is zo een stuk korter met scrollen

[Bericht gewijzigd door Shiptronic op 26 mei 2007 00:50:38 ]

Wie de vraag stelt, zal met het antwoord moeten leren leven.

Op 25 april 2007 21:33:02 schreef shiptronic:
[...]

mischien zo duidelijker , als je quote zet je alles weer recht?

Bedankt

Klopt deze code

en wat moet ik er nog bij aan schrijven
zo danig als er een break en bits binnen komen dat deze gelzen en uitgevoert worden

nonkel dw

Verdiep je in het protocol zou ik zeggen. En aangezien DMX 2 stopbits gebruikt zou ik als ik jou was het aantal databits op 9 zetten +1 stopbit. De laatste van de 9 bits moet je dan handmatig als stopbit checken.

Break handmatig checken denk ik. UART van de PIC heeft (zo uit m'n hoofd) geen ingebouwde break-check.

Verder, zoals EdwinNadorp al zei: commentaar in je code. Begrijp je zelf wat je hebt neergezet zo?

If you want to succeed, double your failure rate.

heeft niemand een voorbeeld code die zeker werkt?

nonkel dw

Blijft een lastig medium, dat internet. Google wist me vrij snel dit te vertellen. Is het DMX to analog voltage project op deze pagina.

If you want to succeed, double your failure rate.

Ik heb er nog wat zitten aan sleutelen
zou dit nu kunnne werken ?

code:


; 6 Kanaals dimmer DMX protocol
; product made By	:	



		LIST P=16f628a
		include <16f628a.inc>
		

config;
_CP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC  &	_LVP_OFF
_XTOSC=20



;uitgangen 8bits  
#define DLOAD 	PORTB,1	
#define DCLK	PORTB,0

;uitgangen PWM
#define	OUT1	PORTB,2
#define	OUT2	PORTB,3
#define	OUT3	PORTB,4
#define	OUT4	PORTB,5
#define OUT5	PORTB,6
#define	OUT6	PORTB,7
;ingangen dmx 
#define IN1SN	PORTA,2
;ingangen 8 bits
#define DDAT	PORTA,4
;define 

#define break	dmx_reg,0
#define startcode	dmx_reg,1
#define	moved		dmx_reg,2
#define	addr9		dmx_reg,3
#define	rc9			dmx_reg,4
#define	UP3			FLAG,0
#define	up2			flag,1
#define	down		flag,2
#define	up			flag,3

#define	data_start	0x35
#define data_end	0x39


;PWM signaal
#define reg1	0x35
#define reg2	0x36
#define	reg3	0x37
#define	reg4	0x38

cblock0x20
		DMX_reg	
		Count
		W_save
		s_save
		p_save
		pwmcounter
		flag
		d_addr
		temp
		r_addr
		offset
		temp2
endc 

			ORG		00h
			goto INIT
ORG 	0x4
movwf	W_save
movf	status,w
movwf	s_save
movf	pclath,w
movwf	p_save
goto	inthandler
;uart instelling
init
	movlw	0x07
	movwf	cmcon
	clrf	porta
	clrf	portb
	
	bsf 	status,rp0

	clrf	trisa
	clrf	trisb
	bsf		trisb,1
	bsf		trisb.4
	
	movlw	0x4
	movwf	spbrg
	bsf		txsta,brgh
	bcf		txsta,sync
	clrf	pie1
	bsf		pie1,rcie
	BCF		STATUS.RPO
	BSF		RCTA,RX9
	movf	rcreg,w
	movf	rcreg,w
	movf	rcreg,w

	bsf 	rcta,cren		;enable recieve
	bsf		rcta,spen		;enable uart
	bcf		intcon,peie		;enable interupts
	bcf		intcon,gie

	clrf	reg1
	clrf	reg2
	CLRF	REG3
	CLRF	REG4
	clrf	d_addr		;set out dmx adress to 0
	bcf		addr9
	goto	main		;goto main programma

main 
	movlw	0xff
	movwf	pwmcounter
	bcf		out1
	bcf		out2
	bcf		out3
	bcf		out4
	call	pwm_cycle
	goto main
;kanaal 1
	movf	reg1,w
	xorwf	pwmcounter,w
	btfsc	status,Z
	bsf		out1
;kanaal2
	movf	reg2,w
	xorwf	pwmcounter,w
	btfsc	status,z
	bsf 	out2
;kanaal3
	movf	reg3,w
	xorwf	pwmcounter,w
	btfsc	status,z
	bsf 	out3
;kanaal4
	movf	reg4,w
	xorwf	pwmcounter,w
	btfsc	status,z
	bsf 	out4
intreturn

movf	p_save,w	;herstellen van p_save & S_save & W_save
movwf	pclath
movf	s_save,w
movwf	status
swapf	w_save,f
swapf	w_save,w

retfie				;eindigen interups

inthandler:

btcf	pir1,rcif	;kijken of wel degelijk een interups binne is ?
goto	intreturn	;zo niet beêindingen

btfsc	rcsta,oerr	; een onvangen geen andere eror (overrun) 
goto	overrun		; ga naar overrun

btfss	rcsta,ferr	; is er een framing error (break)
goto	frame		; ga naar frame

btfss	break		;als dat er niet is dan word er gekeken of er al een break is ontvangen 
goto	ret			;zo niet genereren 

btfss	startcode	;is er een start code ontvangen ?
goto	sc			;is even kijken
goto	channel		;ga naar channel
ret:

movf	rcreg,w		;beeindigen interupt om fouten te voor komen
goto	intreturn	;ga naar intreturn

overrun				;om de overrun eror aan te geven reset uart
						
	bcf		rcsta,spen	
	bsf		rcsta,spen
	movf	rcreg,w
	goto	last

frame:				;eror ontvangen flags worden gereset terug opnieuw

clrf	count
bcf		break
bcf		startcode
bcf		rc9
clrf	r_addr
clrf	offset

btfss	rcsta,rx9d
bsf		break

movf	rcreg,w
goto	intreturn		;ga naar intretturn

sc:					;controlle start code 

movf	rcreg,w
xorlw	0x0
btfsc	status,z
bsf		startcode
goto	intreturn
	
increase:			; +1 ophogen


incf	r_addr
btfsc	status,z
bsf		rc9
return

Channel 
	MOVF		OFFSET,W
	XORLW		0X0
	BTFSS		STATUS,Z
	GOTO		chan

NINTH
	BTFSC		ADDR9
	GOTO		TRUE
	
	BTFSC		RC9
	
	GOTO		CHAN
	CALL		INCREASE
	GOTO		RET

TRUE
	BTFSC		RC9
	GOTO		CHAN
	CALL		INCREASE
	GOTO		RET

CHAN
	INCF		OFFSET
	MOVF		OFFSET,W
 	ADDLW		DATA_START
	MOVWF		FSR

	XORLW		DATA_END ;het adress gelijk aan het andere afress stop er mee
	BTFSC		STATUS,Z
GOTO 			LAST

	MOVF		RCREG,W		;zo niet schrijf data weg
	MOVWF		INDF
	CALL		INCREASE
	goto		intreturn 	;ga naar intreturn
last:
 
bcf		break
bcf		startcode
clrf	offset
goto	intreturn	;go to intreturn


;HEF4014


  DLOAD = 1   "'hier de voorbereiding om de data in het ic op te slaan
  PauseUs 10  '' even wachten
  DCLK = 1      
  PauseUs 10
  DCLK = 0
  PauseUs 10
  DLOAD = 0
  PauseUs 25   'nu is de data in het ic opgeslagen

 ShiftIn DDAT,DCLK,1,[DMXADRS \8]   'hier lees je nu de 8 bits binnen
nonkel dw

nu was het hier even stil

maar toch krijg ik het niet oke voor die code in een te steken
Dit komt jullie mms wel bekent voor Thijs mss zou het wel leuk zijn dat hij er op zou reageren dit is de code rechstreeks uit de topic maar ik krijg 369 warnings

maar ik snap niet goed hoe hij dit klaarspeelt voor alles te ontvangen

kan iemand mss nog een uitleg bij geven dan kan ik er mss wel aan uit

code:


;4 chan DMX, PWM output
;On  RB5, RB6, RB7, RA3
;Thijs Assies

__CONFIG        _CP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC  &	_LVP_OFF
	list    P=16F628A
#INCLUDE <P16F628a.INC>

#DEFINE	OUT1	PORTB,5
#DEFINE	OUT2	PORTB,6
#DEFINE	OUT3	PORTB,7
#DEFINE	OUT4	PORTA,3
#DEFINE	RCLED	PORTB,3			;green led

#DEFINE RX		PORTB,1
#DEFINE ERRLED	PORTB,4			;red led

#DEFINE	BREAK			DMX_reg,0
#DEFINE	STARTCODE		DMX_reg,1
#DEFINE	MOVED			DMX_reg,2
#DEFINE	ADDR9			DMX_reg,3
#DEFINE	RC9				DMX_reg,4

DMX_reg			EQU		020h
Reg1			EQU		021h
Reg2			EQU		022h
Reg3			EQU		023h
Reg4			EQU		024h
W_SAVE			EQU		026h
S_SAVE			EQU		027h
P_SAVE			EQU		028h
pwmcounter		EQU		029h
flag			EQU		02Ah
D_ADDR			EQU		02Bh
temp			EQU		02Ch
R_ADDR			EQU		02Dh
Offset			EQU		02Eh
temp2			EQU		02Fh



	ORG 	00h
	GOTO	INIT			;Initialize PIC

	ORG		04h				;Interrupt vector
	MOVWF 	W_SAVE			;save context,
	MOVF 	STATUS,W		;save  STATUS, PCLATH & W
	MOVWF	S_SAVE
	MOVF 	PCLATH,W
	MOVWF 	P_SAVE	
	GOTO	INTHANDLER


INIT

	MOVLW	0x07			;turn analog comparators off
	MOVWF	CMCON
	CLRF	PORTA
	CLRF	PORTB

	BSF		STATUS,RP0		;Select Bank1	

	CLRF	TRISA			;porta output
	CLRF	TRISB			;portb output
	BSF		TRISB,1			;B1 input (UART Recieve)

	MOVLW   04h
    MOVWF   SPBRG			;Set baud rate
    BSF     TXSTA,BRGH		;high speed
    BCF     TXSTA,SYNC		;Async connection
	CLRF	PIE1			;clear other interrupts
	BSF 	PIE1,RCIE		;Set recieve interrupt
	BCF   	STATUS,RP0		;Return to bank0

    BSF     RCSTA,RX9		;Enable 9bit data

  	MOVF	RCREG,W			;clear RCREG FIFO
    MOVF  	RCREG,W
    MOVF	RCREG,W   

	BSF     RCSTA,CREN		;Enable recieve
    BSF     RCSTA,SPEN		;Enable UART
	BSF 	INTCON,PEIE		;Enable interrupts
	BSF 	INTCON,GIE

	BCF		RCLED			;because RA4 is open drain, set means NOT on
	BCF		ERRLED

	CLRF	Reg1
	CLRF	Reg2
	CLRF	Reg3
	CLRF	Reg4
	CLRF	D_ADDR			;set our dmx adress to 0
	BCF		ADDR9		

	GOTO	MAIN			;Goto	Main Program


MAIN
	BCF		RCLED
	BCF		ERRLED
	MOVLW	0FFh
	MOVWF	pwmcounter
	BCF		OUT1
	BCF		OUT2
	BCF		OUT3
	BCF		OUT4
	CALL	PWM_CYCLE
	
	GOTO	MAIN


PWM_CYCLE
	MOVF	Reg1,W
	XORWF	pwmcounter,W
	BTFSC	STATUS,Z
	BSF		OUT1

	MOVF	Reg2,W
	XORWF	pwmcounter,W
	BTFSC	STATUS,Z
	BSF		OUT2

	MOVF	Reg3,W
	XORWF	pwmcounter,W
	BTFSC	STATUS,Z
	BSF		OUT3

	MOVF	Reg4,W
	XORWF	pwmcounter,W
	BTFSC	STATUS,Z
	BSF		OUT4

	DECFSZ	pwmcounter
	GOTO	PWM_CYCLE
	RETURN



INTRETURN
	MOVF	P_SAVE,W		;restore context
	MOVWF 	PCLATH
	MOVF 	S_SAVE,W
	MOVWF 	STATUS
	SWAPF 	W_SAVE,F
	SWAPF 	W_SAVE,W			
	RETFIE

INTHANDLER
	BTFSS	PIR1,RCIF
	GOTO	INTRETURN

	BTFSC	NO_DMX
	MOVF	RCREG,W

	BTFSC	NO_DMX
	GOTO	INTRETURN

	GOTO	DMX

DMX
	BSF		ERRLED
	BTFSC	RCSTA,OERR
	GOTO	OVERRUN

	BTFSC	RCSTA,FERR		;Check for framing error
	GOTO 	FRAME
	
	BTFSS	BREAK			;check if break has passed
	GOTO	RET	
	
	BTFSS	STARTCODE		;has a startcode passed ?
	GOTO	SC				;yes: go check for valid startcode

	BTFSC	STARTCODE
	GOTO	CHANNEL
	
RET
	MOVF	RCREG,W
	GOTO	INTRETURN

OVERRUN
	BCF		RCSTA,SPEN
	BSF		RCSTA,SPEN
	MOVF	RCREG,W
	BSF		ERRLED
	GOTO	LAST

FRAME
	BCF		BREAK
	BCF		STARTCODE
	BCF		RC9
	CLRF	R_ADDR
	CLRF	Offset
	BTFSS	RCSTA,RX9D
	BSF		BREAK
		
	MOVF	RCREG,W
	GOTO	INTRETURN

SC
	MOVF	RCREG,W
	XORLW	00h
	BTFSC	STATUS,Z
	BSF		STARTCODE
	GOTO	INTRETURN

INCREASE
	INCF	R_ADDR
	BTFSC	STATUS,Z
	BSF		RC9	
	RETURN

CHANNEL

	MOVF	Offset,W
	XORLW	00h			;check if offset != 0
	BTFSS	STATUS,Z
	GOTO	CHAN

	MOVF	R_ADDR,W	;else: check if chans match
	XORWF	D_ADDR,W
	BTFSC	STATUS,Z
	GOTO	NINTH		;if so: check for 9th bit

	CALL	INCREASE
	GOTO	RET		;if not: just return from interrupt

NINTH
	BTFSC	ADDR9
	GOTO	TRUE
	MOVF	RCREG,W
	GOTO	FALSE

TRUE		;our 9th bit is set
	BTFSC	RC9
	GOTO	CHAN
	CALL	INCREASE
	GOTO	RET

FALSE
	BTFSS	RC9
	GOTO	CHAN
	CALL	INCREASE
	GOTO	RET


CHAN
;	BCF		RCLED
	INCF	Offset
	MOVF	Offset,W
	XORLW	01h			;check if count = 0
	BTFSC	STATUS,Z
	GOTO	CHAN1

	MOVF	Offset,W
	XORLW	02h
	BTFSC	STATUS,Z
	GOTO	CHAN2

	MOVF	Offset,W
	XORLW	03h
	BTFSC	STATUS,Z
	GOTO	CHAN3

	MOVF	Offset,W
	XORLW	04h
	BTFSC	STATUS,Z
	GOTO	CHAN4

	MOVF	Offset,W
	XORLW	05h
	BTFSC	STATUS,Z
	GOTO	LAST


CHAN1
	MOVF	RCREG,W
	MOVWF	Reg1
	CALL	INCREASE
	GOTO	INTRETURN
CHAN2
	MOVF	RCREG,W
	MOVWF	Reg2
	CALL	INCREASE
	GOTO	INTRETURN
CHAN3
	MOVF	RCREG,W
	MOVWF	Reg3
	CALL	INCREASE
	GOTO	INTRETURN
CHAN4
	MOVF	RCREG,W
	MOVWF	Reg4
	CALL	INCREASE
	GOTO	INTRETURN



LAST

	BCF		BREAK
	BCF		STARTCODE
	CLRF	Offset
	GOTO	INTRETURN	
	
	END

nonkel dw

Je moet de variable no_dmx declareren boven aan de file dus

code:

#define NO_DMX  DMX_reg,1

Dat laatste stukje weet ik niet zeker maar aangezien het mij logisch lijkt dat er geen DMX (NO_DMX) is als er geen start code (=DMX_reg,1)is lijkt mij dit het meest logische.

Probeer dat eens en dan met die code die je het laatst postte

[edit]

als ik dat doe compiled hij bij mij probleemloos, ik weet alleen niet of het de goede code is natuurlijk

[/edit]

[Bericht gewijzigd door surge_me op 7 mei 2007 22:51:35 ]

ik heb dit er in geplaast maar ik krijg hem toch nog neit tot hex

code:


#define NO_DMX  DMX_reg,1
nonkel dw

Op 8 mei 2007 16:57:14 schreef nonkel_dw:
ik heb dit er in geplaast maar ik krijg hem toch nog neit tot hex

code:


#define NO_DMX  DMX_reg,1

Post je *.lst file anders ff? dan kan ik zien wat er fout gaat.

Dit is wat i er bij mij uit gooit:

code:



:020000040000FA
:020000000A28CC
:08000800A6000308A7000A0886
:10001000A8004E2807309F008501860183168501C0
:100020008601861404309900181518128C018C165C
:10003000831218171A081A081A08181698170B1797
:100040008B1786110612A101A201A301A401AB0125
:10005000A0112A2886110612FF30A9008612061365
:100060008613851134202A282108290603198616AB
:1000700022082906031906172308290603198617DB
:100080002408290603198515A90B34280800280817
:100090008A0027088300A60E260E09008C1E47281A
:1000A000A0181A08A018472855280616981862287C
:1000B00018196728201C6028A01C7028A01879280F
:1000C0001A084728981398171A080616B4282010FB
:1000D000A0102012AD01AE01181C20141A084728E8
:1000E0001A08003A0319A0144728AD0A031920166C
:1000F00008002E08003A031D8F282D082B0603192F
:10010000832875206028A01987281A088B28201AB0
:100110008F2875206028201E8F2875206028AE0A41
:100120002E08013A0319A4282E08023A0319A82818
:100130002E08033A0319AC282E08043A0319B028F4
:100140002E08053A0319B4281A08A100752047287B
:100150001A08A200752047281A08A300752047280E
:100160001A08A400752047282010A010AE014728C7
:02400E00623F0F
:00000001FF

heeft iemand zich nog wat bezig gehouden met dmx

voor ontvanging of zender

of mooi werkende asm's ?

nonkel dw

niemand die hier al veel met geexperimenteert heeft
of thuis een werkende stuuring heeft staan?

die graag wat meer uitleg er zou over geven over het programmma dat in de µc zit

nonkel dw

het schiet niet echt op voor ik iets uit men pic te krijgen dat werkt

nu heb ik een idee
voor de break handmatig te detecteren
liefst een asm code

als ik een break binne krijg dat er dan ledje oplicht
(meer voorlopig nog niet )
iemand idee hoe ?

nonkel dw

heb je al uitgevlooit hoe DMX opgebouwd is ?

IF you can't convince them, then confuse them!

ja

88µs break dan een mab en dan start bit en dan de data bits

maar ik zou al graag handmatig de break detecteren en dit uitlezen met een ledje

mijn idee is als volgt

break handmatig
usart on
alles ontvangen
en dan terug handmatig break detecteren

zou dit lukken?
maar heb niet zo echt een idee hoe die break te kunnen detecteren

dezen kan varieren van 88µs tot 100µs

nonkel dw

tja, probeer of het lukt... stil zitten word je niet veel wijzer van!!!!!

"probeer, ga op je bek, probeer nog een keer met een aanpassing, en vind uit hoe het zit" zo moet het ongeveer gaan.

je theorie in praktijk brengen!!!

IF you can't convince them, then confuse them!

niemand die me zo wat opweg kan zetten :p

nonkel dw

en? Ik kan er niet direct PWM uit halen

[Bericht gewijzigd door surge_me op 28 juni 2007 23:21:39 ]

ik ook niet wat doe ik fout draai op 4mhz

nonkel dw

Op 28 juni 2007 23:22:03 schreef nonkel_dw:
ik ook niet wat doe ik fout draai op 4mhz

Nieuwe camera kopen? ik zie echt niets op die onscherpe fotos