patgen

Status
Not open for further replies.

ppcv

New Member
Hi

I need to generate the following pattern coding for two different ports(a and b). How do i assign the ports and first it has to generate on portA and with some delay then the next pattern to be generated.
Whatever pattern generated want to look back in the LCD on the PICDEMplus eval board- how i can do this.



LIST p=16F876A ;tell assembler what chip we are using
include "P16F876A.inc" ;include the defaults for the chip
;----------------------
#define CONF1 _CP_OFF & _DEBUG_OFF & _CPD_OFF
#define CONF2 _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC

__CONFIG CONF1 & CONF2

;---------------------
cblock 0x20 ;start of general purpose registers
pulsePolarity ;used to store previous pulse polarity
endc
;-------------------------
;Control line defs
GND equ b'00001010'
POS equ b'00001100'
NEG equ b'00000011'

;---------------------------
org 0x0000 ;org sets the origin, 0x0000 for the 16F876A
;-----------
;this is where the program starts running
movlw 0x07
movwf CMCON ;turn comparators off (make it like a 16F84)

bsf STATUS, RP0 ;select bank 1
movlw b'00000000' ;set PortB all outputs
movwf TRISA
bcf STATUS, RP0 ;select bank 0

main bcf pulsePolarity,0

theWork call pulse ; Positive Pulse

call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero

call sendOne
call sendZero
call sendOne
call sendZero
call sendZero
call sendZero
call sendOne

call sendOne call sendZero
call sendZero
call sendZero
call sendZero
call sendOne
call sendOne

call sendZero
call sendOne
call sendZero
call sendZero
call sendZero
call sendOne
call sendOne

call sendOne
call sendOne
call sendZero
call sendZero
call sendZero
call sendOne
call sendZero

call sendZero
call sendZero
call sendZero
call sendOne
call sendZero
call sendZero

call sendOne call sendOne
call sendOne
call sendOne
call sendOne
call sendZero
call sendZero


call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero

call sendZero call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero



goto theWork

; Idle for 1/10th clock period(10us) ------------------------------------------------
pulseWidthDelay
nop
nop
nop
nop
return

; Idle for one reference clock period(100us) --------------------------------------
groundDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
nop
nop
nop
nop
nop
nop
return

;-------------------------------------------------------
pulse
btfsc pulsePolarity,0
goto posPulse

negPulse bsf pulsePolarity,0
movlw NEG
goto pulseIt

posPulse bcf pulsePolarity,0
movlw POS


pulseIt movwf PORTA
call pulseWidthDelay
movlw GND
movwf PORTA

return

;---------------------------------------------------------
sendZero
call groundDelay
call groundDelay
call pulse
return
;----------------------------------------------------------
sendOne
call groundDelay
call pulse
call groundDelay
call pulse
return
;---------------------------------------------------------
sendSlash
call sendOne ; sending '/' - 1111001(Fh)
call sendOne
call sendOne
call sendOne
call sendZero
call sendZero
call sendOne
return
;--------------------------------------------------------

end
 
I suggest you give more details of what you are trying to do, I can't make any sense of what you are attempting.
 
Hi
I am generating the 0101 pattern using the PIC IC to driver a motor circuit. This i want to cross check in the LCD of the full pattern instead of monitoring in the scope. The same pattern to be generated on the two ports(A,B) also.
can u pl.help me on this.
 
I don't quite understand your 2nd point. But we usually drive motors using PWM. Most PICs should have one or more PWM modules built-in. And you are using 2 ports for driving motors? That's a lot of motors.
 
There's still very little information there, are you trying to feed a stepper motor?, or multiple DC motors?.
 
Hi
Sorry for not giving clear details.
Actually the pattern output will be given to multilple motors in the intial phase of the project - then in the second phase it will be connected to stepper motor.
first i have to generate the pattern on both the port - the portA pattern can be started first then after some time -may be after 5us - the portB pattern to be generated.
Whatever pattern generated - i want to see it in 2x16 character LCD.
How the LCD will take the pattern generation inputs? Is there any conversion to be done ?
help me on the above queries.
 

I still don't understand what you're trying to do, it seems a strange way to try and control motors?.

Whatever pattern generated - i want to see it in 2x16 character LCD.
How the LCD will take the pattern generation inputs? Is there any conversion to be done ?
help me on the above queries.

You need to convert the binary value written to the port to be displayed as binary digits on the LCD, it's easily done with a simple loop, check each bit in turn and display either ASCII '0' or ASCII '1' accordingly.

This code does it.

Code:
_LCD_BIN_DATA
	MOVWF    LCD_DAT1
	MOVLW    8
	MOVWF    LCD_DAT2
