Hi--
I'm trying to adapt Microchip's AN1076 appnote on DMX to use as an assembly language subroutine in PBP. I'm using a PIC18F4520, 16MHz resonator, PBP 2.5a. What the code should do is initialize the LCD, read the DMX data stream, and then display the value present on DMX channel 7 on the LCD. I am feeding in a DMX signal, and I've had a PBP-coded subroutine working just fine on my hardware test board, but I need more speed. Both the SetupSerial subroutine and the DMXloop subroutine compile just fine, but when I call the DMXloop subroutine, that's the last I see of my program's execution, nothing else happens. I assume I'm jumping off into oblivion somehow... my understanding of assembly is limited, so I'd appreciate any commentary.
Thanks in advance--
--Alan
Code:' for PIC18F4530 DEFINE OSC 16 INCLUDE "modedefs.bas" include "LCD_defines602.pbp" ' **************************************** ' SETUP ' **************************************** PORTA = %00000000 PORTB = %00000000 PORTC = %00000000 PORTD = %00000000 trisa = %11111101 trisb = %01111111 TRISC = %11101000 trisd = %11001011 ADCON1 = %00001111 'port a is all digital IO CMCON = 7 'and turn off those pesky comparators RBPUx VAR INTCON2.7 'port b pull-ups 1 = disabled 0 = enabled RBPUx = 0 trise.4 =%0 'disable PSP port ' =================================== ' define hardware pins: ' =================================== BKLT var portd.5 'LCD backlight ' ================================ ' define constants & variables: ' ================================ DMXrxbuffer var byte[512] CountH var byte CountL var byte count0 var byte ' **************************************** ' INITIALIZATION ' **************************************** init: call SetupSerial 'set up USART and clear DMXrxbuffer ' **************************************** ' MAIN LOOP ' **************************************** begin: low bklt 'turn on backlight pause 125 'pause to let LCD initialize lcdout $fe,1 'clear screen LCDout " test routine " 'display splashscreen lcdout $fe,$c0,"S/W Version 6xxx" pause 1200 low bklt mainloop: Call DMXloop lcdout $fe,1 pause 3 lcdout dec DMXrxbuffer[7] pause 300 goto mainloop asm _DMXloop ; first loop, synchronizing with the transmitter _WaitBreak btfsc PIR1,RCIF ; if a byte is received correctly movf RCREG,W ; discard it btfss RCSTA,FERR ; else bra _WaitBreak ; continue waiting until a frame error is detected movf RCREG,W ; read the Receive buffer to clear the error condition ; second loop, waiting for the START code _WaitForStart btfss PIR1,RCIF ; wait until a byte is correctly received bra _WaitForStart btfsc RCSTA,FERR bra _WaitForStart movf RCREG,W ; check for the START code value, if it is not 0, ignore the rest of the frame andlw 0xff bnz _DMXloop ; ignore the rest of the frame if not zero ; init receive counter and buffer pointer clrf _CountL clrf _CountH lfsr 0,_DMXrxbuffer ; third loop, receiving 512 bytes of data _WaitForData btfsc RCSTA,FERR ; if a new framing error is detected (error or short frame) bra _RXend ; the rest of the frame is ignored and a new synchronization ; is attempted btfss PIR1,RCIF ; wait until a byte is correctly received bra _WaitForData ; movf RCREG,W ; _MoveData movwf POSTINC0 ; move the received data to the buffer ; (auto-incrementing pointer) incf _CountL,F ; increment 16-bit counter btfss STATUS,C bra _WaitForData incf _CountH,F btfss _CountH,1 ; check if 512 bytes of data received bra _WaitForData _RXend return ;**************************************************************** ; Setup Serial port and buffers _SetupSerial ;Clear the receive buffer lfsr 0,_DMXrxbuffer _CBloop clrf POSTINC0 ; clear INDF register then increment pointer incf _CountL,F btfss STATUS,C bra _CBloop incf _CountH,F btfss _CountH,1 bra _CBloop ; Setup EUSART bsf TRISC,7 ; allow the EUSART RX to control pin RC7 bsf TRISC,6 ; allow the EUSART TX to control pin RC6 movlw 0x04 ; Disable transmission movwf TXSTA ; enable transmission and CLEAR high baud rate movlw 0x90 movwf RCSTA ; enable serial port and reception bsf BAUDCON,BRG16 ; Enable UART for 16-bit Asyn operation clrf SPBRGH movlw .15 ; Baud rate is 250KHz for 16MHz Osc. freq. movwf SPBRG return endasm


 
		
		 
						
					 
			 
			 
			 
					
					 Using an Assmbly Routine in PBP
 Using an Assmbly Routine in PBP
		

 Originally Posted by alanmcf
 Originally Posted by alanmcf
					
 
 
		

Bookmarks