Dmx ontvangen (uart) 16F628A

een ding snap ik nog goed

de interupt routine van de uart

hoe moet ik deze schrijven in asm ?

nonkel dw

je zet de bits van de intterupts goed in de desbetreffende registers, asl er een interupt wordt gegenereerd trapt de software de pic direct naar Org 004h(das de interupt vector), daar zet jij een GOTO commando naar je interuptroutine(ik ga er van uit dat je met je normale programma op 005h begint),
aan het einde van je interuptroutine zet je RETFIE(RETurn From Interupt en de E weet ik niet) en hij gaat weer verder met zijn programma

niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide

oke bedankt voor de uitleg

in de interupt
gewoon waar hij met bezig is weg zetten in een file
dan de file legen van de ontvangst weg zetten in file ,
terug alles laden waar hij mee bezig was
en terug weg programma gaan overlopen

nonkel dw

ik denk dat ik je snap maar zal het nog een keer zeggen hoe ik het interperteer:

je gaat naar de interrupt terwijl er iets(wat dan ook) in Work-register staat je slaat dit op in File1.

dan het Receive-File-register van je usart uitlezen en opslaan in het receive-File1

de RETFIE commando uit laten voeren
en weer File1 uitlezen zodat je verder kan gaan

met die 1 er achter bedoel ik dus door jou aangemaakte F-registers

begrijp ik je zo goed?

dan si mijn antwoord ja zo zou ik het doen

niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide

ik denkdat ik het helemaal snap wat je bedoelt

Ik ga een nieuw stuk ontvangst schrijven
want dit vind ik persies wat te omslagtich
de vorige geposte code

daarom de vraag hoe je juist werkt
bedankt timmie

nonkel dw
niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide

snap nog wel sommige dingen niet van de code voor wat dat ze staan

maar dat is voor later nu eerst de uart :p

nonkel dw

zo men eerste dtik progje als iemand dit eens even wil na kijken :)

code:


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

#DEFINE	OUT1	PORTA,1	;RA0 pin17 
#DEFINE	OUT2	PORTA,2	;RA1 pin18
#DEFINE	OUT3	PORTA,3	;RA2 pin1
#DEFINE	OUT4	PORTA,4	;RA3 pin2


		;de geheugen plaatsen
Reg1	EQU	021h
Reg2	EQU	022h
Reg3	EQU	023h
Reg4	EQU	024h
INT1	EQU	25H
INT2	EQU	26H


ORG	00h

GOTO	INIT	;Initialize PIC

ORG	04h	;START VAN DE INTERUPT
GOTO	INTERUPT





INIT 
movlw	0x07
movwf	CMCON		;zet alles digitaal
CLRF	PORTA		;maak porta laag
CLRF	PORTB		;maak portb laag

BSF		STATUS,RP0	;Select Bank1
MOVLW	B'00000000'	;maak van poort A uitgangen
MOVWF	TRISA		
MOVLW	b'00000010'	;maak van poort B uitgangen met uitzondering de uart ingang pin 7
MOVWF	TRISB

MOVLW	04h			;de waarde is 4 voor het instellen van de snelheid van de uart
MOVWF	SPBRG		;snelheid instellen 250 Kbaut weg zetten van info
BSF		TXSTA,BRGH	;high speed
BCF		TXSTA,SYNC	;Async connection
CLRF	PIE1		;clear other interrupts
BSF		PIE1,RCIE	;Set recieve interrupt (zet de ontvang interupt aan)
BCF		STATUS,RP0	;ga terug naar bank 0
BSF		RCSTA,RX9	;set de 9bit data ontvanging

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



CLRF	Reg1		;alles clearen
CLRF	Reg2
CLRF	Reg3
CLRF	Reg4


CLRF	D_ADDR		;set our dmx adress to 0

goto prog

INTERUPT
MOVWF	INT1		;zet wat er in w staat in de file
START
BTFSC	PIR1,RCIF	; kijk of er een echte interupt is
GOTO	INTERUPT	; zo niet terug naar interupt
START
BTFSS	RCSTA,2	    ;FRAMING ERROR
GOTO	START
BTFSS	RCSTA,0		;kijk of er 9 bit is zo ja 
MOVFW	RCREG		; zet het rcreg in map
MOVWF	REG1
RETFIE