LCD_LABEL1
	CLRW
	RLF      LCD_DAT1, F
	BTFSC    STATUS,C
	MOVLW    1
	CALL     _HEX_Table
	CALL     _LCD_CHAR
	DECFSZ   LCD_DAT2,F
	GOTO     LCD_LABEL1
	RETURN

_HEX_Table   addwf    PCL , f
	retlw    0x30
	retlw    0x31
	retlw    0x32
	retlw    0x33
	retlw    0x34
	retlw    0x35
	retlw    0x36
	retlw    0x37
	retlw    0x38
	retlw    0x39
	retlw    0x41
	retlw    0x42
	retlw    0x43
	retlw    0x44
	retlw    0x45
	retlw    0x46
 
Hi
Thanks for the code. But one clarification -in the code call _LCD_CHAR
to be called from where??
also i want to generate the same pattern in portA and portB.

can i modify the code like this:-



LIST p=16F876A ;tell assembler what chip we are using
include "P16F876A.inc" ;include the defaults for the chip
;----------------------
#define CONF1 _CP_OFF & _DEBUG_OFF & _CPD_OFF
#define CONF2 _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC

__CONFIG CONF1 & CONF2

;---------------------
cblock 0x20 ;start of general purpose registers
pulsePolarity ;used to store previous pulse polarity
endc
;-------------------------
;Control line defs
GND equ b'00001010'
POS equ b'00001100'
NEG equ b'00000011'

LCD_DAT1 equ 0x01
LCD_DAT2 equ 0x02

