; Programma voor de DMX gestuurde PWM
;
; Geschreven door Jordi Visbeen 2005
;
; ******************************************************
;
; 

DEVICE = 16F628A								   	;Type PIC 16F628A
CONFIG HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF					;Basis configuratie van de FUSES
ALL_DIGITAL TRUE				  		   			;Uitsluitend digitale signalen, dus de AD coverters, comparator enz staan uit.
DECLARE XTAL = 20									;20MHz kristal aansluiten op pootje 15-16 met 2x 20pf naar massa
delayms 20	   									;Stabilisatie

; hieronder de definities van de variabelen:
CLEAR		   			  	  	 				; Wis RAM geheugen aan boord
DIM adresDMX AS BYTE 	  	 							; Het DMX adres
DIM starttijd AS BYTE 									; Variabele gebruikt in de DMX ontvangst routine
DIM data_lengte AS BYTE									; Variabele voor de datalengte van DMX
DIM DMX_buffer1 AS BYTE									; En 3 variabelen om straks de 3 ontvangen bytes van het DMX signaal in te stoppen
DIM DMX_buffer2 AS BYTE
DIM DMX_buffer3 AS BYTE

;hieronder komt de code voor het startadres
adresDMX = 5
PRINT AT 1,1, dec adresDMX	 	 		   				; ff testen op een LCD
;voorlopig staat deze even vast op 5

;*******************************************************

INPUT PORTA.1	 	  	   		   					;Hierop komt de DMX lijn.
SYMBOL DMX = PORTA.1									;porta.1 krijgt de naam DMX




ASM	  										; De DMX ontvangst komt in assembler code te staan, dit omdat timing hier cruciaal is.




loop: 	movlw d'85'									; Vul starttijd met 85, om straks de break af te tellen
		movwf starttijd
	
		btfsc DMX 								; Kijk of de lijn laag is
	  	goto $-1								; als dit zo is, ga verder
		call wachtbreak								; We gaan zoeken naar een break
		
		btfss DMX								; Na een succesvolle break moet er een MAB komen, dus wachten tot de lijn hoog wordt.
		goto $-1
		movlw d'6'
		movwf starttijd								; Als dit zo is ga verder naar MAB_loop
		call MAB_loop	
		
		btfsc DMX								; Na de MAB moet er een startbit komen (laag) wacht hierop
		goto $-1
		movlw d'10'								; vul starttijd met 10 om startbit voorbij te laten gaan. (10 x 2 x 0,2 = 4us)
		movwf starttijd
		decfsz starttijd								
		goto $-1								; als dit zo is, dan zijn we aangeland bij de startcode (8x een 0) gevolgd door 2 stopbits (2x hoog)
		
		call ontvangbyte
																																							

	  	

wachtbreak:
		btfsc DMX								; Kijk of de lijn 85x laag is (85 x 5 x 0,2us = 85us) De break duurt 88us
		goto loop								; Als dit zo is, dan is er sprake van een break
		decfsz starttijd							; Als dit niet zo is, dan waarschijnlijk geen break, dus helemaal terug
		goto wachtbreak
		return					
	  			


MAB_loop:
		btfss DMX								; Kijk of de MAB nog steeds hoog is, zo niet dan is er een error en gaan we helemaal terug
		goto loop	
		decfsz starttijd							; de MAB duurt 8us. zo ja, dan 6x hoog wachten (6 x 5 x 0,2 = 6us) en is er sprake van een MAB
		goto MAB_loop
		return

ontvangbyte:
		nop
		nop
		nop		  		 					; 0,6 us wachten tot het eerste bit goed gedefinieerd is (we zitten 1,4us in de eerste bit).
		movlw d'8'								; Data lengte van 1 byte
		movwf data_lengte							; Plaats in buffer data_lengte
ontvangbyte_next:
		bcf STATUS, C								; Carry op nul
		btfsc DMX								; kijk of DMX laag is
		bsf STATUS, C								; Nee? dan Carry = 1
		rlf DMX_buffer1, 1							; Plaats in DMX_buffer1 (3,0us in elke bit)
		decfsz data_lengte, 1							; Kijk of alle bits binnen zijn
		goto wacht_4us								; wacht 4us tot het volgende bit goed gedefinieerd is
		goto ontvangbyte_next							; Zo ja ga verder
		
		decfsz adresDMX								; verlaag adresDMX met 1, net zolang tot ie 0 is. Als dit zo is, dan hebben we het goede adres te pakken
		goto ontvangbyte							; zo niet, dan gaan we net zolang bytes ontvangen (en weggooien) tot het goede adres binnenkomt


wacht_4us:
		movlw d'7'
		movwf starttijd								; vul starttijd met 7
		decfsz starttijd							; (7 x 2 x 0,2 = 2,8us)
		goto $-1								; de totale lus met aanroep en return duurt nu 4us
		return 


ENDASM

PRINT AT 2,1, dec DMX_buffer1								; print de waarde van kanaal 5 op een lcd, dit is om te testen.
;PWM porta.2,DMX_buffer1,10
;PWM porta.3,DMX_buffer2,10
;PWM porta.4,DMX_buffer3,10

goto loop

END