nonkel_dw
nonkel dw
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:
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
EdwinNadorp
Koop hier uw kristallen bol - in 2008 ga ik m'n projecten afmaken, echt waar ....... nouja in 2009 dan ..... ehh 2010 ....
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.
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
main
movlw 0xff
movwf pwmcounter
bcf out1
bcf out2
bcf out3
bcf out4
Op 26 april 2007 07:07:18 schreef nonkel_dw:
[...]
BedanktKlopt 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 ]
nonkel_dw
nonkel dw
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
Jochem
If you want to succeed, double your failure rate.
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?
Jochem
If you want to succeed, double your failure rate.
Blijft een lastig medium, dat internet. Google wist me vrij snel dit te vertellen. Is het DMX to analog voltage project op deze pagina.
nonkel_dw
nonkel dw
Ik heb er nog wat zitten aan sleutelen
zou dit nu kunnne werken ?
; 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
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
;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
Je moet de variable no_dmx declareren boven aan de file dus
#define NO_DMX DMX_reg,1Dat 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 ]
nonkel_dw
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#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:
: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
nonkel_dw
nonkel dw
nonkel_dw
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
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 ?
Jeroen Boere
IF you can't convince them, then confuse them!
nonkel_dw
nonkel dw
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
Jeroen Boere
IF you can't convince them, then confuse them!
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!!!
nonkel_dw
nonkel dw
ik heb net de code aan de gang gekregen
nu krijg ik dit op de uitgangen (pwm uitgang)
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
