begin process at 2012 05 24 03:32:47
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Les PIC

 > MOTEUR-RUN -:- PILOTAGE MOTEUR PAS À PAS AVEC RAMPES

MOTEUR-RUN -:- PILOTAGE MOTEUR PAS À PAS AVEC RAMPES


 Information sur la source

Note :
Aucune note
Catégorie :Les PIC Classé sous :moteur pap, moteur, rampe Niveau :Débutant Date de création :22/02/2011 Vu :3 780

Auteur : bermudos

Ecrire un message privé
Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

 Description

Je sais que nous ne sommes pas sur sourceforge et que les versions en évolution sont peut être mal perçues ici, toutefois et pour remplir un peu l'internet; voici le code de pilotage d'un moteur pàp unidirectionnel à 4 bobines et 2 points milieu.

Source

  • #include <p16f627.inc>
  • __CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC
  • CBLOCK 0x020
  • TIMER1 :1 ; Variable decomptee lors d'un tempo
  • TIMER2 :1 ; Variable decomptee lors d'un tempo
  • BTN :1 ; Variable de stockage des boutons du pas
  • TIMER_VALUE :1 ; Variable pour regler le temps a decompter
  • MAXI :1 ; Vitesse maximale (voir initialisation).
  • MINI :1 ; Vitesse minimale.
  • MEMTMP :1 ; variable temporaire
  • COUNT :1 ; Variable decomptee dans la validation
  • RAMPE :1 ; pente d'acceleration
  • MOTOR :1 ; sorties vers moteur
  • WORK : 1 ; bit 0 = forward
  • ; bit 1 = backward
  • ; bit 2 = marche
  • ; bit 3, 4 et 5 = gestion rampe.
  • ; 543
  • ; 1xx => en roue libre, seuil atteint
  • ; 000 => en pause, a l'arret.
  • ; 001 => acceleration
  • ; 010 => decceleration
  • ; 011 => situation impossible
  • ; bit 7 = Bouton enfonce
  • ;
  • ; w_temp :1
  • ; status_temp :1
  • ENDC ; Fin de la zone
  • ;-------------------------------------------------------------
  • ; vecteur de redemarrage
  • ORG H'0000' ; Emplacement appelé au reset du PIC
  • GOTO boot ; Aller à la routine boot
  • ;-------------------------------------------------------------
  • ; Temporisation
  • tempo MOVF TIMER_VALUE,W ; Chargement de la duree de temporisation dans W
  • MOVWF TIMER2 ; Move W to TIMER2
  • DEL_LOOP1 MOVF TIMER_VALUE,W ; Chargement de la duree de temporisation dans W
  • MOVWF TIMER1 ; Move W to TIMER1
  • DEL_LOOP2 DECFSZ TIMER1,F ; Decrement de TIMER1, sauter suivant si zero
  • GOTO DEL_LOOP2 ; TIMER1 > 0 => decompter encore
  • DECFSZ TIMER2,F ; Decrement de TIMER2, sauter suivant si zero
  • GOTO DEL_LOOP1 ; TIMER2 > 0 => decompter encore
  • RETLW 0 ; Retour en mettant W a zero
  • entrees movf PORTB, W ; Le portB est place dans W
  • sublw D'0' ; 0 en est soustrait
  • btfss STATUS, Z ; pour faire monter le bit Z si W=0
  • goto entrees_s ; non, le bit Z=0; un bouton a ete enfonce
  • goto entrees_end ; oui, le bit Z=1; on saute a la fin
  • entrees_s movf PORTB,w ; le portB est replace dans W
  • movwf BTN ; pour etre range dans BTN
  • entrees_end return
  • traitement btfsc BTN, 0 ; bouton "aller en avant" ?
  • goto traitement_dbw ; oui, traiter le ralentissement recul
  • btfsc BTN, 1 ; bouton "aller en arriere" ?
  • goto traitement_dfw ; oui, traiter le ralentissement avant
  • btfsc BTN, 2 ; bouton "arreter" ?
  • goto traitement_sfw ; oui, traiter l'arret avant
  • return
  • traitement_sfw btfss WORK,0 ; est on en marche avant ?
  • goto traitement_sbw ; non, traiter l'arret arriere
  • bcf WORK, 5 ; oui, raz du seuil atteint
  • call down_fw ; ralentir marche avant
  • return
  • traitement_sbw btfss WORK, 1 ; est on en marche arriere ?
  • bcf WORK, 5 ; raz du seuil atteint
  • call down_bw ; oui, ralentir marche arriere
  • return
  • traitement_dfw btfss WORK, 0 ; est on en marche avant ?
  • goto traitement_gbw ; non, traiter le recul
  • bcf WORK, 5 ; oui, raz du seuil atteint
  • call down_fw ; ralentir marche avant
  • return
  • traitement_gbw btfss WORK, 1 ; est on en marche arriere ?
  • goto traitement_ubw ; non, traiter l'acceleration arriere
  • bcf WORK, 5 ; raz du seuil atteint
  • call go_bw ; oui, aller en arriere
  • return
  • traitement_ubw call up_bw ; accelerer en arriere
  • return
  • traitement_dbw btfss WORK, 1 ; est on en marche arriere ?
  • goto traitement_gfw ; non, traiter la marche avant
  • bcf WORK, 5 ; raz du seuil atteint
  • call down_bw ; oui, ralentir marche arriere
  • return
  • traitement_gfw btfss WORK, 0 ; est on en marche avant ?
  • goto traitement_ufw ; non, traiter l'acceleration en avant
  • call go_fw ; oui, aller en avant
  • return
  • traitement_ufw call up_fw ; accelerer en avant
  • return
  • down_fw btfss WORK, 5 ; seuil atteint ?
  • goto down_fw_count ; non, continuer a compter
  • goto down_fw_end ; oui, aller a la fin
  • down_fw_count movf MINI, W ; placer MINI dans W
  • subwf TIMER_VALUE, W ; le soustraire a TIMER_VALUE
  • btfss STATUS,C ; est ce inferieur ou egal a zero
  • goto down_fw_up ; non, on peut diminuer la tempo entre pas
  • bcf WORK,0 ; oui, on ne marche plus en avant
  • btfsc BTN,3 ; arret demande ?
  • return ; oui, on retourne
  • goto down_fw_end ; non, aller a la fin
  • down_fw_up movf TIMER_VALUE,W ; sinon, placer TIMER_VALUE dans W
  • movwf MEMTMP ; placer W dans une variable temporaire
  • movf RAMPE,W ; placer RAMPE dans W
  • addwf MEMTMP,W ; le soustraire a la variable temporaire
  • movwf TIMER_VALUE ; placer le resultat dans TIMER_VALUE
  • down_fw_end call tempo ; appeler la tempo avec cette valeur
  • bcf STATUS,C ; necessaire pour les 1 qui sortent du chapeau
  • rlf MOTOR,W ; 0001 devient 0010 dans W
  • movwf MEMTMP ; W est place dans MEMTMP
  • btfss MEMTMP,4 ; le bit 4 de MEMTPM est il a 1 (10000)
  • goto down_fw_send ; non, envoyer comme ca
  • clrf MOTOR ; oui, raz MOTOR
  • bsf MOTOR,0 ; MOTOR = 0001
  • movf MOTOR,W ; on place MOTOR dans W
  • down_fw_send movwf MOTOR ; on place W dans MOTOR
  • return
  • go_bw movf TIMER_VALUE,W ; placer TIMER_VALUE dans W
  • call tempo ; appeler la tempo avec cette valeur
  • bcf STATUS,C ; necessaire pour les 1 qui sortent du chapeau
  • rrf MOTOR,W ; 0100 devient 0010 dans W
  • movwf MEMTMP ; W est place dans MEMTMP
  • btfss STATUS,C ; etait ce 0001 qui est entre dans le carry ?
  • goto go_bw_send ; non, envoyer comme ca
  • bcf MOTOR,0 ; oui, donc la pre-sortie 1 est mise a zero
  • bsf MOTOR,3 ; et la pre-sortie 3 est mise a 1
  • movf MOTOR,W ; MOTOR est place dans W
  • go_bw_send movwf MOTOR ; on place W dans MOTOR
  • return
  • up_bw btfss WORK, 5 ; seuil atteint ?
  • goto up_bw_count ; non, continuer a compter
  • goto up_bw_end ; oui, aller a la fin
  • up_bw_count movf TIMER_VALUE, W ; placer TIMER_VALUE dans W
  • subwf MAXI, W ; le soustraire a MAXI
  • btfss STATUS,C ; est ce inferieur ou egal a zero
  • goto up_bw_up ; non, on peut diminuer la tempo entre pas
  • bsf WORK,1 ; on est maintenant en marche arriere
  • goto up_bw_end ; aller a la fin
  • up_bw_up movf TIMER_VALUE,W ; placer TIMER_VALUE dans W
  • movwf MEMTMP ; placer W dans une variable temporaire
  • movf RAMPE,W ; placer RAMPE dans W
  • subwf MEMTMP,W ; le soustraire a la variable temporaire
  • movwf TIMER_VALUE ; placer le resultat dans TIMER_VALUE
  • up_bw_end call tempo ; appeler la tempo avec cette valeur
  • bcf STATUS,C ; necessaire pour les 1 qui sortent du chapeau
  • rrf MOTOR,W ; 0100 devient 0010 dans W
  • btfss STATUS,C ; etait ce 0001 qui est entre dans le carry ?
  • goto up_bw_send ; non, envoyer comme ca
  • bcf MOTOR,0 ; oui, il faut eteindre 1
  • bsf MOTOR,3 ; et il faut rallumer 3
  • movf MOTOR,W ; MOTOR est place dans W
  • up_bw_send movwf MOTOR ; on place W dans MOTOR
  • return
  • down_bw btfss WORK, 5 ; seuil atteint ?
  • goto down_bw_count ; non, continuer a compter
  • goto down_bw_end ; oui, aller a la fin
  • down_bw_count movf MINI, W ; placer MINI dans W
  • subwf TIMER_VALUE, W ; le soustraire a TIMER_VALUE
  • btfss STATUS,C ; est ce inferieur ou egal a zero
  • goto down_bw_up ; non, on peut diminuer la tempo entre pas
  • bcf WORK,1 ; on n'est plus en marche arriere
  • btfsc BTN,3 ; arret demande ?
  • return ; oui, on retourne
  • goto down_bw_end ; aller a la fin
  • down_bw_up movf TIMER_VALUE,W ; placer TIMER_VALUE dans W
  • movwf MEMTMP ; placer W dans une variable temporaire
  • movf RAMPE,W ; placer RAMPE dans W
  • addwf MEMTMP,W ; le soustraire a la variable temporaire
  • movwf TIMER_VALUE ; placer le resultat dans TIMER_VALUE
  • down_bw_end call tempo ; appeler la tempo avec cette valeur
  • bcf STATUS,C ; necessaire pour les 1 qui sortent du chapeau
  • rrf MOTOR,W ; 0100 devient 0010 dans W
  • btfss STATUS,C ; etait ce 0001 qui est entre dans le carry ?
  • goto down_bw_send ; non, envoyer comme ca
  • bcf MOTOR,0 ; oui, il faut eteindre 1
  • bsf MOTOR,3 ; et il faut rallumer 3
  • movf MOTOR,W ; MOTOR est place dans W
  • down_bw_send movwf MOTOR ; on place W dans MOTOR
  • return
  • go_fw movf TIMER_VALUE,W ; placer TIMER_VALUE dans W
  • call tempo ; appeler la tempo avec cette valeur
  • bcf STATUS,C ; necessaire pour les 1 qui sortent du chapeau
  • rlf MOTOR,W ; 0001 devient 0010 dans W
  • movwf MEMTMP ; W est place dans MEMTMP
  • btfss MEMTMP,4 ; le bit 4 de MEMTPM est il a 1
  • goto go_fw_send ; non, envoyer comme ca
  • clrf MOTOR ; oui, raz MOTOR
  • bsf MOTOR,0 ; MOTOR = 0001
  • movf MOTOR,W ; on place MOTOR dans W
  • go_fw_send movwf MOTOR ; on place W dans MOTOR
  • return
  • up_fw btfss WORK, 5 ; seuil atteint ?
  • goto up_fw_count ; non, continuer a compter
  • goto up_fw_end ; oui, aller a la fin
  • up_fw_count movf TIMER_VALUE, W ; placer TIMER_VALUE dans W
  • subwf MAXI, W ; le soustraire a MAXI
  • btfss STATUS,C ; est ce inferieur ou egal a zero
  • goto up_fw_up ; non, on peut diminuer la tempo entre pas
  • bsf WORK,5 ; oui, on a atteint le seuil
  • bsf WORK,0 ; on est en marche avant
  • goto up_fw_end ; aller a la fin
  • up_fw_up movf TIMER_VALUE,W ; placer TIMER_VALUE dans W
  • movwf MEMTMP ; placer W dans une variable temporaire
  • movf RAMPE,W ; placer RAMPE dans W
  • subwf MEMTMP,W ; le soustraire a la variable temporaire
  • movwf TIMER_VALUE ; placer le resultat dans TIMER_VALUE
  • up_fw_end call tempo ; appeler la tempo avec cette valeur
  • bcf STATUS,C ; necessaire pour les 1 qui sortent du chapeau
  • rlf MOTOR,W ; 0001 devient 0010 dans W
  • movwf MEMTMP ; W est place dans MEMTMP
  • btfss MEMTMP,4 ; le bit 4 de MEMTPM est il a 1
  • goto up_fw_send ; non, envoyer comme ca
  • clrf MOTOR ; oui, raz MOTOR
  • bsf MOTOR,0 ; MOTOR = 0001
  • movf MOTOR,W ; on place MOTOR dans W
  • up_fw_send movwf MOTOR ; on place W dans MOTOR
  • return
  • sorties ; clrf PORTA
  • movf MOTOR,W
  • movwf PORTA
  • return
  • ;-------------------------------------------------------------
  • ; Routine de redemarrage
  • boot MOVLW B'00000111' ; Disable Comparator module's
  • MOVWF CMCON
  • BSF STATUS,RP0 ; Switch to register bank 1
  • ; Disable pull-ups
  • ; INT on rising edge
  • ; TMR0 to CLKOUT
  • ; TMR0 Incr low2high trans.
  • ; Prescaler assign to Timer0
  • ; Prescaler rate is 1:256
  • MOVLW B'11010111' ; Set PIC options (See datasheet).
  • MOVWF OPTION_REG ; Write the OPTION register.
  • ; MOVLW B'10001000'
  • ; MOVWF INTCON
  • CLRF INTCON ; Disable interrupts
  • movlw B'00000000' ; all RA ports are outputs
  • movwf TRISA
  • movlw B'11111111'
  • movwf TRISB ; RB7...RB0 are inputs.
  • bcf STATUS,RP0 ; Switch Back to reg. Bank 0
  • ;-------------------------------------------------------------
  • ; Initialisation de valeurs de variables
  • clrf PORTA ; Clear PORTA
  • clrf MOTOR
  • bsf PORTA,0
  • movf PORTA,W
  • movwf MOTOR
  • ; Reglage de la vitesse de depart. Represente la temporisation
  • ; qui sera appellee entre chaque pas
  • movlw 0xFF ; 0xFF = lent; 0x41 = rapide
  • movwf MINI
  • movwf TIMER_VALUE
  • ; Reglage de la vitesse de fin d'acceleration
  • movlw 0x40 ; Vitesse mini
  • movwf MAXI
  • movlw 0x10
  • movwf RAMPE
  • clrf WORK
  • goto MENU ; Aller au menu principal
  • MENU call entrees
  • call traitement
  • call sorties
  • GOTO MENU ;Aller à MENU
  • END
