; ;******************************************************************** LIST P = 16C84 LIST F = INHX8M INCLUDE "PIC84JW.H" ; ; Transmission série asynchrone type RS232 9600 bauds ;********************************************************************* ; ; PRÉSENTATION DU PROGRAMME ; ; Ce programme tourne sur un PIC16C84. ; ; ; PRINCIPE : ; Le composant a pour rôle d'assurer le dialogue entre un boîtier de ; commande (stepper) de moteur pas à pas et un poste de contrôle (PC ou MCU). ; Boîtier de commande du moteur pas a pas (stepper) : ; Ce boîtier dispose d'un bus 8 bits bidirectionnel permettant de ; charger le nombre de pas à effectuer puis de lire la position ; du moteur; le contrôle du bus est effectué par la broche OE : ; OE = 0 : le microcontrôleur charge la valeur sur le bus ; OE = 1 : le moteur démarre et on peut lire son état sur le bus ; ; Le boîtier dispose de 2 autres lignes de contrôle, il s'agit de SENS ; (échantillonné par OE = 0) pour définir le sens de rotation et de BUTÉE ; qui informe du passage en butée (le moteur s'arrête alors automatiquement). ; ; PROTOCOLE ; La transmission se fait en liaison série asynchrone de mots de 8 bits ; sans parité à 9600 bauds, soit : ; ; |Start|D7|D6|D5|D4|D3|D2|D1|D0|Stop|Stop| ; 0 x x x x x x x x 1 1 ; ; Envoi du message de commande : ; Comme il n'y a pas de contrôle de la transmission, on choisit de transmettre ; le message, on (le PC) attend un accusé réception du PIC puis on renvoie le même ; message qui, s'il est identique est alors validé. ; ; Retour de l'état du moteur : ; Il n'y a pas de contrôle particulier à faire puisqu'il s'agit juste d'une information ; et non d'une commande. ; ; ; L'oscillateur à quartz utilisé génère une fréquence de 1,8432 MHz, cela ; donne une fréquence interne de 460,8 kHz (T= 2,17 µs); avec une prédivision par 2 ; du timer on obtient un comptage de 24 cycles pour la durée d'un bit à 9600 bauds. ; ; Brochage : Port B : Bus vers le boîtier de commandes ; Port A : 0 : OE ; 1 : SENS ; 2 : Butée ; 3 : TX ; 4 : RX ;****************************** Déclarations ********************************** ; ; Programme : rs_sat.ASM ; Date de Révision : mars 96 ;****************************** Déclarations *********************************** ; ; Attribution des broches du port A OE equ 0 ; Sortie de contrôle de bus (0 : PIC --> Stepper) SENS equ 1 ; Sortie d'indication du sens de rotation BUTEE equ 2 ; Entrée d'indication de butée TX equ 3 ; sortie TX sur le port A RX equ 4 ; Entrée Rx sur le port A ; définition des flags F_EM equ 0 ; flag d'émission F_REC equ 1 ; flag de réception F_SENS equ 2 ; sens de rotation F_ARRET equ 3 ; flag d'état du moteur F_BUTEE equ 4 ; flag de passage en butée F_ERR equ 4 ; flag d'erreur de réception ; Constantes pour le moteur pas à pas STEP1 equ B'00011111' STEP2 equ B'01011111' STEP3 equ B'01001111' STEP4 equ B'01101111' STEP5 equ B'00101111' STEP6 equ B'10101111' STEP7 equ B'10001111' STEP8 equ B'10011111' ; variables pour le comptage du timer T_9600 equ D'145' ; valeur permettant la vitesse de 9600 bauds ; ; VARIABLES org RAM flags res 1 ; mot d'indication de l'état du contrôleur tours res 1 ; nombre de tours à effectuer mot_rx res 1 ; mot reçu mot_tx res 1 ; mot émis mot_cmd res 1 ; mot de commande mot_tmp res 1 ; mot tampon var res 1 var2 res 1 curseur res 1 ; positionnement dans le mot à la transmission machine res 1 ; position de la machine d'état ; ;******************************************************************************** ORG PIC84 GOTO START ;******************************************************************************** ; retour d'interruption du timer org RETOUR_INT movlw B'10000000' ; INTCON : GIE=1 ; EEIE=0 ; TOIE=0 ; INTE=0; flags à 0 movwf INTCON ; Positionnement des int et des flags xorwf var2,F skpz bcf PORT_A,BUTEE skpnz bsf PORT_A,BUTEE RETFIE ;******************************************************************************** ; Initialisation des ports et effacement de l'affichage START BSF STATUS,RP0 ; Passage au banc mémoire 1 movlw B'10000000' ; INTCON : GIE=1 ; EEIE=0 ; TOIE=0 ; INTE=0; flags à 0 movwf INTCON ; Positionnement des int et des flags movlw H'00' movwf TRISB ; Tous les bits du port B en sortie movlw B'10000' ; RX:E ; TX:S ; Butée:S ; Sens:S ; OE:S movwf TRISA ; Configuration du port A movlw B'00000000' ; w : T0CS,T0SE,PSA=0, PS[2:0] movwf OPT ; Règlage du timer RTCC (1:2) sur horloge interne BCF STATUS,RP0 ; Retour au banc mémoire 0 ; ; initialisation des variables clrf tours ; on initialise les tours à 0 clrf flags ; on initialise les flags clrf mot_rx ; on initialise le mot de réception à 0 clrf var2 clrf machine clrf PORT_B movlw H'FF' movwF mot_tx ; on initialise le mot d'émission à h'FF' movwF mot_cmd ; on initialise le mot de commande à h'FF' bsf PORT_A,TX call INIT_SYSTEME ;******************************************************************************** MAIN clrf mot_tmp btfsc PORT_A,RX ; RA4 est-il actif (à 0) goto MAIN call RECEPTION ; RA4 est à 0, on démarre la réception du mot de commande movfw mot_rx movwf mot_tmp movwf mot_tx call EMISSION MAIN2 btfsc PORT_A,RX ; RA4 est-il actif (à 0) goto MAIN2 movfw mot_tmp skpnz goto MAIN ; erreur de synchro => retour à la case départ subwf mot_rx,W skpnz goto MAIN3 ; pas le même message => retour à la case départ movlw H'FF' movwf mot_tx call EMISSION goto MAIN MAIN3 movfw mot_rx subwf mot_cmd,W movwf tours bsf flags,F_SENS ; on tourne à droite skpnc bcf flags,F_SENS ; on tourne à gauche skpc negf tours,F skpnc decf tours,F movfw mot_rx movwf mot_cmd call VAS_Y movlw H'00' movwf mot_tx call EMISSION goto MAIN ; à la case départ ;******************************************************************************** RECEPTION movlw D'9' ; on a 8 bits à lire movwf curseur ; curseur sert à se positionner dans le mot movlw T_9600 ; initialisation du timer movwf RTCC ; pour avoir les tops à 9600 bauds REC1 call ATTENTE_TIMER clrc btfsc PORT_A,RX setc rrf mot_rx,F decfsz curseur,F goto REC1 ; incfsz mot_rx,W ; si le mot reçu est H'FF', alors retour ; goto MAIN call ATTENTE_TIMER ; Vérification du premier STOP bit (à 1) ; movlw H'FF' ; btfss PORT_A,RX ; movwf mot_rx ; Transmission erronée, alors : mot reçu = H'FF' call ATTENTE_TIMER ; Vérification du deuxième STOP bit (à 1) ; btfss PORT_A,RX ; movwf mot_rx ; Transmission erronée, alors : mot reçu = H'FF' call ATTENTE_TIMER ; Vérification du deuxième STOP bit (à 1) call ATTENTE_TIMER ; Vérification du deuxième STOP bit (à 1) call ATTENTE_TIMER ; Vérification du deuxième STOP bit (à 1) call ATTENTE_TIMER ; Vérification du deuxième STOP bit (à 1) FIN_REC return ;******************************************************************************** EMISSION movlw D'9' ; on a 8 bits à écrire movwf curseur ; curseur sert à se positionner dans le mot bcf PORT_A,TX ; bit de START (à 0) ; call ATTENTE_TIMER EM1 call ATTENTE_TIMER rrf mot_tx,F skpnc bsf PORT_A,TX skpc bcf PORT_A,TX decfsz curseur,F goto EM1 ; call ATTENTE_TIMER bsf PORT_A,TX call ATTENTE_TIMER bsf PORT_A,TX call ATTENTE_TIMER FIN_EM return ;******************************************************************************** INIT_SYSTEME movlw H'FF' ; comptage maximal movwf tours bcf flags,F_SENS ; on tourne à droite call VAS_Y ; on cale le système à droite movlw H'7F' ; comptage moitié movwf tours movwf mot_cmd bsf flags,F_SENS ; on tourne à droite call VAS_Y ; on cale le système au centre return ;******************************************************************************** ATTENTE_TIMER movlw T_9600 ; initialisation du timer movwf RTCC ; pour avoir les tops à 9600 bauds bsf INTCON,T0IE ; on valide le timer ATT1 btfsc INTCON,T0IE ; on boucle en attente d'une interruption goto ATT1 return ;******************************************************************************** VAS_Y movf tours,F skpnz return BSF STATUS,RP0 ; Passage au banc mémoire 1 movlw B'00000111' ; w : T0CS,T0SE,PSA=0, PS[2:0] movwf OPT ; Règlage du timer RTCC (1:256) sur horloge interne BCF STATUS,RP0 ; Retour au banc mémoire 0 movfw machine call RENVOI_STEP movwf PORT_B btfsc flags,F_SENS decf machine,F btfss flags,F_SENS incf machine,F decf tours,F call ATTENTE_TIMER BSF STATUS,RP0 ; Passage au banc mémoire 1 movlw B'00000000' ; w : T0CS,T0SE,PSA=0, PS[2:0] movwf OPT ; Règlage du timer RTCC (1:2) sur horloge interne BCF STATUS,RP0 ; Retour au banc mémoire 0 goto VAS_Y return ;******************************************************************************** RENVOI_STEP andlw H'07' ; la table ne contient que 8 entrées addwf PC,F retlw STEP1 retlw STEP2 retlw STEP3 retlw STEP4 retlw STEP5 retlw STEP6 retlw STEP7 retlw STEP8 ;******************************************************************************** END