alanmcf
- 1st August 2008, 01:14
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
' 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
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
' 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