#include <p16f627.inc>




	__CONFIG        _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC

	CBLOCK 0x020
	TIMER1 :1			; Variable decomptee lors d'un tempo
	TIMER2 :1			; Variable decomptee lors d'un tempo
	BTN :1				; Variable de stockage des boutons du pas
	TIMER_VALUE :1			; Variable pour regler le temps a decompter
	MAXI :1				; Vitesse maximale (voir initialisation).
	MINI :1				; Vitesse minimale.
	MEMTMP :1			; variable temporaire
	COUNT :1			; Variable decomptee dans la validation
	RAMPE :1			; pente d'acceleration
	MOTOR :1			; sorties vers moteur
	WORK : 1			; bit 0 = forward
					; bit 1 = backward
					; bit 2 = marche
					; bit 3, 4 et 5 = gestion rampe. 
					; 543
					; 1xx => en roue libre, seuil atteint
					; 000 => en pause, a l'arret.
					; 001 => acceleration
					; 010 => decceleration
					; 011 => situation impossible
					; bit 7 = Bouton enfonce
					; 
;	w_temp :1
;	status_temp :1
	ENDC				; Fin de la zone
		;-------------------------------------------------------------
		; vecteur de redemarrage
		ORG 	H'0000'		; Emplacement appelé au reset du PIC
		GOTO	boot		; Aller à la routine boot
		;-------------------------------------------------------------
		; Temporisation
