Stepper motor smart interface for CNC 2 to CNC 2.5 upgrade


stepper motor circuit schematic interface with lcd and pic16f84

Stepper motor smart interface schematics

This smart interface control the head movment on vertical axe of a CNC machine. All data graphics are stored into internal eeprom of microcontroller. For keyboard and display connection I have use the user interface board of a fault Nokia 5110 phone.


Source code file for stepper motor smart interface it is available for download
;=======Stepper.ASM=========================01/03/03==V 1.0==
;	Upgrade for CNC 2 to CNC 2,5 
;	A0 bidirectional sense bit
;	A1 impulse bit
;	A2..A4 keyboard
;	B0..B4 lcd
;	B5 leduri
;	B6 buzzer
;	B7 Vcmd
;      http://www.module.ro
;     standard crystal 4MHz, 1us/instruction
;     Created by E.D.Eng. Bergthaller Iulian-Alexandru
;------------------------------------------------------------
;     configure programmer
	list	p=16f84;f=inhx8m
	#INCLUDE P16F84.INC
_CP_OFF	equ	H'3FFF'	      ;code protect off
_PwRTE_ON	equ	H'3FFF' 		;Power on timer on
_wDT_OFF	equ	H'3FFB'		;watch dog timer off
_XT_OSC	equ	H'3FFD'		;crystal oscillator
__CONFIG       _CP_OFF & _PwRTE_ON & _wDT_OFF & _XT_OSC
;------------------------------------------------------------
;      cpu init
count1	equ	0C
count2	equ	0D
count3	equ	0E
count4	equ	0F
afisaj	equ	10
dig		equ	11
xini		equ	12
dig1		equ	14
dig2		equ	15
dig3		equ	16
obn1		equ	17
obn2		equ	18
obn3		equ	19
unt1		equ	1A
unt2		equ	1B
unt3		equ	1C
acu1		equ	1D
acu2		equ	1E
acu3		equ	1F
#DEFINE sens	PORTA,0
#DEFINE spik	PORTA,1
#DEFINE msus	PORTA,2
#DEFINE mjos	PORTA,3
#DEFINE okay	PORTA,4
#DEFINE dorc	PORTB,0
#DEFINE sclk	PORTB,1
#DEFINE sdta	PORTB,2
#DEFINE enab	PORTB,3
#DEFINE rset	PORTB,4
#DEFINE ledu	PORTB,5
#DEFINE beep	PORTB,6
#DEFINE tens	PORTB,7
;------------------------------------------------------------
;------------------------------------------------------------
	org	0x00
	goto	init
	org	0x04
;************************************************************************
init   
	bsf 	STATUS,RP0	; SET BANK = 1.
      movlw	B'00000000'	; SET PORTB TO ALL OUTPUT.
      movwf	TRISB
	movlw	B'11111100'	; SET PORTA TO INPUT/OUTPUT.
	movwf	TRISA		
	bcf 	STATUS,RP0	; SET BANK = 0.
	bcf	sens
	bcf	spik
	clrf	dig1	;digit ini 
	clrf	dig2
	clrf	dig3
	clrf	obn1
	clrf	obn2
	clrf	obn3
	clrf	unt1
	clrf	unt2
	clrf	unt3
	clrf	acu1
	clrf	acu2
	clrf	acu3
;************************************************************************
;*    LCD Display ini                                                   *
;************************************************************************
	bsf	dorc
	bsf	ledu
	bsf	enab
	bsf	tens	;lcd logic voltage on
	call lcres	;reset for 250 ms
	movlw 0x21	;extended set command
	call	lccmd
	movlw	0xC5	;Vop 
	call	lccmd
	movlw	0x13	;bias loop
	call	lccmd
	movlw	0x22	;vertical mode and normal set command
	call	lccmd
	movlw	0x09	;mod control all dots on 
	call	lccmd
	call	cbild	;erase lcd
	call	pause
	movlw	0x0C	;mod control normal 
	call	lccmd
	movlw	0x80	;x ini 
	movwf	xini
	call	lccmd
;************************************************************************
;*    Start Graphic on LCD                                              *
;************************************************************************
	movlw	0x04
	movwf	count3
	movlw	B'00110010' 
	movwf	EEADR
vlop	call	lin1
	call	gout
	incf	EEADR,F
	call	lin3
	call	gout
	incf	EEADR,F
	call	lin5
	call	gout
	incf	EEADR,F
	call	xinc
	decfsz  count3,F
	goto	vlop
;************************************************************************
;*    mirror image (eeprom memory too small)                            *
;************************************************************************
	movlw	0x03	  
	movwf	count3
	movlw	B'00111000' 
	movwf	EEADR