PROG
BTFSS	REG1		; staat er een 1 in het bestand 
GOTO	PROG		; zo niet blijven kijken
BSF		OUT1		;ja zet dan out 1 hoog

GOTO	prog	


END

de fouten komen op BTFSS BTFSC daar geeft mplab fouten op :(

nonkel dw

ja dat klopt BTFSS staat voor Bit Test File Skip if Set en je geeft een compleet register op ipv 1 bit uit dat file dus het moet zo
geld dus ook voor BTFSC dat staat dus voor Bit Test File Skip if Cleared

code:


       btfss reg,1

zet volgende error file hier ook ff neer of in ieder code die juist is geschreven dus geen commando's in de eerste kolom

[Bericht gewijzigd door timmie op 21 juli 2007 17:07:03 (12%)]

niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide

is dit een zinige code zou dit dmx kunnen ontvangen ?

Error[113] C:\PIC\TEST DMX.ASM 70 : Symbol not previously defined (prog)
Error[113] C:\PIC\TEST DMX.ASM 68 : Symbol not previously defined (D_ADDR)
Error[116] C:\PIC\TEST DMX.ASM 77 : Address label duplicated or different in second pass (START)
Error[113] C:\PIC\TEST DMX.ASM 82 : Symbol not previously defined (REG1
Error[113] C:\PIC\TEST DMX.ASM 90 : Symbol not previously defined (prog)
dat zijn de fouten
de fouten zijn eruit heb net de fouten allemaal opgelost

maar dan blijft de vraag of ik daar mee al een test kan doen voor dmx te ontvangen of is dit nog niet oke ?

[Bericht gewijzigd door nonkel_dw op 21 juli 2007 19:13:32 (15%)]

nonkel dw

test het gewoon das de beste manier

niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide

ik heb het net getest het doet niets :(
hebben jullie nog sugesties ?

nonkel dw

ik probeer je code te begrijpen.

code:

INTERUPT
MOVWF   INT1            ;zet wat er in w staat in de file

vlak voor RETFIE zet je INT1 niet terug in W ;had dat niet gemoeten.

code:

START
BTFSC   PIR1,RCIF       ; kijk of er een echte interupt is
GOTO    INTERUPT        ; zo niet terug naar interupt

dit begrijp ik niet. je bent op deze plaats in de code omdat er een interrupt is en dan toch weer check of er echt wel een interrupt is.

code:

START
BTFSS   RCSTA,2     ;FRAMING ERROR

RCSTA ken ik nog niet. heb nu geen tijd datascheet te bekijken.

code:

GOTO    START
BTFSS   RCSTA,0         ;kijk of er 9 bit is zo ja 

het lijkt me dat je hier het eerste bit bekijkt. maar HET 9e bit bekijken?? dat doe je toch met het carrie bit.

code:

MOVFW   RCREG           ; zet het rcreg in map
MOVWF   REG1
RETFIE

misschien heb je hier nix aan. dit is voor mij ook een test of ik dergelijke code begrijp.

punt 1. heb ik geen antwoord op

punt 2. je kijkt of het wel om de door jou bedoelde interrupt gaat

punt 3. dat is een bit ter controle van een frame error(je byte en start stop bits bij elkaar is een frame gaat daarbj iets fout zie je het hieraan)

punt 4. dat komt omdat er bij dmx 2 stopbits worden verzonden dus 1 parity bit en een stopbit

hopelijk kan je zo weer een beetje verder

niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide

ik ben niet mee

kan je geen voorbeeld code schrijven
wat er zou moeten in staan
voor interupt routine

nonkel dw

dat is nu net het probleem ik zit ff zonder ideeën ik zal strx nog ff in de DS duiken voor je als ik heb gegeten

niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide

oke bedankt
is mss niet handig voor verder te zoeken via msn?

nonkel dw

dat is goed ik heb het niet voor nix in men profiel staan;)

niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide

iemand nog ide voor de zien of hij daat werkelijk een interupt genereerd

nonkel dw

ja een icd gebruiken

ja een led aanzetten zodra er een(maakt niet uit welke) interrupt wordt gegenereerd

niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide

waar komt jou dmx vandaan?
krijg je wel een signaal.

mij dmx signaal komt van de velleman kit usb to dmx

nonkel dw

heeft er iemand nog iets meer gevonden voor dmx ontvangen te krijgen ?

Ik ben even ten einde raad :(

nonkel dw

NOG MEER?

Kijk eens hier, een compleet stuk code, vrij recht-toe-recht-aan, die op een kleinigheidje na (beschreven in topic) zou moeten werken.

En anders haal je wat van internet, genoeg kant-en-klare stukken code voor een PIC, waarin je in je diverse DMX-topics overigens ook al op gewezen bent.

If you want to succeed, double your failure rate.

ik heb dit stuk code geschreven voor ontvangen
maar wil niet lukken
het probleem volgens mij is dat de uart niet de juist byts intvangt met data

code:


list	P=16F628A
	#INCLUDE <P16F628a.INC>
	__CONFIG	_CP_ON & _PWRTE_OFF & _WDT_OFF & _HS_OSC  &	_LVP_OFF
	#DEFINE	OUT1	PORTA,0	; PWM UITGANG
	#DEFINE	OUT2	PORTA,2	; KIJKEN VOOR INTERUPT
	#DEFINE	OUT3	PORTB,3	; KIJKEN VOOR RESETTEN VAN INTERUPT	
	#DEFINE	OUT4	PORTB,4	

			;de geheugen plaatsen
Reg1	EQU	021h
Reg2	EQU	022h
Reg3	EQU	023h
Reg4	EQU	024h
INT1	EQU	25H
INT2	EQU	26H
ADRES	EQU	27H
REGIS	EQU	28H
	ORG	00h
	GOTO	INIT	;Initialize PIC

	ORG	04h	;START VAN DE INTERUPT
	GOTO	INTERUPT





INIT movlw	0x07
	movwf	CMCON		;zet alles digitaal
	CLRF	PORTA		;maak porta laag
	CLRF	PORTB		;maak portb laag

	movlw B'00001100'
	movwf CCP1CON

	bsf T2CON, TMR2ON

	movlw	03Fh
	movwf	PR2

	BSF		STATUS,RP0	;Select Bank1
	MOVLW	B'00000000'	;maak van poort A uitgangen
	MOVWF	TRISA		

	MOVLW	b'00000010'	;maak van poort B uitgangen met uitzondering de uart ingang pin 7
	MOVWF	TRISB

	MOVLW	04h			;de waarde is 4 voor het instellen van de snelheid van de uart
	MOVWF	SPBRG		;snelheid instellen 250 Kbaut weg zetten van info

	BSF		TXSTA,BRGH	;high speed
	BCF		TXSTA,SYNC	;Async connection

	CLRF	PIE1		;clear other interrupts

	BSF		PIE1,RCIE	;Set recieve interrupt (zet de ontvang interupt aan)

	BCF		STATUS,RP0	;ga terug naar bank 0

	BSF		RCSTA,RX9	;set de 9bit data ontvanging

	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



	CLRF	Reg1		;alles clearen
	CLRF	Reg2
	CLRF	Reg3
	CLRF	Reg4
    CLRF	REGIS

MOVLW	B'00000100'
MOVWF	ADRES
INCFSZ	ADRES,1
MOVFW	ADRES
MOVWF	REGIS
	goto PROG

INTERUPT MOVWF	INT1
BSF		OUT2		;zet wat er in w staat in de file
DECFSZ	REGIS,1				;ADRES MET 1 VERLAGEN
GOTO	EINDE				;NIET 0 DAN STOPPEN
MOVF	RCREG,W				; ZET RCREG REGISTER IN MAP
MOVWF	Reg1				; ZET ONTVANGEN DATA IN FILE REG1
GOTO	EINDE				; STOPPEN
EINDE
BCF		OUT2
MOVF	INT1,0				; TERUG WETTEN VAN DATA IN W
RETFIE						; EINDE INTERUPT

PROG
	
			

movf	Reg1,0				; ZET ALLES IN PWM
movwf	CCPR1L
goto PROG

RESET
BSF	OUT3
BCF	RCSTA,FERR					; RESET FRAMMING EROR
MOVF	ADRES,W				; RESET TERUG ALLES VOOR NIEUWE CYCLUS
MOVWF	REGIS
BCF		OUT3
GOTO	PROG
	END

Ik denk dat hij verkeerd synchronizeert
en dat hij zo de verkeerde 8 bit telkens binne haalt

ik leg het dmx signaal aan en de pwm let gaat aan
zonder dat ik iets stuur met de dmx tafel alle schuiven staan naar onder

Heeft iemand een idee?
of een fout in deze code gevonden?

nonkel dw