tempo		MOVF	TIMER_VALUE,W	; Chargement de la duree de temporisation dans W
                MOVWF   TIMER2		; Move W to TIMER2
DEL_LOOP1       MOVF	TIMER_VALUE,W	; Chargement de la duree de temporisation dans W
                MOVWF   TIMER1		; Move W to TIMER1
DEL_LOOP2	DECFSZ  TIMER1,F	; Decrement de TIMER1, sauter suivant si zero
                GOTO    DEL_LOOP2	; TIMER1 > 0 => decompter encore
                DECFSZ  TIMER2,F	; Decrement de TIMER2, sauter suivant si zero
                GOTO    DEL_LOOP1	; TIMER2 > 0 => decompter encore
		RETLW   0		; Retour en mettant W a zero

entrees		movf	PORTB, W	; Le portB est place dans W
		sublw	D'0'		; 0 en est soustrait
		btfss	STATUS, Z	; pour faire monter le bit Z si W=0
		goto	entrees_s	; non, le bit Z=0; un bouton a ete enfonce
		goto	entrees_end	; oui, le bit Z=1; on saute a la fin
entrees_s	movf	PORTB,w		; le portB est replace dans W
		movwf	BTN		; pour etre range dans BTN
entrees_end	return



traitement	btfsc	BTN, 0		; bouton "aller en avant" ?
		goto	traitement_dbw	; oui, traiter le ralentissement recul
		btfsc	BTN, 1		; bouton "aller en arriere" ?
		goto	traitement_dfw	; oui, traiter le ralentissement avant
		btfsc	BTN, 2		; bouton "arreter" ?
		goto	traitement_sfw	; oui, traiter l'arret avant
		return

