télécharger le projet.
Transcription
télécharger le projet.
PARIS Mathieu BISMUTH Eytan Groupe G2 Le 6 février 2006 Tuteur : M. Fiol 1 Introduction au projet tuteuré A partir du mois d’octobre, il nous a été demandé de réaliser un projet nommé projet tuteuré. Le principe de ce projet est de laisser, durant trois mois, travailler les étudiants, en 2eme année, par binôme sur un sujet proposé par eux-mêmes ou par leur tuteur de projet. Le but est de placer les étudiants en situation d’autonomie, sur un projet à réaliser en dehors des heures de cours, et bien entendu en dehors de l’IUT et de sa logistique. Pour leur faire acquérir des méthodes de travail qui leur serviront dans le monde du travail. Bien entendu, les étudiants ne sont pas lâchés dans la nature pour autant puis qu’un tuteur de projet leur est octroyé parmi les enseignants disponibles. Le rôle de celui-ci est d’aiguiller la réalisation du projet et de conseiller les étudiants si besoin est. Mais surtout, son rôle est de noter le projet une fois celui-ci terminé. N’ayant eu qu’une vague idée de projet, Mr.Fiol, notre tuteur nous a proposé la réalisation d’un système de motorisation de monture équatoriale assisté par microprocesseur. Ce rapport fait état de l’avancement de notre projet jusqu’à son terme. 2 SOMMAIRE I) Cahier des charges………………………….P4 II) La monture équatoriale……………………..P8 III) L’affichage LCD……………………………P9 IV) Le GD-200S…………………………….…P15 V) Schéma électrique…………………………P19 VI) Boite.………………………………………P25 VII) Programmation d’un système…………..…P26 VIII) Conclusions…………………………..........P36 IX) Annexe : listing du programme.…………...P39 3 Cahier des charges I) Présentation du projet Ce projet tuteuré rendra compte de l’étude d’un système de commande de motorisation de l’ascension droite d’une monture équatoriale de télescope appliqué à l’observation astronomique. Pour ce faire, le pilotage sera réalisé par un système autonome et facilement transportable La programmation de la partie commande se fera grâce à l’utilisation d’un microprocesseur. Celui-ci devra piloter le moteur du système, au travers d’une interface puissance, et permettre à l’utilisateur de pouvoir modifier les paramètres du système presque en temps réel, si ce n’est le cas. II) Architecture fonctionnelle Partie Commande Clavier pour accéder au paramétrage et pour piloter les manœuvres du télescope Partie Puissance Syst. A µC 16F876 Interface puissance Pour moteur pas à pas bipolaire Mot pas à pas Bipolaire Visualisation des paramètres du système Batt. 12V 4 III) Les fonctions Après une mise en station manuelle du télescope par l’utilisateur, le logiciel de commande offrira plusieurs possibilités : - Pilotage automatique : Une compensation du mouvement de rotation de la terre grâce à un pilotage automatique de la partie puissance. - Pilotage manuel : Un réglage manuel des axes du télescope géré par l’utilisateur. - Paramètres : réglages de paramètres relatifs aux caractéristiques moteurs et aux vitesses de pilotages. IV) Contraintes Ce système doit pouvoir être adaptable à la plupart des montures équatoriales disponibles sur le marché. Comme le système doit être facilement transportable et utilisable en plein air, donc loin des réseaux de distribution électrique, l’alimentation du montage devra être entièrement réalisée et desservie par une batterie de 12V. V) Choix du matériel et résolution des problèmes Nous avions plusieurs possibilités pour le choix des matériels. a) Microprocesseur : Pour le microprocesseur une large gamme d’appareils s’offrait à nous. Néanmoins, pour rester sur quelque chose que nous connaissions, nous avons donc décidé de nous tourner vers la technologie Microchip avec le PIC 16F876 que nous avions déjà abordé en travaux de réalisation pour plusieurs raisons évidentes. - La première, et la plus importante, est que le logiciel de programmation de Microchip est gratuit. Nous n’aurions donc pas besoin de tomber dans l’illégalité pour programmer notre PIC. 5 - Ensuite, ce PIC utilise un langage RISC. Autrement dit, le nombre de mnémoniques disponibles est réduit à 35, ce qui facilite l’écriture - Nous avions choisi précisément ce PIC pour son nombre de ports disponibles. Comme nous devions commander un moteur, un afficheur et utiliser un clavier, nous avons préféré voir large sur le nombre d’entrées/sorties disponible. b) Afficheur : Le choix du composant s’imposait, ici, quasiment de luimême. A la question Quel écran devons nous prendre pour l’utiliser avec un microprocesseur ? La réponse est bien entendu un afficheur à cristaux liquides. L’afficheur permettrait à l’utilisateur de rentrer dans quelques menus de configurations de paramètres systèmes. Dans cette optique, il nous faudrait donc écrire successivement un nom de paramètre et sa variable. Ce qui revenait à écrire une trentaine de caractères par paramètre sur l’afficheur. Nous avons alors opté pour un afficheur deux lignes et 40 caractères (16 sur la première ligne, 24 sur la 2eme). c) Interface puissance du moteur : Il nous a été directement imparti de réaliser cette interface avec un GS-D200S, matériel conçu exclusivement pour piloter un moteur pas à pas bipolaire à partir d’un microprocesseur. Nous n’avons donc pas cherché plus loin de ce côté si pour voir si l’on pouvait trouvé un meilleur module. d) Moteur : Là aussi nos recherches ont été simplifiées. Comme le GSD200S sert exclusivement au pilotage de moteurs pas à pas bipolaires. Le choix du moteur nous sautait aux yeux. Ce qui nous a conduit par la suite à choisir un moteur pas à pas bipolaire 200 pas par tour, même si nous voulions que tout type de moteur soit adaptable au système (entendre par là que l’on pourrait changer ce moteur par un moteur X pas par tour). 6 e) Le clavier : Comme pour l’afficheur nous n’avions pas une infinité de solutions. Il nous fallait un système de clavier simple que l’on pourrait très facilement lier au microprocesseur. C’est pour cela que nous avons choisi d’utiliser des boutons poussoirs. Il ne nous fallait pas de boutons superflus, un bouton prenant une entrée, il ne fallait pas que l’on s’amuse à en mettre une dizaine. Nous avions deux objectifs. Avoir le moins de boutons possibles mais aussi qu’un bouton ne serve pas à remplir plusieurs fonctions. En mettre 4 semblait un bon compromis. Un bouton pour accéder au menu de l’afficheur, un bouton pour faire défiler les sous-menus et deux boutons + et – pour modifier les paramètres ou la position du télescope en mode manuel. 7 La monture équatoriale : présentation Qu’est ce qu’une monture équatoriale ? C'est une monture (ou partie mécanique de l'instrument) qui permet de compenser la rotation de la Terre manuellement ou automatiquement. Sans monture équatoriale, l'image sort du champ de vision et il faut alors repointer l'objet visé. Principe de la monture équatoriale Un télescope équipé de ce type de monture possède deux axes. Le premier, appelé axe polaire ou horaire ou encore axe d’ascension droite est parallèle à l’axe de rotation de la Terre ; le second, appelé axe de déclinaison, est perpendiculaire au premier. Si l’on donne à l’axe horaire une vitesse égale à la vitesse de la Terre mais en sens opposé, il y a compensation des deux vitesses et un objet céleste observé reste fixe dans le champ de l'oculaire. Pour une monture automatisée, une seule motorisation est donc nécessaire (mais une deuxième peut être souhaitable). La monture suppose un réglage de latitude correspondant à celle du lieu d’observation. 8 L’afficheur LCD I) Introduction Les afficheurs LCD (Liquid Crystal Display) à logique intégrée sont un moyen pratique et efficace pour afficher des informations par microprocesseur. Plusieurs afficheurs sont disponibles sur le marché et diffèrent les uns des autres, non seulement par leurs dimensions, (de 1 à 4 lignes de 6 à 80 caractères), mais aussi par leurs caractéristiques techniques et leur tension de service. Certains sont dotés d'un rétro éclairage de l'affichage. Cette fonction fait appel à des LED montées derrière l'écran du module, cependant, cet éclairage est gourmand en intensité (de 80 à 250 mA). Il existe deux modèles d'interfaces normalisées : Une version "parallèle" et une version série. Les versions séries utilisent bien sur moins d'E/S, mais elles monopolisent une liaison série. Nous ne parlerons ici que des versions parallèles. II) La connexion L'interface avec la version parallèle comporte 16 ports. • • • • • • • • • • • • • • • • 1 masse 2 +5V 3 références pour le contraste 4 RS 5 R/W 6E 7 Data 0 (D0) 8 Data 1 (D1) 9 Data 2 (D2) 10 Data 3 (D3) 11 Data 4 (D4) 12 Data 5 (D5) 13 Data 6 (D6) 14 Data 7 (D7) 15 LED A 16 LED K 9 Broche Nom Niveau 1 Vss Masse Fonction 2 Vdd - 3 Vo 0-5V RS Sélection du registre (Register Select) Grâce à cette broche, l’afficheur est capable de faire la différence entre TTL une commande et une donnée. Un niveau bas indique une commande et un niveau haut indique une donnée. 4 Alimentation positive +5V Cette tension permet, en la faisant varier entre 0 et +5V, le réglage du contraste de l’afficheur. Lecture ou écriture (Read/Write) TTL L : Écriture H : Lecture 5 R/W 6 E TTL 7 D0 TTL 8 9 D1 TTL D2 TTL 10 D3 TTL 11 D4 TTL 12 D5 TTL 13 D6 TTL 14 D7 TTL 15 A - Anode rétro éclairage (+5V) 16 K - Cathode rétro éclairage (masse) Entrée de validation (Enable) active sur front descendant. Le niveau haut doit être maintenue pendant au moins 450 ns à l'état haut. Bus de données bidirectionnel 3 états (haute impédance lorsque E=0) Pour utiliser le LCD, il faut l'alimenter en +5V. Ensuite il faut relier les entrées de contrôles RS, R/W et E au microcontrôleur ainsi que les bits D0 à D7. Cependant, on peut choisir pour un gain d’entrées/sorties sur le microprocesseur de ne relier que les 4 bits de poids forts (à savoir D4 D5 D6 D7). Ce mode est appelé le mode 4 bits tandis que celui où tout les bits sont reliés est appelé le mode 8 bits. 10 III) La mémoire L’afficheur possède deux types de mémoire, la DD RAM et la CG RAM. La DD RAM est la mémoire d'affichage et la CG RAM est la mémoire du générateur de caractères. La mémoire d'affichage (DD RAM) La DD RAM est la mémoire qui stocke les caractères actuellement affichés à l'écran. Pour un afficheur de 2 lignes de 16 caractères, les adresses sont définies de la façon suivante : Ligne Visible Invisible Haut 00H..........0FH 40H..........4FH Bas 10H..........27H 50H..........67H L'adresse 00H correspond à la ligne du haut à gauche, 0FH à droite. L'adresse 40H correspond à la ligne du haut à gauche, 4FH à droite. La zone invisible correspond à la mémoire de l'afficheur (48 caractères). La mémoire du générateur de caractères (CG RAM) Le générateur de caractère est quelque chose de très utile. Il permet la création d'un maximum de 8 caractères ou symboles 5x7. Une fois programmés les nouveau caractères peuvent être accédés comme s'ils était dans le jeu de caractères classique, stocké en ROM. Cependant comme nous ne l’utiliserons pas pour notre projet, nous ne détaillerons pas plus cette partie. IV) Mode 8 bits / mode 4 bits et commandes standard Mode 8 bits: Dans ce mode 8 bits, les données sont envoyées à l’afficheur sur les broches D0 à D7. On place la ligne RS à 0 ou à 1 selon que l'on désire transmettre une commande ou une donnée. Il faut aussi placer la ligne R/W à 0 pour indiquer à l’afficheur que l'on désire effectuer une écriture. Il reste à envoyer une impulsion d'au moins 450 ns sur l'entrée E, pour indiquer que des données 11 valides sont présentes sur les broches D0 à D7. L’afficheur lira la donnée sur le front descendant de cette entrée. Si on désire au contraire effectuer une lecture, la procédure est identique, mais on place cette fois la ligne R/W à 1 pour demander une lecture. Les données seront valide sur les lignes D0 à D7 lors de l'état haut de la ligne E. Mode 4 bits: Il peut, dans certains cas, être nécessaire de diminuer le nombre de fils utilisés pour commander l’afficheur, comme, par exemple lorsqu'on dispose de très peu de broches d'entrées sorties disponibles sur un microcontrôleur. Dans ce cas, on peut utiliser le mode quatre bits de l’afficheur LCD. Dans ce mode, seuls les 4 bits de poids fort (D4 à D7) de l’afficheur sont utilisées pour transmettre les données et les lire. Les 4 bits de poids faible (D0 à D3) sont alors connectés à la masse. On a donc besoin, hors alimentation de sept fils pour commander l’afficheur. Les données sont alors écrites ou lues en envoyant séquentiellement les quatre bits de poids fort suivi des quatre bits de poids faible. Une impulsion positive d'au moins 450 ns doit être envoyée sur la ligne E pour valider chaque demi-octet ou nibble. Il se peut qu'on dispose encore de moins de broches disponibles dans l'application envisagée. Dans ce cas, on peut alors relier la ligne R/W à la masse de façon à forcer l’afficheur en écriture. On a alors besoin, hors alimentation de seulement six fils en mode 4 bits, et dix fils en mode 8 bits, pour commander l’afficheur, mais on ne peut alors plus relire l’afficheur. Ceci n'est pas gênant dans la mesure où on sait ce qu'on a écrit sur l’afficheur, mais on ne peut alors plus relire le flag Busy. Il faut alors utiliser des temporisations après chaque écriture sur l’afficheur. On perd alors un peu en temps d'affichage, mais on gagne une broche d'entrée sortie. Dans les deux modes, on peut, après chaque action sur l’afficheur, vérifier que celui-ci est en mesure de traiter l'information suivante. Pour cela, il faut demander une lecture en mode commande, et tester le flag Busy BF. Lorsque BF=0, l’afficheur est près à recevoir une nouvelle commande ou donnée. 12 Jeu de commandes : Instructions Code RS R/W D7 D6 D5 D4 D3 D2 D1 D0 Clear Display 0 Return home Entry mode set 0 0 Display 0 on/off control Cursor and display shift Function set 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Description Durée 0 Efface l'ensemble de la mémoire de donnée sans toucher au générateur de 1 caractères. Ramène le curseur en position « home », à l'adresse 00. 1,64 ms 1 Ramène le curseur en position « home », à l'adresse 00. Si l'affichage X était décalé, il est remis à sa position d'origine : l'adresse 00 se trouve à nouveau en haut à gauche. 1,64 ms 0 0 0 Définit le sens de déplacement du curseur après l'apparition d'un caractère (vers la gauche si 1 I/D S I/D=1, vers la droite si 40 µs I/D=0) et si l'affichage accompagne le curseur dans son déplacement ou non (S). 1 0 0 0 Deplace le curseur (S/C=1) ou l'affichage (S/C=0) d'une position vers la 1 S/C R/L X X 40 µs gauche (R/L=1) ou la droite (R/L=0) sans changer la DD RAM. 1 DL N D Met l'affichage en ou hors fonction l'affichage (D), le C B curseur (C), le clignotement du curseur (B). F 40 µs Définit la taille de l'interface (DL=0 pour mode 4 bits, DL=1 pour mode 8 bits), le nombre de lignes (NL=0 pour 1 ligne, X X 40 µs N=1 pour 2 ou 4 lignes), et la taille des fontes (F=0 pour des caractères 5x7, F=1 pour des caractères 5x10). 13 Set CG RAM 0 address Set DD RAM 0 address 0 0 Définit l'adresse de la CG RAM. Les données de la 1 A5 A4 A3 A2 A1 A0 CG RAM sont envoyées après cette commande. 40 µs 0 Définit l'adresse de la DD RAM. Les données de la 1 A6 A5 A4 A3 A2 A1 A0 DD RAM sont envoyées après cette commande. 40 µs Read busy flag & address 0 1 Lit le flag busy (BF), et l'adresse de la position du BF A6 A5 A4 A3 A2 A1 A0 curseur. BF vaut 0 si 1 µs l’afficheur accepte une instruction, 1 s'il est occupé Write data to CG or DD RAM 1 0 D7 D6 D5 D4 D3 D2 D1 D0 Ecrit des données dans la DD RAM ou la CG RAM. 40 µs Read data 1 1 D7 D6 D5 D4 D3 D2 D1 D0 Lit les données de la DD RAM ou de la CG RAM. 40 µs V) Jeu de caractères ASCII 14 Le GD-200S I) Présentation : Le GS-D200S est un module qui se relie directement au microprocesseur pour faciliter le pilotage des moteurs pas à pas bipolaires tout en réalisant l’interface puissance. Pour ce faire, en le cadençant par le microprocesseur, il génère luimême la séquence de conduction des phases pour permettre le déplacement des pas du moteur. Ce qui simplifie grandement l’élaboration d’un programme de contrôle de moteur. II) Diagramme de connexion : Voici comment se présente schématiquement le module 15 GND1 : masse Sync : synchronisation du gs-200s en externe /RESET : initialisation du module, et met les phases à leur état initial (ABCD = 0101) Half/full : Si 1 ou déconnecté, le mode demi pas est choisi Home : indique si les phases sont à leur état initial /Step clk : Le moteur se déplace d’un pas sur un front montant de cette entrée Cw/ccw : Si 1 ou déconnecté, le moteur tourne dans le sens horaire Osc : sert à modifier l’horloge de l’oscillateur interne du module Ioset : valeur de référence de l’intensité dans les phases Control : propagation rapide ou lente Enable : Après l’initialisation du module, doit être à 1 Vss : +5v VS : 45v max GND2 : masse ABCD : phases Voici comment se présente le module une fois relié au microprocesseur : Certaines entrées peuvent être laissées déconnectés selon l’utilisation, comme half/full home ou encore control, ce qui permet une économie d’entrées/sorties sur le microprocesseur. 16 III) Modes de pilotages : Le GS-D200S offre trois possibilités de pilotage de moteur : - Le mode « onde » qui ne fait fonctionner qu’une seule phase en même temps. Voici la séquence des phases : AB-CD-BA-DC - Le mode deux phases simultanées La séquence des phases est alors la suivante : AB&CD – CD&BA – BA&DC – DC&AB - Pour finir le mode demi pas, où comme son nom l’indique les déplacements sont divisés par deux. 17 La séquence est : AB – AB&CD – CD – CD&BA – BA – BA&DC – DC – DC&AB Nous avons décidé d’utiliser ce mode de pilotage pour notre projet pour 3 raisons. La première est qu’ainsi, l’entrée half/full est déconnectée, ce qui libère un bit d’un des ports du PIC. Deuxièmement, les déplacements sont plus nombreux et plus précis. Le temps d’attente entre chaque déplacement est plus court. 18 Schéma électrique I) Carte mère : J6 IN +5V OUT COM +12V 1 2 C10 C9 CON2 1uF 1uF 100 IN C2 R11 OUT COM IN 100 C5 C8 C3 100n 0 C12 C11 10u 100n 100n 0 OUT COM R12 1uF 1uF 0 0 CRY STAL Q3 0 0 R9 R10 U9 LM317L 3 D1 2 1 2 1 C1 1N4001 5V 10u D1N4148 D3 2.2k R8 D2 R5 0 D1N4148 220 10k R7 BC547 1k 0 1k D4 R1 D1N4148 0 0 Q2 BC547 0 2.2k R4 R2 C4 100n Q1 U19 R6 R3 10k 1k 0 0 C7 15p 0 D5 0 1k C6 1k R13 4.7k 1 PHONE JACK-O P2 1 14 2 15 3 16 4 17 5 18 6 19 7 20 8 21 9 22 10 23 11 24 12 25 13 VOUT VIN 2 ADJ J5 11 12 13 14 15 16 17 18 10 RC0/T1OSO/T1CKI RA0/AN0 RC1/T1OSI/CCP2 RA1/AN1 RC2/CCP1 RA2/AN2/VREFRC3/SCK/SCL RA3/AN3/VREF+ RC4/SDI/SDA RA4/T0CKI RC5/SDO RA5/SS/AN4 RC6/TX/CK RC7/RX/DT RB0/INT RB1 RB2 OSC2/CLKOUT RB3/PGM RB4 RB5 RB6/PGC RB7/PGD OSC1/CLKIN CONNECTOR DB25 MCLR/VPP/THV 0 VDD 2 3 4 5 6 7 0 af15p f icheur + boutons 1 2 3 4 5 6 7 8 9 J1 10 11 12 13 14 15 16 0 1 2 3 4 5 6 7 8 9 10 21 22 23 24 25 26 27 28 9 1 J2 commande moteur 0 20 PIC16F876 La carte mère est composée de deux parties distinctes. La première partie, située à gauche sur le schéma, sert à programmer le PIC. La partie situé a droite gère les entrées sorties du microcontrôleur et l’alimentation à partir du 12V. La partie programmatrice est alimentée en 17V grâce à une prise jack, et est relié à l’ordinateur grâce au connecteur DB25 directement incluse dans la carte. Pour programmer le PIC il faut rentré sur les ports RB6 et RB7 mais aussi appliqué à l’entrée MCLR une tension. Sur le terrain, et une fois que le PIC est programmé, on passe à la partie droite du schéma. Cette partie est alimentée grâce à une batterie de 12V. Le microcontrôleur ainsi que le reste du montage, doit être alimenté en 5V ce qui nous a obligé à créé un système permettant de passé du 12V au 5V. On a opté pour la solution des deux 78L05 montée en parallèle pour des raisons d’efficacité, en effet en faisant nos recherches sur Internet on a pus remarqué que beaucoup de monde utilisé se type de montage dans leur voiture pour alimenté à partir de leur batterie un appareil électrique tel qu’un lecteur MP3 ou autres. 19 Les information reçus ou délivrer par le microcontrôleur passe par des borniers, se qui nous permet de pouvoir superposé lé carte afin de gagner en place, les liaisons entre les carte se font grâce à des nappes. L’utilisation des boutons poussoirs et de l’afficheur LCD nous obligés d’utilisé 13 places sur un bornier, on a donc choisi d’utiliser un bornier à 16, soit en réalité un 2*8. Pour la gestion du moteur on avait besoin de 7 places, on a donc pris un 2*5. On remarquera que sur les deux borniers on y mets la masse et le +5V. On a utilisé les ports B et C du 16F876, qui on chacun 8 ports, car on en avait besoin de 16. Les ports sont reliés de la manière suivante : PORT B : RB0 /RESET (GS-D200S) RB1 ENABLE (GS-D200S) RB2 /STEP CLK (GS-D200S) RB3 CW-/CCW (GS-D200S) RB4 /HOME (GS-D200S) RB5 Bp1 : bouton «–» RB6 Bp2 : bouton «+» RB7 Bp3 : bouton «défiler » Les « / » signifient que les ports sont actif au niveau bas. PORT C : RC0 RC1 RC2 RC3 RC4 RC5 RC6 RC7 RS (afficheur) R-W (afficheur) E (afficheur) Bp4 : bouton «OK » D4 (afficheur) D5 (afficheur) D6 (afficheur) D7 (afficheur) 20 II) Carte interphase boutons + LCD : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 J15 af f icheur LCD 0 CON16 0 - Bp1 Bp2 0 S3 + - S2 + - Bp3 0 0 S1 + - S1 Bp4 + 1k - R16 1k + R15 1k - R14 1k + R17 + - + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 - J3 0 On rentre sur cette carte grâce à la nappe 2*8 venant de la carte mère, on utilise 8 port pour l’afficheur LCD, 4 ports pour les boutons poussoirs et enfin un pour le +5V et un pour la masse, le ports 13, 14, 15 sont relié à la masse à défaut d’être utilisé. Les boutons poussoirs envoi en entrée du microprocesseur un niveau bas quand l’interrupteur est ouvert, si l’utilisateur appui sur le bouton, l’alimentation va être relié on va donc avoir un niveau haut en entrée de microprocesseur. N’ayant pas de quoi simuler un afficheur LCD sur le logiciel «orcad », j’ai utilisé un connecteur 16 broches représentant les 16 entrée d’un afficheur. Etant donnée que l’on programme l’afficheur en mode 4bits, les ports D0, D1, D2, D3 sont reliés à la masse. Le bit du contraste est aussi mis, par défaut, à la masse. Les bits 15 et 16 permettent le rétro éclairage de l’afficheur LCD, étant donné que l’astronomie se fait durant la nuit, on n’a pensé qu’il serait utile d’avoir un affichage rétro éclairé, on a donc tout simplement relié l’anode (port 15) au +5V, et la cathode (port 16) à la masse. 21 III) Carte commande moteur : J20 0 J4 1 2 3 4 5 6 7 8 9 10 CON10 0 1 2 3 4 5 6 7 8 9 10 11 12 J21 1 2 3 4 5 6 CON6 CON12 Les borniers J20 et J21 représente le module GS-D200S avec d’un coté les entrées et de l’autre les sorties vers le moteur. Dans notre cas, on n’utilisera pas le bit 2 qui sert à synchroniser deux modules ensemble. On ne connecte pas non plus le bit 4 (HALF-/FULL) qui, si il n’est pas connecté fonctionne en demi pas, qui est le fonctionnement que l’on doit utiliser. Les bits 8, 9 et 10 ne sont pas non plus connecté car on ne les utilise pas. 22 Nomenclature : Nombre 2 4 2 4 1 3 1 4 4 1 2 2 1 2 1 11 2 2 1 1 1 3 1 1 1 1 Nom C1, C8 C2, C3, C4, C5 C6, C7 C9, C10, C11, C12 D1 D2, D3, D4 D5 Bp1, Bp2, Bp3, Bp4 J5 J1, J3 J2, J4 P2 Q1, Q2 Q3 R1, R2, R3, R4, R9, R11, R12, R14, R15, R16, R17 R5, R6 R7, R10 R8 R13 U9 U11 Afficheur LCD U16 Référence Condensateur tantalum Condensateur céramique Condensateur céramique Condensateur céramique 1N4001 1N4148 LED Bouton poussoir Capuchon noir PHONE JACK-O CON 16 CON 10 CONNECTOR DB25 BC547 CRYSTAL Résistance plastique ¼ W Valeurs 10µF 100nF 15pF 1µF Résistance plastique ¼ W Résistance plastique ¼ W Résistance plastique ¼ W Résistance métal ¼ W LM317L 78LO5 Afficheur LCD rétro éclairé 2*16 lignes Support CI 40 broches PIC16F876 Moteur 200 pas par tour 10kOhm 2,2kOhm 220 Ohm 4,7kOhm 1kOhm Prix 0,90 0,40 0,10 0,20 ? 0,18 0,20 2,60 1,80 0,40 1,10 1,00 0,60 0,30 1,00 0,30 0,15 0,15 0,15 0,25 0,60 1,35 13,90 0,92 11,50 26,90 Prix d’après le catalogue « gotronic » téléchargeable gratuitement sur Internet : www.gotronic.fr 23 Connecteur 16 broches : N° 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Carte mère +5V RC0 RC1 RC2 RC4 RC5 RC6 RC7 RB5 RB6 RB7 RC3 GND GND GND GND Ports 11 12 13 15 16 17 18 26 27 28 14 Carte afficheur + boutons +5V RS R/W E D4 D5 D6 D7 Bp1 Bp2 Bp3 Bp4 GND GND GND GND Ports Carte commande moteur /RESET HOME /STEPCLK CW-/CCW ENABLE GND GND GND +5V GND Ports 3 5 6 7 11 4 5 6 11 12 13 14 Connecteur 10 broches : N° 1 2 3 4 5 6 7 8 9 10 Carte mère RB0 RB4 RB2 RB3 RB1 GND GND GND +5V GND Ports 21 25 23 24 22 12 1 24 Boite 8 cm 10 cm 15 cm 8 cm 10 cm Entrée batterie Sortie moteur 10 cm 15 cm 8 cm 25 Programmation du système I) Mise en situation : a) posons le problème : Le but principal de ce programme est de piloter un moteur pas à pas pour compenser le mouvement de rotation de la terre en agissant sur l’ascension droite de la monture équatoriale. Pour ce faire, lorsque la terre tourne sur ellemême, il faut que le moteur se déplace d’autant de pas dans l’autre sens Diagramme explicatif : Légende : le point rouge symbolise la position initiale de la monture, le point bleu la position finale après une certaine rotation de la terre. Le segment noir représente la direction dans laquelle pointe la monture et le segment en pointillés la correction que doit apporter le moteur. Pour calculer cette correction, il faut tout d’abord calculer le déplacement de la planète sur elle-même. En considérant que la terre fait un tour sur elle même en 24 h on a : ça fait de tour par heure soit tour par minute ou encore tour par seconde. Ce qui ramène à dire que la terre fait un pas par seconde sur un total de 86400 pas. Il suffit maintenant de faire un produit en croix avec le nombre de pas par tour du moteur pour obtenir la durée d’un pas du moteur. 26 b) Choix du moteur : Nous pensions, à la base, que le programme que nous allions développer, permettrait de prendre n’importe quel moteur pour le système. Cependant, nous nous sommes rendu compte que c’était inutile car le système étant entièrement prit en charge par nous-même, nous choisirions un moteur pour faire le montage et il n’y aurait nul besoin de le remplacer. Programmer une adaptation du pas selon le moteur serait alors superflu vu que le moteur est toujours identique (mais peut-être pas la monture, c’est pour cela que le rapport de réduction doit être toujours réglable). Nous avons donc opté pour un moteur 200 pas par tour. Ce qui en mode demi pas donne du 400 pas par tour, ce qui est suffisamment précis. Calcul de la durée d’un pas : Terre : 1/86400 pas -> 1 seconde Moteur : 1/200 pas -> ? On a donc : durée d’un pas = 86400/200 = 432 secondes soit 7,2 minutes. Le problème assimilé et la durée standard trouvée, nous pouvons donc commencer l’élaboration du programme 27 II) Organigrammes généraux : a) organigramme du déplacement automatique La priorité du programme étant de faire tourner le moteur, nous allons donc commencer par écrire l’organigramme du pilotage automatique : Note : comme la rotation du moteur est prioritaire on pourra la placer en interruption de timer lors de l’élaboration du programme. DEBUT Durée d’un pas écoulée ? Oui non on décale d’un autre pas FIN b) Organigramme du déplacement manuel Cet organigramme est soumis à deux conditions : - Si l’utilisateur appuie sur le bouton +, le moteur se décale d’un pas dans son sens en cours. 28 - Si l’utilisateur appuie sur le bouton -, le moteur se décale d’un pas dans son sens inverse de rotation. Il faut donc tester l’état des boutons en permanence ou plutôt en « temps réel ». DEBUT Bouton avancer Enfoncé ? oui Un pas vers l’avant non Bouton reculer Enfoncé ? non oui Un pas vers l’arrière FIN 29 c) organigramme des menus de l’afficheur Cet organigramme doit s’embriquer dans celui de l’organigramme de la commande manuel puis que l’utilisateur sollicite un bouton pour rentrer dans le menu mais pour plus de clarté nous allons le présenter séparément. Il y a normalement 4 sous-menus, celui du rapport de réduction, du sens de rotation, de la durée d’un pas (appelé vitesse dans le programme) et le menu retour. Voici comment accéder aux différents sous menus grâce au bouton défiler : Accès aux menus de l’afficheur Rapport de réduction retour vitesse Sens L’organigramme suivant n’est pas l’organigramme complet de l’afficheur à cause d’un problème de place (cet organigramme ne rentre pas dans une feuille format A4), il présente le lancement du menu ainsi que le premier sous menu. Les sous-menus étant fait de la même façon, il suffit d’extrapoler le principe du premier sous menu aux autres. La seule différence notable est pour le menu retour. Dans celui-ci, peu importe si l’utilisateur appuie sur le bouton + ou le bouton -, il sort des menus de l’afficheur. 30 DEBUT Bouton ok Enfoncé ? non oui Accès menu Rapport de réduction Bouton Défilé Enfoncé ? oui Accès menu vitesse non Bouton + Enfoncé ? oui Numérateur +1 non Afficher le changement Bouton Enfoncé ? non oui dénominateur +1 Afficher le changement FIN 31 On remarque qu’il faut obligatoirement passer par le menu retour pour sortir de l’afficheur. Note : Le numérateur et le dénominateur du rapport peuvent s’incrémenter jusqu’à 9, si l’on dépasse ce chiffre ils reviennent à 1. 32 III) Programmation en mnémoniques : problèmes rencontrés et solutions a) prise en compte du temps Le moteur doit effectuer un pas toutes les X secondes. Pour faire cela, on peut soit utiliser une horloge externe que l’on relit au microprocesseur, soit on peut utiliser les timers internes d’interruption du microprocesseur. Dans le cas présent, nous souhaitions gérer le système sans nouveaux périphériques, il nous fallait donc utiliser les timers d’interruptions. Pour cela, nous avons choisi de prendre le timer1 qui est un timer 16 bits il peut donc s’incrémenter jusqu’à FFFF en héxa (soit 65535 en base 10) avant de déborder et de générer une interruption. En supposant qu’un incrémentation dure 1µ (paramètre à gérer lors de l’initialisation du timer), un débordement complet du timer vaut 0.06 s. Il faut donc lancer l’interruption pour incrémenter (ou décrémenter) une variable une fois par interruption. Ainsi lorsque la variable aura atteint X, si X fois 0.06 s vaut le temps entre chaque pas du moteur, on décale le moteur d’un pas. Tout ceci en interruption, ainsi le fonctionnement du moteur est prioritaire. Cette méthode nous renvoie, et même crée, les deux problèmes suivants. b) utilisation de variables 16 bits avec un PIC 16F876 Comme les temps entre chaque pas sont très longs à l’échelle d’un microprocesseur, la variable contenant le nombre de débordements du timer (autrement dit la variable qui s’incrémente à chaque lancement d’IT du timer1) doit être 16 bits, sa valeur dépassant les 1000 en base 10. Cependant plusieurs opérations doivent être effectuées dessus, comme par exemple la multiplication par le rapport de réduction et une division par 2 pour le mode demi-pas. Or le seul accumulateur d’un PIC 16F87X est un accumulateur 8 bits, donc des opérations directes ne peuvent être effectuées avec une variable 16bits sous peine de débordement. Il faut donc traiter les 8 bits de poids fort et les 8 bits de poids faibles de la variable séparément. Soit en jouant sur les adresses directement soit en séparant la variable en deux variables. Une contenant les bits de poids fort et une les bits de poids faible. Remarque : ce problème n’aurait pas lieu d’être sur un µP 6809 vu que ce type de microprocesseur possède 3 accumulateurs doubles longueurs ( D, X et Y). 33 c) Opérations de multiplications et de divisions : Ces opérations sont requises dans le programme, par exemple, pour utiliser le rapport de réduction. Le PIC que l’on utilise ici possède un langage réduit. Il ne comprend donc pas la multiplication et la division. Il a donc fallut faire des multiplications et des divisions à l’aide d’additions, de soustractions, d’incrémentations et décrémentations de variables ainsi que des jumps. Solution trouvée : Division de la variable « centut » par 13 : xi2: xa2: movlw 0x0d subwf centut,1 bz xa2 incf centut2,1 goto xi2 incf centut2,1 On entre le dénominateur dans W et puis on soustrait le numérateur (ici centut) de W, puis on incrémente une variable (ici centut2). On reproduit cette opération jusqu’à ce que le numérateur (centut) soit égal à 0 puis on incrémente centut2 une dernière fois pour arrondir à l’unité supérieure vu que le microprocesseur ne prend pas en compte les chiffres après la virgule. Le résultat de l’opération est donc bien entendu contenu dans la variable qui s’incrémente (centut2) Multiplication de centut2 par 10 wu2: wa2: wi2: decf centut2,1 bnz wu2 movlw 0x0a goto wi2 movlw 0x0a addlw 0x0a decf centut2,1 bnz wa2 movwf centcompt 34 On décrémente une fois centut2, si le résultat est égal à zéro, ça veut dire que centut2 = 1, on met la valeur dix dans centcompt et l’opération est terminée. On a multiplié 1 par 10 et le résultat est contenu dans centcompt. Maintenant voici le cas où si centut2 est supérieur à 1 : On décrémente une fois centut2, puis on ajoute 10 à W (qui contient déjà la valeur 10). On effectue cette manoeuvre jusqu’à ce que centut2 soit égal à zéro. Le résultat de la multiplication est contenu dans l’accumulateur W. Note: Lors de la multiplication, le multiplicateur doit toujours être le plus petit nombre de la multiplication, ainsi le temps de calcul est plus court. Note2 : les variables soumises à ses opérations sont toujours différentes de 0 donc le cas où elle pourrait être égale à 0 n’est pas prit en compte pour ses opérations vu que ce cas est impossible. Remarque: Avec un microprocesseur à language SISC ce contournement n’aurait pas eu lieu puis que la multiplication et la division sont comprises dans les mnémoniques. Inconvenient de la solution: Comme le microprocesseur ne prend pas en compte les chiffres après la virgule, lors de nombreuses opérations successives sur de grosses variables, il se peut qu’il y ait de fortes erreurs de calculs mais ces erreurs ne dépassent pas l’ordre de la dizaine, elles peuvent être négligeables car les résultats des calculs de ce programme sont de l’ordre de la centaine ou du millier. Néanmoins, il en reste les calculs ne sont pas précis. 35 Conclusions Conclusion générale : Notre projet a été quasiment mené à bout, de notre cahier des charges le seul point qui nous a manqué est la réalisation et les tests de notre solution. Ce manque est du au fait qu’on a pas réussi à créer un typon, nous avions au départ choisi d’utiliser «eagle» mais, avec ce logiciel, nous n’avons même pas put réaliser le schéma électrique car nous n’avions pas toutes les librairies nécessaire (par exemple les transistors BC547), nous somme après passés au logiciel «orcad» que l’IUT nous a donné lors des séances de TR, là encore nous Avons été bloqué par manque de librairie. Enfin nous avons réussi à récupérer la dernière version de «orcad» avec toutes les librairies, nous avons donc réalisé les schémas électriques. Dans le pack «orcad» il y a la possibilité de créer un typon à partir de notre schéma. Nous avons donc utilisé l’aide pour comprendre comment faire cette action, mais là encor nous n’avons pas put aller au bout du à une erreur encor incomprise, le logiciel nous affiche un message d’erreur qui est : « AutoECO Report FILE-A: G:\MES DOCUMENTS\COURS\CAPTURE\PTUTEQUAT.MAX FILE-B: G:\MES DOCUMENTS\COURS\CAPTURE\PTUTEQUAT.MNL If "*EOF*" immediately follows, no changes were made Cannot load a metric netlist on top of an english board or template. Please convert. *EOF* Unable to complete ECO due to errors 1 error found » De plus même avec la réalisation d’un typon nous n’aurions pas put réaliser le montage car le coût de construction aurait été trop important pour nous. 36 Conclusion Etyan Bismuth : Ce projet tuteuré comporte deux parties, une partie électronique et une partie programmation. Ce qui m’a plus dans ce sujet c’est la partie programmation du 16F876 grâce au logiciel MPLAB. La partie électronique par contre est la partie que je n’ai pas appréciée, tout d’abord car mes connaissance en électronique n’était pas suffisante pour mener, tout seul, à bien se projet, cependant il est vrai que de travailler avec Mathieu sur se projet m’a beaucoup appris en domaine d’électronique. De plus nous avons été confronté au problème des librairies qui ne nous a pas permis de réaliser le typon de notre carte, étant le but final de notre projet. La réalisation aurait été elle aussi intéressante toutefois nous étions dans l’incapacité financière d’acheté nous-mêmes les composants. 37 Conclusion Mathieu Paris : J’ai trouvé le principe du projet tuteuré très intéressant, et ce même si la motorisation d’une monture équatoriale ne m’a passionné, je fini cette période de recherches et de développement en étant plutôt satisfait de ces trois mois. Surtout pour ce que nous sommes arrivés à faire et pour tout ce que nous avons appris en plus de ce qui nous a été dispensé en cours. Néanmoins, je pense que passer 300 heures sur un projet en plus de suivre 40 heures de cours par semaine est beaucoup trop. 38 39 Listing du programme #INCLUDE P16F876.inc list p=16F876 ;**************************************** ; VARIABLES * ;**************************************** CBLOCK 0x20 ;debut de la zone des variables num den table total cent dix uni flag t var var2 tit centit dixit centut dixut centut2 centcompt dixcompt centcompt2 dixcompt2 compte ENDC CBLOCK W_save STATUS_save ENDC ;fin de la zone 0x70 ;zone de sauvegarde pour les interruptions ;registre pour sauvegarde de W ;registre pour sauvegarde de STATUS ;fin de la zone ;**************************************** ; MACROS * ;**************************************** #INCLUDE macro.inc ; ;macro.inc doit etre present dans le ;meme repertoire que le reste du projet ;**************************************** ; VECTEUR RESET * ;**************************************** org 0x000 ;vecteur RESET goto Init ;**************************************** ; INTERRUPTIONS * 40 ;**************************************** org 0x004 ;vecteur Interruption ; sauvegarde de W et STATUS movwf W_save swapf STATUS,w movwf STATUS_save movf dixcompt2,1 ; si elle vaut zéro on va décrémente la variable des milliers bz suite decf dixcompt2,1 ; on décrémente la variable des centaines bnz fin2 movf centcompt,0 movwf centcompt2 goto fin2 suite: decf centcompt2,1 ; on décrémente la variable des milliers bnz fin2 ; si elle vaut zéro on décrémente la variable de ; comptage puis on recommence à décrémenter la variable des centaines ; et ainsi de suite. movf dixcompt,0 movwf dixcompt2 decf compte,1 bz interrup ; la variable compte = 0 on décale le moteur d'un pas goto fin2 interrup: bsf PORTB,2 nop nop bcf PORTB,2 fin2: ;restauration de W et STATUS swapf STATUS_save,w movwf STATUS swapf W_save,f swapf W_save,w retfie ;retour d'interruption ;**************************************** ; INITIALISATIONS * ;**************************************** Init: ;acces aux TRIS (dans bank1) bsf STATUS,RP0 bcf STATUS,RP1 movlw 0xE0 movwf TRISB movlw 0x08 movwf TRISC bsf PIE1,TMR1IE ; active les interruptions du timer 41 ;acces aux PORTS (dans bank0) bcf bcf STATUS,RP0 STATUS,RP1 ;initialisation de l'écran LCD movlw 0x34 movwf PORTC ; on force l'afficheur en mode 8bits bcf PORTC,2 ; front descend dans de E movwf PORTC bcf PORTC,2 movwf PORTC bcf PORTC,2 movlw 0x24 movwf PORTC ; on passe en mode 4bits nop bcf PORTC,2 movlw 0x24 movwf PORTC nop bcf PORTC,2 movlw 0x84 movwf PORTC ; mode 4 bits, afficheur 2 lignes, caractères 5x7 nop bcf PORTC,2 movlw 0x04 movwf PORTC nop bcf PORTC,2 movlw 0xc4 movwf PORTC ; pas de curseur nop bcf PORTC,2 movlw 0x04 movwf PORTC nop bcf PORTC,2 movlw 0x54 movwf PORTC ; le curseur de déplace vers la droite nop bcf PORTC,2 movlw 0x04 movwf PORTC nop bcf PORTC,2 movlw 0x14 movwf PORTC ;on efface l'écran nop bcf PORTC,2 ; le rapport de reduction est de 1/1 à l'initialisation movlw 0x01 movwf num 42 movwf den ; initailisation des variables pour l'écriture de la vitesse. movlw 0x04 movwf cent movlw 0x03 movwf dix clrw movwf uni ; initialisation du flag movlw 0x01 movwf flag ; variable compte à 100 movlw 0x64 movwf compte bcf INTCON,GIE ; active les interruptions globales clrw movwf TMR1L ; on met le timer 16 bits movwf TMR1H ; à 0x0000 ; initialisation moteur bcf PORTB,0 ;reset du moteur nop bsf PORTB,0 bsf PORTB,1 ; enable = 1 bsf PORTB,3 ; sens de rotation horaire ;**************************************** ; PROGRAMME PRINCIPAL * ;**************************************** Debut: ;##################### commande manuelle ################################; movf flag,1 ;est-ce que l'utilisateur a changé des paramètres? bnz operations btfsc PORTB,6 goto pas btfsc PORTB,5 goto seens btfsc PORTC,3 goto menurapport goto Debut seens: movlw 0x08 andwf PORTB,0 bz un bcf PORTB,3 ; on met cw/ccw à 0 bsf PORTB,2 nop 43 nop bcf PORTB,2 bsf PORTB,3 ;on met cw/ccw à 1 pour revenir dans le sens d'origine goto Debut un: bsf PORTB,3 ; on met cw/ccw à 1 bsf PORTB,2 nop nop bcf PORTB,2 bcf PORTB,3 ;on met cw/ccw à 0 pour revenir dans le sens d'origine goto Debut pas: bsf PORTB,2 nop nop bcf PORTB,2 goto Debut operations: ; addition de cent et dix (voir menu vitesse dans l'afficheur) clrw movwf flag movf cent,0 call conv addwf dix,0 movwf t ; multiplication par le rapport de réduction ; d'abord on divise par le dénominateur zu: zo: movf den,0 subwf t,1 bz zo incf var2,1 goto zu incf var2,1 ; puis on multiplie par le numérateur xa: xi: decf num,0 movwf var movf var2,0 movf var,1 bz xi addwf var2,0 decf var,1 bnz xa ;le résultat de la multiplication se trouve dans w ; on sépare le résultat en deux variables à l'aide du masquage movwf tit andlw 0x0f movwf dixit movf tit,0 andlw 0xf0 movwf centit 44 swapf centit,1 ;gestion de centit et dixit pour arriver aux variables finales ;qui serviront à calculer les secondes par pas ; par décrémentation à l'aide du timer1 ; multiplication par 10 wu: wa: wi: wu1: wa1: wi1: decf centit,1 bnz wu movlw 0x0a goto wi movlw 0x0a addlw 0x0a decf centit,1 bnz wa movwf centut decf dixit,1 bnz wu1 movlw 0x0a goto wi1 movlw 0x0a addlw 0x0a decf dixit,1 bnz wa1 movwf dixut ; division par 13 xi2: xa2: xi1: xa1: movlw 0x0d subwf centut,1 bz xa2 incf centut2,1 goto xi2 incf centut2,1 movlw 0x0d subwf dixut,1 bz xa1 incf dixcompt,1 goto xi1 incf dixcompt,1 ; multiplication de centut2 par 10 wu2: wa2: wi2: decf centut2,1 bnz wu2 movlw 0x0a goto wi2 movlw 0x0a addlw 0x0a decf centut2,1 bnz wa2 movwf centcompt conv addwf PCL,f ;table servant à convertir du décimal en héxa nop retlw 0x0a ;10 45 retlw 0x14 ;20 retlw 0x1e ;30 retlw 0x28 ;40 retlw 0x32 ;50 retlw 0x3c ;60 retlw 0x46 ;70 retlw 0x50 ;80 retlw 0x5a ;90 ;##################### afficheur ######################################; ;----------- 1er menu -----------; menurapport: ;l'utilisateur arrive directement dans le réglage ;du rapport de réduction en entrant dans le menu afficheur ;cleardisplay movlw 0x04 movwf PORTC nop bcf PORTC,2 movlw 0x14 movwf PORTC nop bcf PORTC,2 movlw 0x20 movwf table la1: movf table,0 call rapp movwf PORTC nop bcf PORTC,2 decf table,1 bnz la1 ;écriture du rapport num/den ; curseur sur 2eme ligne ecrit1: movlw 0x94 movwf PORTC nop bcf PORTC,2 movlw 0x04 movwf PORTC nop bcf PORTC,2 ; le curseur est sur la 2eme ligne on peut écrire movlw 0x35 movwf PORTC nop bcf PORTC,2 ; les bits de poids forts ont été envoyés movf num,0 call chif movwf PORTC nop bcf PORTC,2 ; suivi des bits de poids faibles. le numérateur est écrit 46 movlw 0x25 movwf PORTC nop bcf PORTC,2 movlw 0xF5 movwf PORTC nop bcf PORTC,2 ; la fraction est écrite movlw 0x35 movwf PORTC nop bcf PORTC,2 ; les bits de poids forts ont été envoyés movf den,0 call chif movwf PORTC nop bcf PORTC,2 ; suivi des bits de poids faibles. le dénominateur est écrit test1: ; on attend que l'utilisateur appuie sur un bouton btfsc PORTB,7 goto menuvitesse btfsc PORTB,6 goto numplus btfsc PORTB,5 goto denplus goto test1 numplus: incf num,1 movlw 0x0A subwf num,0 ; num s'incrémente mais ne doit pas dépasser 9 sinon il revient à 1 bnz ici1 movlw 0x01 movwf num ici1: goto ecrit1 ;on va réécrire le rapport denplus: incf den,1 movlw 0x0A subwf den,0 ; même principe pour le dénominateur bnz ici2 movlw 0x01 movwf den ici2: goto ecrit1 ;---------- 2eme menu ----------; menuvitesse: ; en appuyant sur le bouton defiler, ; on passe au réglage de la vitesse exprimée en secondes par pas ;cleardisplay movlw 0x04 movwf PORTC nop 47 bcf PORTC,2 movlw 0x14 movwf PORTC nop bcf PORTC,2 la2: ;écriture du mot vitesse movlw 0x0E movwf table movf table,0 call vit nop bcf PORTC,2 movwf PORTC decf table,1 bnz la2 ecrit2: ;positionnement du curseur sur la 2eme ligne movlw 0x94 movwf PORTC nop bcf PORTC,2 movlw 0x04 movwf PORTC nop bcf PORTC,2 ; on peut maintenant écrire la vitesse en seconde par pas movlw 0x35 movwf PORTC nop bcf PORTC,2 movf cent,0 call chif movwf PORTC nop bcf PORTC,2 ; le chiffre des centaines est écrit movlw 0x35 movwf PORTC nop bcf PORTC,2 movf dix,0 call chif movwf PORTC nop bcf PORTC,2 ; celui des dixaines aussi movlw 0x35 movwf PORTC nop bcf PORTC,2 movf uni,0 call chif movwf PORTC nop bcf PORTC,2 ; il faut maintenant écrire s/pas movlw 0x0a movwf table la3: movf table,0 48 call spas movwf PORTC nop bcf PORTC,2 decf table,1 bnz la3 test2: btfsc PORTB,7 goto menusens btfsc PORTB,6 goto dixplus btfsc PORTB,5 goto dixmoins goto test2 dixplus: incf dix,1 movlw 0x0a subwf dix,0 ; dix s'incrémente mais ne doit pas dépasser 9 sinon il revient à 0 bnz ici3 clrf dix incf cent,1 ; dans ce cas là, les centaines s'incrémentent movlw 0x0a subwf cent,0 ; cent s'incrémente mais ne doit pas dépasser 9 sinon il revient à 0 bnz ici3 clrf cent ici3: goto ecrit2 ;on va réécrire la vitesse dixmoins: ;même principe que le sous-programme dixplus sauf qu'ici on décrémente movf dix,1 ; on vérifie que dix ne soit pas à zéro avant de le décrémenter bnz decdix movlw 0x09 ; si c'est le cas il passe à 9 movwf dix ; et c'est cent que l'on devra décrémenter movf cent,1 ;même opération sur cent si dix vallait 0 bnz deccent movlw 0x09 movwf cent goto ecrit2 deccent:decf cent,1 ; si dix est différent de zéro, on le décrémente goto ecrit2 decdix: decf dix,1 ;si dix était égal à 0, et cent différent de 0 on le décrémente goto ecrit2 ;---------- 3eme menu ----------; ; ici on définit le sens de rotation du moteur menusens: ;cleardisplay 49 la4: movlw 0x04 movwf PORTC nop bcf PORTC,2 movlw 0x14 movwf PORTC nop bcf PORTC,2 ;écriture du mot sens movlw 0x08 movwf table movf table,0 call sens movwf PORTC nop bcf PORTC,2 decf table,1 bnz la4 ecrit3: ;on positionne le curseur sur la 2eme ligne movlw 0x94 movwf PORTC nop bcf PORTC,2 movlw 0x04 movwf PORTC nop bcf PORTC,2 btfsc PORTB,3 ;on vérifie le sens du moteur goto av ;si le bit cw/ccw est à 0 on écrit "trigo" ;si il est à 1 on écrit "horaire" ar: bcf PORTB,3 movlw 0x0a movwf table parla1: movf table,0 call arrie movwf PORTC nop bcf PORTC,2 decf table,1 bnz parla1 goto test3 av: bsf PORTB,3 movlw 0x0e movwf table parla: movf table,0 call avant movwf PORTC nop bcf PORTC,2 decf table,1 bnz parla test3: btfsc PORTB,7 goto menuretour 50 btfsc PORTB,6 goto av btfsc PORTB,5 goto ar goto test3 ;---------- 4eme menu ----------; ; ici l'utilisateur a la posibilité de quitter les menus de l'afficheur menuretour: la5: ;cleardisplay movlw 0x04 movwf PORTC nop bcf PORTC,2 movlw 0x14 movwf PORTC nop bcf PORTC,2 ;écriture du mot retour movlw 0x0c movwf table movf table,0 call ret movwf PORTC nop bcf PORTC,2 decf table,1 bnz la5 test4: btfsc PORTB,7 goto menurapport btfsc PORTB,6 goto fin btfsc PORTB,5 goto Debut goto fin fin: ;cleardisplay movlw 0x04 movwf PORTC nop bcf PORTC,2 movlw 0x14 movwf PORTC nop bcf PORTC,2 movlw 0x01 movwf flag ;en testant cette varaible on saura ;si l'utilisateur est rentré dans le menu goto Debut ; on quitte l'afficheur 51 ;######## tables ########## rapp addwf PCL,f ;cette table contient la séquence d'écriture RapporTreduction nop retlw 0xe5 ;n retlw 0x65 retlw 0xf5 ;0 retlw 0x65 retlw 0x95 ;i retlw 0x65 retlw 0x45 ;t retlw 0x75 retlw 0x35 ;c retlw 0x65 retlw 0x55 ;u retlw 0x75 retlw 0x45 ;d retlw 0x65 retlw 0x55 ;e retlw 0x65 retlw 0x25 ;r retlw 0x75 retlw 0x45 ;T retlw 0x55 retlw 0x25 ;r retlw 0x75 retlw 0xf5 ;o retlw 0x65 retlw 0x05 ;p retlw 0x75 retlw 0x05 ;p retlw 0x75 retlw 0x15 ;a retlw 0x65 retlw 0x25 ;R retlw 0x55 chif addwf PCL,f ;cette table contient les poids faibles des chiffres de 1 à 9. retlw 0x05 ;Les poids forts étant identiques il n'y pas besoin de table pour eux. retlw 0x15 ;1 retlw 0x25 ;2 retlw 0x35 ;3 retlw 0x45 ;4 retlw 0x55 ;5 retlw 0x65 ;6 retlw 0x75 ;7 retlw 0x85 ;8 retlw 0x95 ;9 vit addwf PCL,f ;cette table contient la séquence d'écriture Vitesse nop retlw 0x55 ;e retlw 0x65 retlw 0x35 ;s retlw 0x75 52 retlw 0x35 ;s retlw 0x75 retlw 0x55 ;e retlw 0x65 retlw 0x45 ;t retlw 0x75 retlw 0x95 ;i retlw 0x65 retlw 0x65 ;V retlw 0x55 spas addwf PCL,f ; cette table contient l'unité de la vitesse nop retlw 0x35 ;s retlw 0x75 retlw 0x15 ;a retlw 0x65 retlw 0x05 ;p retlw 0x75 retlw 0xf5 ;/ retlw 0x25 retlw 0x35 ;s retlw 0x75 sens addwf PCL,f ;table contenant le mot sens nop retlw 0x35 ;s retlw 0x75 retlw 0xe5 ;n retlw 0x65 retlw 0x55 ;e retlw 0x65 retlw 0x35 ;S retlw 0x55 avant addwf PCL,f ;table contenant le mot horaire nop retlw 0x55 ;e retlw 0x65 retlw 0x25 ;r retlw 0x75 retlw 0x95 ;i retlw 0x65 retlw 0x15 ;a retlw 0x65 retlw 0x25 ;r retlw 0x75 retlw 0xf5 ;o retlw 0x65 retlw 0x85 ;h retlw 0x65 arrie addwf PCL,f ;table contenant le mot trigo nop retlw 0xf5 ;o retlw 0x65 retlw 0x75 ;g retlw 0x65 retlw 0x95 ;i 53 retlw retlw retlw retlw retlw 0x65 0x25 ;r 0x75 0x45 ;t 0x75 ret addwf PCL,f ;table contenant le mot retour nop retlw 0x25 ;r retlw 0x75 retlw 0x55 ;u retlw 0x75 retlw 0xf5 ;o retlw 0x65 retlw 0x45 ;t retlw 0x75 retlw 0x55 ;e retlw 0x65 retlw 0x25 ;R retlw 0x55 ;**************************************** end ;derniere ligne du fichier 54
Documents pareils
PROJET : MOTORISATION DE TELESCOPE
Nous avions à notre disposition un moteur pas à pas de 48 pas par tour. Pour des commodités
d’observation nous voulions le faire tourner à 1 pas par seconde. La vitesse du moteur disponible était
...