mirr	call	lin1	;line 1
	call	gout
	incf	EEADR,F
	call	lin3	;line 3
	call	gout
 	incf	EEADR,F
	call	lin5	;line 5
	call	gout
	movlw	0x05	;address decrement with 5 for mirror
 	subwf EEADR,F
	call	xinc
	decfsz  count3,F
	goto	mirr
;************************************************************************
	movlw	0x9D	; coloana 29
	call	lccmd
	call	lin1
	call	pct
	call	lin3
	call	pct
	call	lin5
	call	pct
;************************************************************************
	movlw	0x20	;horizontal mode
	call	lccmd
;************************************************************************
;*    parcare bostan la nivel superior - calibration                    *
;************************************************************************
	call	calib
	call	buzz
;************************************************************************
;*    manual calibration to stuff surface                               *
;************************************************************************
	clrf	dig1
	clrf	dig2
	clrf	dig3
nou	call	lin3
	call	invs
	movf	acu1,W
	movwf	dig1
	movf	acu2,W
	movwf	dig2
	movf	acu3,W
	movwf	dig3
	call	lcout
	call	gndrf
	movf	dig1,W
	movwf	acu1
	movf	dig2,W
	movwf	acu2
	movf	dig3,W
	movwf	acu3
;************************************************************************
;*    setarea adancimii de prelucrare - down position calibration       *
;************************************************************************
	call	lin5
	call	invs
	movf	unt1,W
	movwf	dig1
	movf	unt2,W
	movwf	dig2
	movf	unt3,W
	movwf	dig3
	call	lcout
	call	scan
	movf	dig1,W
	movwf	unt1
	movf	dig2,W
	movwf	unt2
	movf	dig3,W
	movwf	unt3
	clrf	dig1
	clrf	dig2
	clrf	dig3
;************************************************************************
;*    setarea pozitiei de baza - base position calibration              *
;************************************************************************
	call	lin1
	call	invs
	movf	obn1,W
	movwf	dig1
	movf	obn2,W
	movwf	dig2
	movf	obn3,W
	movwf	dig3
	call	lcout
	call	scan
	movf	dig1,W
	movwf	obn1
	movf	dig2,W
	movwf	obn2
	movf	dig3,W
	movwf	obn3
;************************************************************************
;     asteapta comanda de la CNC - wait command from CNC (simulation)   *
;************************************************************************
;	bsf 	STATUS,RP0	; SET BANK = 1.
;	movlw	B'11111101'	; SET PORTA TO INPUT ON SENSE
;	movwf	TRISA		
;	bcf 	STATUS,RP0	; SET BANK = 0.
	call	caps
	call	pause
	movf	unt1,W
	movwf	dig1
	movf	unt2,W
	movwf	dig2
	movf	unt3,W
	movwf	dig3
	call	capj
	goto	nou
;************************************************************************
caps	movf	dig1,F ; zero bit test if dig1=dig1=0
	btfss	STATUS,2
	goto	niv1
	movf	dig2,F ; zero bit test if dig2=dig2=0
	btfss	STATUS,2
	goto	niv1
	movf	dig3,F ; zero bit test if dig3=dig3=0
	btfsc	STATUS,2
	goto	niv2
niv1	call	lcjos
	call	lin1
	call	lcout
	call	dsus
	goto	caps
niv2	retlw	00
;************************************************************************
capj	movf	dig1,F ; zero bit test if dig1=dig1=0
	btfss	STATUS,2
	goto	lev1
	movf	dig2,F ; zero bit test if dig2=dig2=0
	btfss	STATUS,2
	goto	lev1
	movf	dig3,F ; zero bit test if dig3=dig3=0
	btfsc	STATUS,2
	goto	lev2
lev1	call	lcjos
	call	lin5
	call	lcout
	call	djos
	goto	capj
lev2	retlw	00
;************************************************************************
;*    Knopf initialisierungen - Head ini                                *
;************************************************************************ 
calib movlw	0x04
	movwf	count4
lo1	movlw	0xC8
	movwf   count2
lo2	call	dsus
	decfsz  count2,F	; decrement and skip next line if zero
	goto 	lo2		; if not zero		
	decfsz  count4,F	; decrement count1 if count2 is zero
	goto 	lo1		; do inside loop again if count1 nz
	retlw	00
;************************************************************************
dsus	bcf	sens
	call	puls
	retlw	00
;************************************************************************
djos	bsf	sens
	call	puls
	retlw	00
;************************************************************************
puls	movlw	0x14
	movwf	count3
tren	bsf	spik
	call	stepp
	bcf	spik
	call	stepp
	decfsz  count3,F	; decrement and skip next line if zero
	goto 	 tren	; if not zero		
	retlw	00