traitement_sfw	btfss	WORK,0		; est on en marche avant ?
		goto	traitement_sbw	; non, traiter l'arret arriere
		bcf	WORK, 5		; oui, raz du seuil atteint
		call	down_fw		; ralentir marche avant
		return

traitement_sbw	btfss	WORK, 1		; est on en marche arriere ?
		bcf	WORK, 5		; raz du seuil atteint
		call	down_bw		; oui, ralentir marche arriere
		return


traitement_dfw	btfss	WORK, 0		; est on en marche avant ?
		goto	traitement_gbw	; non, traiter le recul
		bcf	WORK, 5		; oui, raz du seuil atteint
		call	down_fw		; ralentir marche avant
		return

traitement_gbw	btfss	WORK, 1		; est on en marche arriere ?
		goto	traitement_ubw	; non, traiter l'acceleration arriere
		bcf	WORK, 5		; raz du seuil atteint
		call	go_bw		; oui, aller en arriere
		return

traitement_ubw	call	up_bw		; accelerer en arriere
		return

traitement_dbw	btfss	WORK, 1		; est on en marche arriere ?
		goto	traitement_gfw	; non, traiter la marche avant
		bcf	WORK, 5		; raz du seuil atteint
		call	down_bw		; oui, ralentir marche arriere
		return

