Programació en mpasm del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Modes de funcionament del motor pas a pas

Programa del grup 1

Aquest grup va codificar el sentit de gir amb l'interruptor connectat a RB4 i els diferents modes segons la següent taula:

RB7 RB5 Mode
0 0 Aturat
0 1 Full step
1 0 Wave drive
1 1 Half step

El seu programa es basa en tenir els blocs ordenats per a half step. Per fer els altres dos modes es salten els passos que no corresponen al mode actual i per canviar el sentit de gir es salta en sentit contrari. El programa final és:

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	cblock 0x20
Delay1					; Definim dues variables de comptatge
Delay2
Durada
int
	endc
	org 0
Inici
	bsf		STATUS,RP0	; Tria el banc 1
	bcf		OPTION_REG,7	; Activa el control individual de pull-ups
	movlw		0xFF
	movwf		TRISA
	movwf		WPUA 		; Activa les resistències de pull-up
	movwf 		TRISB 		; Posa tot el port B com a entrada
	clrf		TRISC	
	movlw		0x10
	movwf		ADCON1
	bcf		STATUS,RP0
	bsf		STATUS,RP1
	movlw		0xFF 		; Posa l'acumulador a FFh (tot uns)
	movwf		WPUB 		; Activa les resistències de pull-up
	movlw		0x01 		; Posa l'acumulador a 01h
	movwf		ANSEL		; L'entrada AN0 és analògica
	movlw 		0x00 		; Posa l'acumulador a 00h
	movwf 		ANSELH 		; Les altres entrades són digitals
	movlw		0xF7
	movwf		ANSEL
	bcf		STATUS,RP0
	bcf		STATUS,RP1
	movlw		0x01
	movwf		ADCON0
	movlw		0x00 
	movwf		PORTC		; Copia el valor de W al port C
MainLoop
	nop				; espera un microsegon
	nop
	nop
	nop
	bsf		ADCON0,GO	; Inicia la conversió
	btfsc		ADCON0,GO	; Quan el bit sigui 0 la conversió haurà acabat
	goto		$-1		; Quan el bit sigui 0 la conversió haurà acabat
	movf		ADRESH,w	; Copia els bits superiors a l'acumulador
	addlw		1		; Li suma 1 i tenim la durada variable cicle
	movwf		Delay2
	movwf		Durada
OnLoop
	movf		PORTB,w
	andlw		b'10110000'	; Només tindrem en compte els bits 4,5 i 7
	movwf		int		; Copia el valor de l'acumulador a la variable int
	xorlw		b'00100000'	; Compara aquesta seqüencia amb la seqüencia d'interruptors
	btfsc		STATUS,Z	; Si les sequencies no coincideixen es salta la propera instrucció
	goto		OnLoop2
	movf		int,w
	xorlw		b'00110000'
	btfsc		STATUS,Z
	goto		OnLoop8
	call		TEMPS		; Crida la funció TEMPS
	movlw		0x88		; Posa el valor (1000 1000) al registre W
	call		A		; Crida la funció A
	btfsc		STATUS,Z
	goto		OnLoop8
	movf		int,w
	xorlw		b'10010000'
	btfsc		STATUS,Z
	goto		OnLoop7
	goto 		OnLoop2
MainLoop2
	nop
	nop
	nop
	nop
	bsf		ADCON0,GO	
	btfsc		ADCON0,GO	
	goto		$-1
	movf		ADRESH,w
	addlw		1
	movwf		Delay2
	movwf		Durada
OnLoop2
	movf		PORTB,w
	andlw		b'10110000'
	movwf		int
	xorlw		b'10000000'
	btfsc		STATUS,Z	
	goto		OnLoop3
	movf		int,w
	xorlw		b'10010000'
	btfsc		STATUS,Z
	goto		OnLoop
	call		TEMPS
 	movlw		0xAA		; Posa el valor (1010 1010) al registre W
	call		A
	btfsc		STATUS,Z
	goto		MainLoop
	movf		int,w
	xorlw		b'00110000'
	btfsc		STATUS,Z
	goto		OnLoop8