;************************************************************************
buzz	movlw	0x7F
	movwf   count2
suna	bsf	beep
	call	stepp
	bcf	beep
	call	stepp
	decfsz  count2,F	; decrement and skip next line if zero
	goto 	suna		; if not zero		
	retlw	00
;************************************************************************
;*    count up on 3 digits                                              *
;************************************************************************
lcsus	incf	dig1,F
	movlw	0x0A
	subwf	dig1,W
	btfss	STATUS,2 ;test zero bit
	goto	gatas
	clrf	dig1
	incf	dig2,F
	movlw	0x0A
	subwf	dig2,W
	btfss	STATUS,2 ;test zero bit
	goto	gatas
	clrf	dig2
	incf	dig3,F
	movlw	0x0A
	subwf	dig3,W
	btfss	STATUS,2 ;test zero bit
	goto	gatas
	clrf	dig3
gatas	retlw	00	
;************************************************************************
;*    count down on 3 digits                                            *
;************************************************************************
lcjos	decf	dig1,F
	movlw	0xFF
	subwf	dig1,W
	btfss	STATUS,2 ;test zero bit
	goto	gataj
	movlw	0x09
	movwf	dig1
	decf	dig2,F
	movlw	0xFF
	subwf	dig2,W
	btfss	STATUS,2 ;test zero bit
	goto	gataj
	movlw	0x09
	movwf	dig2
	decf	dig3,F
	movlw	0xFF
	subwf	dig3,W
	btfss	STATUS,2 ;test zero bit
	goto	gataj
	movlw	0x09
	movwf	dig3
gataj	retlw	00	
;************************************************************************
invs	movlw	0x9D	; coloana 29
	call	lccmd
	movlw	0xC6	; doua puncte - two dots
	call	lcdta
	retlw	00
;************************************************************************
norm	movlw	0x9D	; coloana 29
	call	lccmd
	call	pct	; un punct - one dot
	retlw	00
;************************************************************************
pct	movlw	0xC0	; punct
	call	lcdta
	retlw	00
;************************************************************************
lin1	movlw	0x40	; linia 1
	call	lccmd
	retlw	00
;************************************************************************
lin3	movlw	0x42	; linia 3
	call	lccmd
	retlw	00
;************************************************************************
lin5	movlw	0x44	; linia 5
	call	lccmd
	retlw	00
;************************************************************************
;*    eeprom read and display                                           *
;************************************************************************
gout	call	EEPROMREAD
	call	lcdta
	retlw	00
;************************************************************************
;*    increment x axe when vertical mode it is used                     *
;************************************************************************
xinc	incf	xini,F
	movf	xini,W
	call	lccmd
	retlw	00
;************************************************************************
;*    lcd out for 3 digits                                              *
;************************************************************************
lcout	movlw	0xA0	; coloana 32
	movwf	xini
	call	lccmd
	movf	dig1,W
	movwf	dig	; dig=dig1
	call	mux
	movlw	0x97	; coloana 23
	movwf	xini
	call	lccmd
	movf	dig2,W
	movwf	dig	; dig=dig2
	call	mux
	movlw	0x91	; coloana 17
	movwf	xini
	call	lccmd
	movf	dig3,W
	movwf	dig	; dig=dig3
	call	mux
	retlw	00
;************************************************************************
;*    display one digit,read the data from eeprom and calculate address *
;************************************************************************
mux	movlw	0x00
	movwf	EEADR
	movlw	0x05
	movwf	count2 ;cinci coloane pe cifra - five bytes for a digit
;************************************************************************
;*    obtine adresa eeprom pt. cifra - give eeprom address for a digit  *
;************************************************************************
	movf	dig,F ; zero bit test if dig=dig=0
	btfss	STATUS,2
	goto	adlcd
	movlw	0x00
	movwf	EEADR
	goto	cmlc
adlcd	movlw	0x00
adun	addlw	0x05
	decfsz	dig,F
	goto	adun
	movwf	EEADR ; now eeadr contains the address for the digit 
;************************************************************************
;*    display digit byte by byte                                        *
;************************************************************************
cmlc	call	gout
	incf	EEADR,F
	call	xinc
	decfsz	count2,F
	goto	cmlc
	retlw	00
;************************************************************************
;*    gndrf scaneaza taste, comanda motor si afiseaza - keyboard scan   *
;************************************************************************
gndrf	bsf	ledu
town0	btfsc	mjos
	goto	town1
	call	buzz
	call	dsus
	call	lcjos
	call	lcout
town1	btfsc	msus
	goto	town2
	call	buzz
	call	djos
	call	lcsus
	call	lcout