traitement_gfw	btfss	WORK, 0		; est on en marche avant ?
		goto	traitement_ufw	; non, traiter l'acceleration en avant
		call	go_fw		; oui, aller en avant
		return

traitement_ufw	call	up_fw		; accelerer en avant
		return




down_fw		btfss	WORK, 5		; seuil atteint ?
		goto	down_fw_count	; non, continuer a compter
		goto	down_fw_end	; oui, aller a la fin
down_fw_count	movf	MINI, W		; placer MINI dans W
		subwf	TIMER_VALUE, W	; le soustraire a TIMER_VALUE
		btfss	STATUS,C	; est ce inferieur ou egal a zero
		goto	down_fw_up	; non, on peut diminuer la tempo entre pas
		bcf	WORK,0		; oui, on ne marche plus en avant
		btfsc	BTN,3		; arret demande ?
		return			; oui, on retourne
		goto	down_fw_end	; non, aller a la fin
down_fw_up	movf	TIMER_VALUE,W	; sinon, placer TIMER_VALUE dans W
		movwf	MEMTMP		; placer W dans une variable temporaire
		movf	RAMPE,W		; placer RAMPE dans W
		addwf	MEMTMP,W	; le soustraire a la variable temporaire
		movwf	TIMER_VALUE	; placer le resultat dans TIMER_VALUE