;---------------------------
org 0x0000 ;org sets the origin, 0x0000 for the 16F876A
;-----------
;this is where the program starts running
movlw 0x07
movwf CMCON ;turn comparators off (make it like a 16F876A

bsf STATUS, RP0 ;select bank 1
movlw b'00000000' ;set PortB all outputs
movwf TRISA
bcf STATUS, RP0 ;select bank 0

_LCD_BIN_DATA MOVWF LCD_DAT1
MOVLW 8
MOVWF LCD_DAT2

LCD_LABEL1 CLRW
RLF LCD_DAT1,F
BTFSC STATUS,C
MOVLW 1
call theWork

DECFSZ LCD_DAT2,F
goto LCD_LABEL1


main bcf pulsePolarity,0

theWork call pulse ; Positive Pulse

call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero

call sendOne call sendZero
call sendOne
call sendZero
call sendZero
call sendZero
call sendOne

call sendZero call sendOne
call sendZero
call sendZero
call sendZero
call sendOne
call sendOne

call sendOne call sendZero
call sendOne
call sendZero
call sendOne
call sendZero
call sendZero

call sendZero call sendZero
call sendZero
call sendZero
call sendOne
call sendZero
call sendZero

call sendZero call sendZero
call sendZero
call sendOne
call sendOne
call sendZero
call sendOne

call sendOne call sendZero
call sendZero
call sendZero
call sendOne
call sendZero
call sendOne

call sendOne call sendZero
call sendOne
call sendZero
call sendOne
call sendZero
call sendZero

call sendOne call sendZero
call sendZero
call sendOne
call sendOne
call sendZero
call sendZero

call sendZero call sendZero
call sendZero
call sendOne
call sendOne
call sendZero
call sendOne

call sendZero call sendZero
call sendZero
call sendZero
call sendOne
call sendZero
call sendZero

call sendZero call sendZero
call sendOne
call sendZero
call sendOne
call sendZero
call sendOne

call sendZero call sendZero
call sendOne
call sendZero
call sendOne
call sendZero
call sendOne

call sendZero call sendZero
call sendOne
call sendZero
call sendOne
call sendZero
call sendOne

call sendZero call sendOne
call sendOne
call sendZero
call sendOne
call sendZero
call sendZero

call sendOne call sendOne
call sendZero
call sendZero
call sendOne
call sendZero
call sendZero

call sendOne call sendZero
call sendZero
call sendOne
call sendOne
call sendZero
call sendZero

call sendZero call sendZero
call sendZero
call sendZero
call sendOne
call sendZero
call sendZero

call sendOne call sendOne
call sendZero
call sendZero
call sendOne
call sendZero
call sendZero

call sendZero call sendOne
call sendOne
call sendOne
call sendOne
call sendOne
call sendZero

call sendOne call sendOne
call sendOne
call sendOne
call sendZero
call sendZero
call sendOne

call sendZero call sendOne
call sendOne
call sendOne
call sendZero
call sendOne
call sendOne

call sendOne call sendZero
call sendZero
call sendOne
call sendZero
call sendOne
call sendZero

call sendZero call sendZero
call sendOne
call sendZero
call sendOne
call sendOne
call sendZero

call sendOne call sendZero
call sendZero
call sendOne
call sendZero
call sendOne
call sendZero

call sendZero call sendOne
call sendOne
call sendOne
call sendZero
call sendOne
call sendOne

call sendOne call sendOne
call sendOne
call sendOne
call sendZero
call sendZero
call sendOne

call sendOne call sendOne
call sendZero
call sendOne
call sendZero
call sendOne
call sendOne

call sendOne call sendZero
call sendOne
call sendZero
call sendOne
call sendOne
call sendOne

call sendOne call sendZero
call sendOne
call sendOne
call sendZero
call sendOne
call sendOne

call sendOne call sendZero
call sendZero
call sendZero
call sendZero
call sendOne
call sendOne

call sendZero call sendOne
call sendZero
call sendZero
call sendOne
call sendOne
call sendZero

call sendSlash call sendSlash
call sendSlash
call sendSlash
call sendSlash
call sendSlash
call sendSlash
call sendSlash
call sendSlash
call sendSlash
call sendSlash
call sendSlash
call sendSlash
call sendSlash
call sendSlash

call sendZero call sendOne
call sendOne
call sendOne
call sendOne
call sendOne
call sendZero

call sendZero call sendZero
call sendZero
call sendZero
call sendOne
call sendZero
call sendZero

call sendOne call sendZero
call sendZero
call sendOne
call sendOne
call sendZero
call sendZero

call sendZero call sendZero
call sendZero
call sendZero
call sendOne
call sendZero
call sendZero

call sendOne call sendOne
call sendZero
call sendZero
call sendOne
call sendZero
call sendZero

call sendOne call sendZero
call sendZero
call sendZero
call sendOne
call sendZero
call sendOne

call sendZero call sendOne
call sendZero
call sendZero
call sendOne
call sendZero
call sendOne

call sendZero call sendZero
call sendZero
call sendZero
call sendOne
call sendZero
call sendZero

call sendOne call sendZero
call sendZero
call sendZero
call sendOne
call sendZero
call sendOne

call sendOne call sendOne
call sendZero
call sendZero
call sendOne
call sendZero
call sendZero

call sendOne call sendZero
call sendZero
call sendOne
call sendOne
call sendZero
call sendZero

call sendZero call sendZero
call sendZero
call sendZero
call sendOne
call sendZero
call sendZero

call sendOne call sendOne
call sendZero
call sendZero
call sendOne
call sendZero
call sendZero

call sendSlash call sendSlash
call sendSlash
call sendSlash
call sendSlash
call sendSlash
call sendSlash
call sendSlash
call sendSlash
call sendSlash

call sendZero call sendZero
call sendZero
call sendOne
call sendOne
call sendZero
call sendOne

call sendOne call sendZero
call sendZero
call sendOne
call sendOne
call sendZero
call sendZero

call sendOne call sendZero
call sendZero
call sendZero
call sendOne
call sendZero
call sendOne

call sendSlash call sendSlash
call sendSlash
call sendSlash
call sendSlash
call sendSlash

call sendZero call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero

call sendZero call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero

call sendZero call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero

call sendZero call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero

call sendZero call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero

call sendOne call sendOne
call sendOne
call sendOne
call sendOne
call sendZero
call sendZero

call sendZero call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero
call sendZero

goto theWork

; Idle for 1/10th clock period(10us) ------------------------------------------------
pulseWidthDelay
nop
nop
nop
nop
return

; Idle for one reference clock period(100us) --------------------------------------
groundDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
call pulseWidthDelay
nop
nop
nop
nop
nop
nop
return

;-------------------------------------------------------
pulse
btfsc pulsePolarity,0
goto posPulse

negPulse bsf pulsePolarity,0
movlw NEG
goto pulseIt

posPulse bcf pulsePolarity,0
movlw POS


pulseIt movwf PORTA
call pulseWidthDelay
movlw GND
movwf PORTA

return

;---------------------------------------------------------
sendZero
call groundDelay
call groundDelay
call pulse
return
;----------------------------------------------------------
sendOne
call groundDelay
call pulse
call groundDelay
call pulse
return
;---------------------------------------------------------
sendSlash
call sendOne call sendOne
call sendOne
call sendOne
call sendZero
call sendZero
call sendOne
return
;--------------------------------------------------------

end
 
ppcv said:
Hi
Thanks for the code. But one clarification -in the code call _LCD_CHAR
to be called from where??
also i want to generate the same pattern in portA and portB.

can i modify the code like this:-

_LCD_CHAR calls a routine that prints the content of W on the LCD, assuming you have an LCD already connected and working, you need to replace this call with the one you already use.

If you don't have LCD code, check my tutorials.

As for your modifications, you can't call your routine from the middle of the display loop (and I'm baffled as to why you should think of it?). You should call the _LCD_BIN_DATA routine when ever you want to display the value of W in binary. You will also need to add formatting routines as well, moving the cursor to where you want etc.
 
Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…