OnLoop3
	movf		int,w
	xorlw		b'00100000'
	btfsc		STATUS,Z
	goto		OnLoop4
	movf		int,w
	xorlw		b'00110000'
	btfsc		STATUS,Z
	goto		MainLoop2	
	call		TEMPS
 	movlw		0x22		; Posa el valor (0010 0010) al registre W
	call		A
	btfsc		STATUS,Z
	goto		MainLoop2
	movf		int,w
	xorlw		b'10010000'
	btfsc		STATUS,Z
	goto		MainLoop
OnLoop4
	movf		int,w
	xorlw		b'10000000'
	btfsc		STATUS,Z
	goto		OnLoop5
	movf		int,w
	xorlw		b'10010000'
	btfsc		STATUS,Z
	goto		OnLoop3
	call		TEMPS
	movlw		0x66		; Posa el valor (0110 0110) al registre W
	call		A
	btfsc		STATUS,Z
	goto		OnLoop3
	movf		int,w
	xorlw		b'00110000'
	btfsc		STATUS,Z
	goto		MainLoop2
OnLoop5
	movf		int,w
	xorlw		b'00100000'
	btfsc		STATUS,Z
	goto		OnLoop6
	movf		int,w
	xorlw		b'00110000'
	btfsc		STATUS,Z
	goto		OnLoop4
	call		TEMPS
	movlw		0x44		; Posa el valor (0100 0100) al registre W
	call		A
	btfsc		STATUS,Z
	goto		OnLoop4
	movf		int,w
	xorlw		b'10010000'
	btfsc		STATUS,Z
	goto		OnLoop3
OnLoop6
	movf		int,w
	xorlw		b'10000000'
	btfsc		STATUS,Z
	goto		OnLoop7
	movf		int,w
	xorlw		b'10010000'
	btfsc		STATUS,Z
	goto		OnLoop5
	call		TEMPS
 	movlw		0x55		;Posa el valor (0101 0101) al registre W
	call 		A
	btfsc		STATUS,Z
	goto		OnLoop5
	movf		int,w
	xorlw		b'00110000'
	btfsc		STATUS,Z
	goto		OnLoop4
OnLoop7
	movf		int,w
	xorlw		b'00100000'
	btfsc		STATUS,Z
	goto		OnLoop8
	movf		int,w
	xorlw		b'00110000'
	btfsc		STATUS,Z
	goto		OnLoop6
	call		TEMPS
 	movlw		0x11		; Posa el valor (0001 0001) al registre W
	call		A
	btfsc		STATUS,Z
	goto		OnLoop6
	movf		int,w
	xorlw		b'10010000'
	btfsc		STATUS,Z
	goto		OnLoop5
OnLoop8
	movf		int,w
	xorlw		b'10000000'
	btfsc		STATUS,Z
	goto		MainLoop
	movf		int,w
	xorlw		b'10010000'
	btfsc		STATUS,Z
	goto		OnLoop7
	call		TEMPS
 	movlw		0x99		; Posa el valor (1001 1001) al registre W
	call		A
	btfsc		STATUS,Z
	goto		OnLoop7
	movf		int,w
	xorlw		b'00110000'
	btfsc		STATUS,Z
	goto		OnLoop6
	goto		MainLoop 	;Repetim-ho
TEMPS
	decfsz		Delay1,f	; Decrementa la variable 1
					; si dona zero, no es fa la instrucció següent
	goto		TEMPS		; Salta, excepte si el resultat ha estat zero
	decfsz		Delay2,f	; Decrementa la variable 2
	goto		TEMPS		; Salta, excepte si el resultat ha estat zero
	return
A
	movwf		PORTC		; Copia el valor de W al port C
	movf		Durada,w
	movwf		Delay2
	movf		int,w
	xorlw		b'10110000'
	return
	end

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.