down_fw_end	call	tempo		; appeler la tempo avec cette valeur
		bcf	STATUS,C	; necessaire pour les 1 qui sortent du chapeau
		rlf	MOTOR,W		; 0001 devient 0010 dans W
		movwf	MEMTMP		; W est place dans MEMTMP
		btfss	MEMTMP,4	; le bit 4 de MEMTPM est il a 1 (10000)
		goto	down_fw_send	; non, envoyer comme ca
		clrf	MOTOR		; oui, raz MOTOR
		bsf	MOTOR,0		; MOTOR = 0001
		movf	MOTOR,W		; on place MOTOR dans W
down_fw_send	movwf	MOTOR		; on place W dans MOTOR
		return

go_bw		movf	TIMER_VALUE,W	; placer TIMER_VALUE dans W
		call	tempo		; appeler la tempo avec cette valeur
		bcf	STATUS,C	; necessaire pour les 1 qui sortent du chapeau
		rrf	MOTOR,W		; 0100 devient 0010 dans W
		movwf	MEMTMP		; W est place dans MEMTMP
		btfss	STATUS,C	; etait ce 0001 qui est entre dans le carry ?
		goto	go_bw_send	; non, envoyer comme ca
		bcf	MOTOR,0		; oui, donc la pre-sortie 1 est mise a zero
		bsf	MOTOR,3		; et la pre-sortie 3 est mise a 1
		movf	MOTOR,W		; MOTOR est place dans W
go_bw_send	movwf	MOTOR		; on place W dans MOTOR
		return

up_bw		btfss	WORK, 5		; seuil atteint ?
		goto	up_bw_count	; non, continuer a compter
		goto	up_bw_end	; oui, aller a la fin
up_bw_count	movf	TIMER_VALUE, W	; placer TIMER_VALUE dans W
		subwf	MAXI, W		; le soustraire a MAXI
		btfss	STATUS,C	; est ce inferieur ou egal a zero
		goto	up_bw_up	; non, on peut diminuer la tempo entre pas
		bsf	WORK,1		; on est maintenant en marche arriere
		goto	up_bw_end	; aller a la fin
up_bw_up	movf	TIMER_VALUE,W	; placer TIMER_VALUE dans W
		movwf	MEMTMP		; placer W dans une variable temporaire
		movf	RAMPE,W		; placer RAMPE dans W
		subwf	MEMTMP,W	; le soustraire a la variable temporaire
		movwf	TIMER_VALUE	; placer le resultat dans TIMER_VALUE