town2	btfsc	okay
	goto	town0
	call 	buzz
	call	norm
	bcf	ledu
	call	pause
	retlw	00
;************************************************************************
;*    gndrf scaneaza taste si afiseaza - keyboard scan and display      *
;************************************************************************
scan	bsf	ledu
down0	btfsc	mjos
	goto	down1
	call	buzz
	call	lcjos
	call	lcout
down1	btfsc	msus
	goto	down2
	call	buzz
	call	lcsus
	call	lcout
down2	btfsc	okay
	goto	down0
	call	buzz
	call	norm
	bcf	ledu
	call	pause
	retlw	00
;************************************************************************
;************************************************************************
lcdta	bsf	dorc ; lcd data
	bcf	enab ; lcd enable
	call	varsa
	bsf	enab
	retlw	00
;************************************************************************
lccmd	bcf	dorc ; lcd command
	bcf	enab ; lcd enable
	call	varsa
	bsf	enab
	retlw	00
;************************************************************************
lcres	bcf	rset ;reset
	call	pause
	bsf	rset ;dezactivare reset
	retlw	00
;************************************************************************
;*    seriall communication to lcd                                      *  
;************************************************************************
varsa	movwf	afisaj
	movlw 0x08	
	movwf count4
vbit	bcf	sclk
	btfsc afisaj,7	;bit0
	bsf	sdta
	btfss afisaj,7
	bcf	sdta
	nop
	nop
	nop
	bsf	sclk
	nop
	nop
	nop
	rlf	afisaj,1
	decfsz count4,F
	goto	vbit
	retlw	00
;************************************************************************
;*    erase lcd                                                         *
;************************************************************************
cbild	bcf	sdta ; data it is null for clearing
	movlw	0x06 ; 6 lines
	movwf	count3
c3	movlw	0x54 ; 84 coloane
	movwf	count1
c1	movlw	0x08 ; one bytes it is send with 8 clock pulse
	movwf	count2
	bsf	dorc
	bcf	enab 
c2	bcf	sclk
	nop
	nop
	bsf	sclk
	decfsz	count2,F	
	goto	c2
	bsf	enab 		
	decfsz	count1,F	
	goto	c1		
	decfsz	count3,F    
	goto	c3          
	retlw	00
;************************************************************************
;	Citire eeprom de la adresa eeadr - eeprom read subroutine         *
;************************************************************************
EEPROMREAD	
	BSF	STATUS,5	; SET TO BANK 1
	BSF	EECON1,00	; INITIATES AN EEPROM READ
	BCF	STATUS,5	; SET TO BANK 0
	MOVF	EEDATA,W	; TRANSFER EEDATA DIN EEPROM IN ACCU
	RETURN
;************************************************************************
;*    Durata puls pas motor - stepp time                                *
;************************************************************************
stepp	movlw	0x7F	  
	movwf   count1
pas1	decfsz  count1,F	; decrement and skip next line if zero
	goto	pas1		; if not zero
	retlw	00
;************************************************************************
pause	movlw	0x07
	movwf	count3
d3	movlw	0x32
	movwf	count1
d1	movlw	0xFA	  
	movwf	count2
d2	decfsz	count2,F	
	goto	d2		
	decfsz	count1,F	
	goto	d1		
	decfsz	count3,F    
	goto	d3          
	retlw	00
;************************************************************************
;*    adrese cifre intre 2100 si 2131 inclusiv - no. address and data   *
;************************************************************************
	ORG	0x2100
	de	0x7C,0xA2,0x92,0x8A,0x7C,0x00,0x84,0xFE,0x80,0x00
	de	0x84,0xC2,0xA2,0x92,0x8C,0x42,0x82,0x8A,0x96,0x62
	de	0x30,0x28,0x24,0xFE,0x20,0x4E,0x8A,0x8A,0x8A,0x72
	de	0x78,0x94,0x92,0x92,0x60,0x02,0xE2,0x12,0x0A,0x06
	de	0x6C,0x92,0x92,0x92,0x6C,0x0C,0x92,0x92,0x52,0x3C
;************************************************************************
;*    adrese grafica intre 2132 si 213D inclusiv - arrow and home data  *
;************************************************************************
	de	0x08,0xF9,0x10,0x0C,0x8A,0x30
	de	0xFE,0x8C,0x7F,0xFF,0x88,0xFF
;************************************************************************
	end
;============================================================


stepper motor PCB driver

stepper motor z-axis mechanics

nokia lcd main menu from stepper interface

Just some stepper motor smart interface photos.


Back to my home page
Last updated December, 2003
Copyright © 2003 Bergthaller Iulian-Alexandru