up_bw_end	call	tempo		; appeler la tempo avec cette valeur
		bcf	STATUS,C	; necessaire pour les 1 qui sortent du chapeau
		rrf	MOTOR,W		; 0100 devient 0010 dans W
		btfss	STATUS,C	; etait ce 0001 qui est entre dans le carry ?
		goto	up_bw_send	; non, envoyer comme ca
		bcf	MOTOR,0		; oui, il faut eteindre 1
		bsf	MOTOR,3		; et il faut rallumer 3
		movf	MOTOR,W		; MOTOR est place dans W
up_bw_send	movwf	MOTOR		; on place W dans MOTOR
		return



down_bw		btfss	WORK, 5		; seuil atteint ?
		goto	down_bw_count	; non, continuer a compter
		goto	down_bw_end	; oui, aller a la fin
down_bw_count	movf	MINI, W		; placer MINI dans W
		subwf	TIMER_VALUE, W	; le soustraire a TIMER_VALUE
		btfss	STATUS,C	; est ce inferieur ou egal a zero
		goto	down_bw_up	; non, on peut diminuer la tempo entre pas
		bcf	WORK,1		; on n'est plus en marche arriere
		btfsc	BTN,3		; arret demande ?
		return			; oui, on retourne
		goto	down_bw_end	; aller a la fin
down_bw_up	movf	TIMER_VALUE,W	; placer TIMER_VALUE dans W
		movwf	MEMTMP		; placer W dans une variable temporaire
		movf	RAMPE,W		; placer RAMPE dans W
		addwf	MEMTMP,W	; le soustraire a la variable temporaire
		movwf	TIMER_VALUE	; placer le resultat dans TIMER_VALUE
down_bw_end	call	tempo		; appeler la tempo avec cette valeur
		bcf	STATUS,C	; necessaire pour les 1 qui sortent du chapeau
		rrf	MOTOR,W		; 0100 devient 0010 dans W
		btfss	STATUS,C	; etait ce 0001 qui est entre dans le carry ?
		goto	down_bw_send	; non, envoyer comme ca
		bcf	MOTOR,0		; oui, il faut eteindre 1
		bsf	MOTOR,3		; et il faut rallumer 3
		movf	MOTOR,W		; MOTOR est place dans W
down_bw_send	movwf	MOTOR		; on place W dans MOTOR
		return

go_fw		movf	TIMER_VALUE,W	; placer TIMER_VALUE dans W
		call	tempo		; appeler la tempo avec cette valeur
		bcf	STATUS,C	; necessaire pour les 1 qui sortent du chapeau
		rlf	MOTOR,W		; 0001 devient 0010 dans W
		movwf	MEMTMP		; W est place dans MEMTMP
		btfss	MEMTMP,4	; le bit 4 de MEMTPM est il a 1
		goto	go_fw_send	; non, envoyer comme ca
		clrf	MOTOR		; oui, raz MOTOR
		bsf	MOTOR,0		; MOTOR = 0001
		movf	MOTOR,W		; on place MOTOR dans W
go_fw_send	movwf	MOTOR		; on place W dans MOTOR
		return



up_fw		btfss	WORK, 5		; seuil atteint ?
		goto	up_fw_count	; non, continuer a compter
		goto	up_fw_end	; oui, aller a la fin
up_fw_count	movf	TIMER_VALUE, W	; placer TIMER_VALUE dans W
		subwf	MAXI, W		; le soustraire a MAXI
		btfss	STATUS,C	; est ce inferieur ou egal a zero
		goto	up_fw_up	; non, on peut diminuer la tempo entre pas
		bsf	WORK,5		; oui, on a atteint le seuil
		bsf	WORK,0		; on est en marche avant
		goto	up_fw_end	; aller a la fin
up_fw_up	movf	TIMER_VALUE,W	; placer TIMER_VALUE dans W
		movwf	MEMTMP		; placer W dans une variable temporaire
		movf	RAMPE,W		; placer RAMPE dans W
		subwf	MEMTMP,W	; le soustraire a la variable temporaire
		movwf	TIMER_VALUE	; placer le resultat dans TIMER_VALUE
up_fw_end	call	tempo		; appeler la tempo avec cette valeur
		bcf	STATUS,C	; necessaire pour les 1 qui sortent du chapeau
		rlf	MOTOR,W		; 0001 devient 0010 dans W
		movwf	MEMTMP		; W est place dans MEMTMP
		btfss	MEMTMP,4	; le bit 4 de MEMTPM est il a 1
		goto	up_fw_send	; non, envoyer comme ca
		clrf	MOTOR		; oui, raz MOTOR
		bsf	MOTOR,0		; MOTOR = 0001
		movf	MOTOR,W		; on place MOTOR dans W
up_fw_send	movwf	MOTOR		; on place W dans MOTOR
		return



sorties	;	clrf	PORTA
		movf	MOTOR,W
		movwf	PORTA
		return
		;-------------------------------------------------------------
		; Routine de redemarrage
boot		MOVLW	B'00000111'	; Disable Comparator module's
		MOVWF	CMCON
		BSF	STATUS,RP0	; Switch to register bank 1
					; Disable pull-ups
					; INT on rising edge
					; TMR0 to CLKOUT
					; TMR0 Incr low2high trans.
					; Prescaler assign to Timer0
					; Prescaler rate is 1:256
		MOVLW	B'11010111'	; Set PIC options (See datasheet).
		MOVWF	OPTION_REG	; Write the OPTION register.
;		MOVLW	B'10001000'
;		MOVWF	INTCON
		CLRF	INTCON		; Disable interrupts
		movlw	B'00000000'	; all RA ports are outputs
		movwf	TRISA
		movlw	B'11111111'
		movwf	TRISB		; RB7...RB0 are inputs.
		bcf	STATUS,RP0	; Switch Back to reg. Bank 0
		;-------------------------------------------------------------
		; Initialisation de valeurs de variables
		clrf	PORTA		; Clear PORTA
		clrf	MOTOR
		bsf	PORTA,0
		movf	PORTA,W
		movwf	MOTOR
		; Reglage de la vitesse de depart. Represente la temporisation
		; qui sera appellee entre chaque pas
		movlw	0xFF		; 0xFF = lent; 0x41 = rapide
		movwf	MINI
		movwf	TIMER_VALUE
		; Reglage de la vitesse de fin d'acceleration
		movlw	0x40		; Vitesse mini
		movwf	MAXI
		movlw	0x10
		movwf	RAMPE

		clrf	WORK
		goto	MENU		; Aller au menu principal

MENU		call	entrees	
		call	traitement
		call	sorties
		GOTO	MENU		;Aller à MENU
		END

 Conclusion

J'adore la mise en page du code assembleur. De plus, l'intégralité du code s'affiche sur le site asmFR.com et c'est chouette.


 Sources du même auteur

REGPROG -:- ENREGISTRER UNE SÉQUENCE DANS UN PIC

 Sources de la même categorie

Source avec Zip MODULATION DE LARGEUR D'IMPULSION (PWM) par Eneur
REGPROG -:- ENREGISTRER UNE SÉQUENCE DANS UN PIC par bermudos
Source avec une capture [PIC] FIRMWARE ALTERNATIF POUR LA CARTE PROTO DE POB TECHNOL... par korpus
Source avec Zip SAUT AVEC TROIS IMPULSIONS par ariane2005
Source avec Zip LED ROTATE par ariane2005

 Sources en rapport avec celle ci

Source avec une capture [PIC] FIRMWARE ALTERNATIF POUR LA CARTE PROTO DE POB TECHNOL... par korpus
Source avec Zip Source avec une capture DEBUT D'UN MOTEUR 3D par VBFRANCE
Source avec Zip PETIT MOTEUR 3D EN TASM32 par haku_arsene

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

moteur de recherche interne [ par UnAngeDeNature ] Bonjour, j'aimerais bien trouver un coup de main pour finaliser mon moteur de recherche interne qui se trouve là ---&gt;     http://taurace.free.fr/mo moteur pas a pas avec pic 16F84 [ par ninnoucha ] svp je debute avec les microcontroleurs et je veux commander un moteur pas a pas unipolaire avec des boutons poussoirs en mode demi pas avec un pic 16


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,544 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales