Simulation d'un programme asm
#1
Posté 12 juillet 2011 - 06:51
Je débute en robotique et je me suis lancé dans la fabrication d'un robot programmable.
Pour la programmation, j'ai décidé d'utiliser un microcontrolleur (16f84A). J'ai donc dû choisir et apprendre un langage de programmation, ce que j'ai essayé de faire en lisant le cours de Bigonoff sur l'asm (sous mp lab). Cependant, après la création de mon programme (et sa compilation réussie ) je doute de son bon fonctionnement ! xD J'ai donc envie de le simuler (quelque chose de simple, juste de savoir quand les sorties du pic sont à 1 ou à 0).
J'ai essayé de le faire sous mp lab (comme dans le cours)mais je ne trouve pas ça génial :x (c'est très très long). De plus, dans une simulation d'un de mes anciens programmes le chronogramme m'affichait des choses aberrantes ! Tout d'abord malgré le fait que toutes mes sorties aient subies le "même traitement" une seule (RB2 de mémoire) se mettaient au niveau haut toute seule. Une fois j'ai mis pause dans la simulation, et quand je l'ai retirée toutes les sorties avaient changé d'état alors que je ne l'avais pas demandé dans le programme :x Enfin autant dire que je n'ai pas vraiment confiance dans mb lab.
Malgré mes recherches sur internet je n'ai pas trouvé de moyens de simulation par logiciel gratuit. je n'ai pas non plus trouvé un moyen plus simple et peut être plus sûr de simuler sous mp lab...
Donc je m'en remet à vous, en espérant que vous ayez une solution dans votre sac ^^
Merci d'avance pour toutes vos réponses ! (je peux mettre mon "programme" si quelqu'un veut y jeter un oeil)
#2
Posté 14 juillet 2011 - 09:38
Tu es sur que ton problème ne vient pas de ton code ?
#3
Posté 14 juillet 2011 - 05:46
Faute de simulation j'ai terminé mon robot aujourd'hui et je lui ai mis mon pic sauf que quand j'ai allumé, rien ne s'est passé. Donc je pense avoir un énorme soucis au niveau de mon programme "^^
#4
Posté 14 juillet 2011 - 05:54
Une fois j'avais vu que l'on pouvait programmé les microcontrolleurs avec une sorte d'"assemblage de schémas". Je me demande si ça ne serait pas plus simple ? Cependant je n'ai pas retrouvé le site sur lequel j'avais vu ça ! :s
Et je me demandais, quel genre d'erreur pourrait faire en sorte que rien dans le programme ne fonctionne (malgré une compilation réussie "^^) ?
#5
Posté 15 juillet 2011 - 02:33
J'ai fabriqué un "testeur" de microcontrolleurs (12 dels sur les sorties programmables) et j'ai essayé de mettre un des programmes de bigonoff dans mon pic pour voir s'il marchait. Ca a fonctionné sans problème, cela veut donc dire que je suis une brelle en programmation !
Donc si vous avez des conseils n'hésitez pas !
Merci d'avance
#6
Posté 15 juillet 2011 - 03:56
merci (pour les lectures et la réponse, on se sent moins seul xD)
#7
Posté 17 juillet 2011 - 12:23
Pour le codage en "schéma" comme tu dit je pense que tu veut parler du flowcode. Je le déconseille vivement...
#8
Posté 18 juillet 2011 - 04:25
pour la simulation PIC et AVR il y a une démo fonctionnelle (on peut acheter le logiciel) qui est assez simple à utiliser voir ce lien:
Simulateurs
il suffit de charger le fichier HEX et de paramètrer la simu, on peut par exemple afficher les ports sous forme de LED graphiques dont on choisit la couleur et qui s'allument et s'éteignes au grés du programme.
J'ai compilé un programme en BASIC avec BASCOM AVR et fait ma simu sans problèmes .
A+ Mic*
#9
Posté 19 juillet 2011 - 11:16
Ok Maïck je vais d'ailleurs le faire maintenant car après plusieurs tests il s'est avéré que je n'arrivais pas à déclencher l'interruption :x Tout le programme fonctionne sauf ça, pas moyen de la déclencher ! "^^ J'ai essayé de la modifier plusieurs fois en regardant bien comment bigonoff faisait et en cherchant sur internet mais j'ai pas trouvé :x
Et oui je crois que c'est le flowcode ! ^^ Ben maintenant que j'ai réussi à faire fonctionner un programme (bon sauf l'intérupt "^^) je vais continuer le basic
Et merci Mic* pour le lien ! Je vais voir mais d'après ce que tu me dis c'est exactement le genre de trucs que je cherchais J'étais tellement désespéré que j'ai construit une platine avec des del pour tester mes programmes x') Mais bon vu qu'il faut une licence je préfère rester avec ma platine perso
Et donc voici la partie de mon code qui "gère" l'interruption RB0 (le problème vient peut être de l'initialisation, je ne sais pas, auquel cas je posterai le bout de programme). J'ai retiré le programme en lui même pour vous évitez de la lecture inutile et pour vous faire gagner du temps ^^ (vous allez reconnaître les bouts de programme je pense, c'est directement issu du cours de bigonoff )
Et je pensais : si j'ai un obstacle devant et que l'interruption est déclenchée, est-ce qu'une nouvelle interruption peut se déclencher tout de suite après ? Si c'est le cas mon robot risque d'être bloquée devant un mur comme un *** ^^ Donc est-ce qu'il y a une solution genre empêcher les interruptions le temps que celle-ci se termine ?
;********************************************************************** ; ROUTINE INTERRUPTION * ;********************************************************************** ;sauvegarder registres ;--------------------- org 0x004 ; adresse d'interruption movwf w_temp ; sauver registre W swapf STATUS,w ; swap status avec résultat dans w movwf status_temp ; sauver status swappé ;Traiter directement RB0 car c'est la seule ;intéruption autorisée call intrb0 ; traiter interrupt RB0 goto restorereg ; et fin d'interruption ;restaurer registres ;------------------- restorereg swapf status_temp,w ; swap ancien status, résultat dans w movwf STATUS ; restaurer status swapf w_temp,f ; Inversion L et H de l'ancien W ; sans modifier Z swapf w_temp,w ; Réinversion de L et H dans W ; W restauré sans modifier status retfie ; return from interrupt ;********************************************************************** ; INTERRUPTION RB0/INT * ;********************************************************************** ; ;L'intérruption est déclenchée lorsque le phototransistor fixée sur le ;corps du robot devient passant. Il y a alors une impulsion sur la pin ;du microcontrolleur RB0, ce qui provoque l'intéruption, le système va ;alors arrêter ce qu'il était en train de faire et va exécuter les actions ;ci-dessous. Enfin, quand il aura terminé, il "reprendra" au moment où il ;s'était arrêté. ; ;L'intéruption consiste à reculer le robot pendant 3 secondes puis à n'actionner ;que le moteur de la rouge gauche pour que le robot tourne à droite. ; ;_______________________________________________________________________ intrb0 BANK0 ;conseil appliqué du cours ;de Bigonoff qui conseille ;d'entrer dans une sous routine ;en banque 0 (... le programme...) bcf INTCON , INTF ; effacer flag INT/RB0 return ; fin d'interruption RB0/INT
Merci d'avance pour vos futures réponses qui vont, je le pense, beaucoup m'aider !
Je voulais mettre la vidéo du test de mon programme en pièce jointe mais le forum n'a pas voulu, tant pis :x
#10
Posté 19 juillet 2011 - 10:24
Pour les interruptions, elles sont de toutes façon désactivée tant que tu n'a pas quitté la sous routine d'interruption ! (Même si il y a moyen de contourner ! )
#11
Posté 20 juillet 2011 - 08:44
Bon ben si tu tiens à te faire chier à lire mon programme je te le mets en entier alors, merci x]
Bon je te préviens tout de suite il y a beaucoup de conneries en commentaire...
Quand je code je m'ennuie alors j'aime bien faire ça ! En même temps quand je le relis ça m'éclate et je me dis : "Ce que je peut être *** quand même" xD Enfin bon n'y prête pas trop attention x')
;************************************************************************************* ; * ; Systeme d exploitation : _GALACTUX_ * ; PIC utilise : 16F84A * ; Version : 1.0 (\_/) * ; Auteur : Desaindes Franck (=*.*) * ; Date : 2011 *(")_(") * ; * ;************************************************************************************* ;_____________________________________________________________________________________ ; ;programme fonctionnel !! Sauf les intérupts "^^ ; ;_____________________________________________________________________________________ LIST p=16F84 ; définition de processeur #include <p16F84A.inc> ; définition des constantes __CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _HS_OSC ; '__CONFIG' précise les paramètres encodés dans le processeur au moment de ; la programmation. Les définitions sont dans le fichier include. ; Voici les valeurs et leurs définitions : ; _CP_ON Code protection ON : impossible de relire ; _CP_OFF Code protection OFF ; _PWRTE_ON Timer reset sur power on en service ; _PWRTE_OFF Timer reset hors-service ; _WDT_ON Watch-dog en service ; _WDT_OFF Watch-dog hors service ; _LP_OSC Oscillateur quartz basse vitesse ; _XT_OSC Oscillateur quartz moyenne vitesse ; _HS_OSC Oscillateur quartz grande vitesse ; _RC_OSC Oscillateur à réseau RC ;********************************************************************* ; ASSIGNATIONS * ;********************************************************************* OPTIONVAL EQU H'13' ; Valeur registre option ;résistance de rappel off ;intéruption de RB0 actif au niveau haut ;timer 0 en fonction de l'horloge interne ;pas de prédiviseurs INTERMASK EQU H'0090' ; Masque d'interruption ; Interruptions sur RB0 ;********************************************************************* ; DEFINE * ;********************************************************************* #DEFINE rrd PORTA, 0 ;reculer roue droite #DEFINE ard PORTA, 1 ;avancer roue droite #DEFINE arg PORTA, 2 ;avancer roue gauche #DEFINE rrg PORTA, 3 ;reculer roue gauche #DEFINE adig PORTA, 4 ;allumer del infrarouge gauche #DEFINE obstacle PORTB, 0 ;si capteur infrarouge détecte un obstacle -> interuption #DEFINE adid PORTB, 1 ;allumer del infrarouge droite #DEFINE adjg PORTB, 2 ;allumer del jaune gauche #DEFINE adjd PORTB, 3 ;allumer del jaune droite #DEFINE dbd PORTB, 4 ;descendre bras droit #DEFINE lbd PORTB, 5 ;lever bras droit #DEFINE dbg PORTB, 6 ;descendre bras gauche #DEFINE lbg PORTB, 7 ;lever bras gauche ;********************************************************************* ; MACRO * ;********************************************************************* ; ;liste des macros utilisées ;on pour sortie à 1 (instruction bsf) ;off pour sortie à 0 (instruction bcf) ; ;_____________________________________________________________________ BANK0 macro bcf STATUS,RP0 ; passer banque0 endm BANK1 macro bsf STATUS,RP0 ; passer banque1 endm ;_1_ rrdon macro bsf rrd ;enclenche le moteur reculer roue droite endm rrdoff macro bcf rrd ;éteint le moteur reculer roue droite endm ;_2_ ardon macro bsf ard ;enclenche le moteur avancer roue droite endm ardoff macro bcf ard ;éteint le moteur avancer roue droite endm ;_3_ argon macro bsf arg ;enclenche le moteur avancer roue gauche endm argoff macro bcf arg ;éteint le moteur avancer roue gauche endm ;_4_ rrgon macro bsf rrg ;enclenche le moteur reculer roue gauche endm rrgoff macro bcf rrg ;éteint le moteur reculer roue gauche endm ;_5_ adigon macro bsf adig ;allumer del infrarouge gauche endm adigoff macro bcf adig ;arrêter d'allumer del infrarouge gauche endm ;_6_ adidon macro bsf adid ;allumer del infrarouge droite endm adidoff macro bcf adid ;arrêter d'allumer del infrarouge droite endm ;_7_ adjgon macro bsf adjg ;allumer del jaune gauche endm adjgoff macro bcf adjg ;éteindre del jaune gauche endm ;_8_ adjdon macro bsf adjd ;allumer del jaune droite endm adjdoff macro bcf adjd ;éteindre del jaune droite endm ;_9_ dbdon macro bsf dbd ;enclenche le moteur qui permet de descendre le bras droit endm dbdoff macro bcf dbd ;éteint le moteur de descente du bras droit endm ;_10_ lbdon macro bsf lbd ;allumer le moteur lever bras droit endm lbdoff macro bcf lbd ;éteindre le moteur lever bras droit endm ;_11_ dbgon macro bsf dbg ;enclenche le moteur qui permet de descendre le bras gauche endm dbgoff macro bcf dbg ;éteint le moteur de descente du bras gauche endm ;_12_ lbgon macro bsf lbg ;allumer le moteur lever bras gauche endm lbgoff macro bcf lbg ;éteindre le moteur lever bras gauche endm ;********************************************************************* ; DECLARATIONS DE VARIABLES * ;********************************************************************* CBLOCK 0x00C ; début de la zone variables w_temp :1 ; Sauvegarde de W dans interruption status_temp : 1 ; Sauvegarde de STATUS dans interruption cmpt1 : 1 ;compteur de boucles 1 cmpt2 : 1 ;compteur de boucles 2 cmpt3 : 1 ;compteur de boucles 3 cmpt4 : 1 ;compteur de boucles 4 cmpt5 : 1 ;compteur de boucles 5 cmpt9 : 1 ;compteur de boucles 9 cmpt10 : 1 ;compteur de boucles 10 cmpt11 : 1 ;compteur de boucles 11 ;(gros trou, hein ? oO mystère et boule de gomme ! xD) flags : 1 ; un octet pour 8 flags ; b0 : libre ; b1 : libre ; b2 : libre ; b3 : libre ; b4 : libre ; b5 : libre ; b6 : libre ; b7 : libre ENDC ; Fin de la zone ;********************************************************************** ; DEMARRAGE SUR RESET * ;********************************************************************** org 0x000 ; Adresse de départ après reset goto init ; Adresse 0: initialiser ;********************************************************************** ; ROUTINE INTERRUPTION * ;********************************************************************** ;sauvegarder registres ;--------------------- org 0x004 ; adresse d'interruption movwf w_temp ; sauver registre W swapf STATUS,w ; swap status avec résultat dans w movwf status_temp ; sauver status swappé ;Traiter directement RB0 car c'est la seule ;intéruption autorisée call intrb0 ; traiter interrupt RB0 goto restorereg ; et fin d'interruption ;restaurer registres ;------------------- restorereg swapf status_temp,w ; swap ancien status, résultat dans w movwf STATUS ; restaurer status swapf w_temp,f ; Inversion L et H de l'ancien W ; sans modifier Z swapf w_temp,w ; Réinversion de L et H dans W ; W restauré sans modifier status retfie ; return from interrupt ;********************************************************************** ; INTERRUPTION RB0/INT * ;********************************************************************** ; ;L'intérruption est déclenchée lorsque le phototransistor fixée sur le ;corps du robot devient passant. Il y a alors une impulsion sur la pin ;du microcontrolleur RB0, ce qui provoque l'intéruption, le système va ;alors arrêter ce qu'il était en train de faire et va exécuter les actions ;ci-dessous. Enfin, quand il aura terminé, il "reprendra" au moment où il ;s'était arrêté. ; ;L'intéruption consiste à reculer le robot pendant 3 secondes puis à n'actionner ;que le moteur de la rouge gauche pour que le robot tourne à droite. ; ;_______________________________________________________________________ intrb0 BANK0 ;conseil appliqué du cours ;de Bigonoff qui conseille ;d'entrer dans une sous routine ;en banque 0 ;jeu avec les dels jaunes ;permet d'éteindre les deux dels si elles étaient allumées adjgoff ;éteindre del jaune gauche adjdoff ;éteindre del jaune droite ;mode réflexion è_é call tempo ;le robot call tempo ;ne fait rien call tempo ;pendant 5 secondes call tempo ;comme s'il call tempo ;réfléchissait ;p ;clignottement adjgon ;allumer la del jaune gauche call tempo ;attends une seconde adjgoff ;éteins la del jaune gauche adjdon ;allumer la del jaune droite call tempo ;attends 1 seconde adjgon ;allumer la del jaune gauche ;il a trouvé la solution au problème <img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/wink.gif' class='bbc_emoticon' alt=';)' /> ;tout d'abord : reculer pendant 3 secondes call rr ;recule les 2 roues (dure 1s) call rr ;recule les 2 roues (dure 1s) call rr ;recule les 2 roues (dure 1s) ;puis il suffit de contourner l'obstacle en tournant à droite par exemple <img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/smile.gif' class='bbc_emoticon' alt=':)' /> argon ;avance la roue gauche ;ce qui a pour effet ;de tourner le robot ;vers la droite call tempo ;ces deux temporisations ;ont pour but de laisser call demitempo ;du temps au moteur ;et voilà ! Félicitations ! ;p Maintenant vous n'avez plus qu'à reprendre votre route <img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/wink.gif' class='bbc_emoticon' alt=';)' /> ardon ;avancer la roue droite ;Satisfait ? Alors à la prochaine ! <img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/wink.gif' class='bbc_emoticon' alt=';)' /> bcf INTCON , INTF ; effacer flag INT/RB0 return ; fin d'interruption RB0/INT ;********************************************************************* ; INITIALISATIONS * ;********************************************************************* init clrf PORTA ; Sorties portA à 0 clrf PORTB ; sorties portB à 0 clrf EEADR ; permet de diminuer la consommation bsf STATUS,RP0 ; sélectionner banque 1 movlw OPTIONVAL ; charger masque movwf OPTION_REG ; initialiser registre option ; Effacer RAM ; ------------ movlw 0x0c ; initialisation pointeur movwf FSR ; pointeur d'adressage indirec init1 clrf INDF ; effacer ram incf FSR,f ; pointer sur suivant btfss FSR,6 ; tester si fin zone atteinte (>=40) goto init1 ; non, boucler btfss FSR,4 ; tester si fin zone atteinte (>=50) goto init1 ; non, boucler ; initialisations spécifiques ; --------------------------- ;définir si les pins sont des sorties (bcf) ;ou des entrées (bsf?) bcf rrd ;reculer la roue droite en sortie RAO (banque1) bcf ard ;avancer la roue droite en sortie RA1 (banque 1) bcf arg ;avancer la roue gauche en sortie RA2 (banque1) bcf rrg ;reculer la roue gauche en sortie RA3 (banque 1) bcf adig ;allumer la del infrarouge gauche en sortie RA4 (banque1) bcf adid ;allumer la del infrarouge droite en sortie RB1 (banque1) bcf adjg ;allumer la del jaune gauche en sortie, RB2 (banque1) bcf adjd ;allumer la del jaune droite en sortie RB3 (banque1) bcf dbd ;descendre bras droit en sortie RB4 (banque1) bcf lbd ;lever le bras droit en sortie RB5 (banque1) bcf dbg ;descendre bras gauche en sortie RB6 (banque1) bcf lbg ;lever le bras gauche en sortie RB7 (banque1) BANK0 movlw INTERMASK ; masque interruption movwf INTCON ; charger interrupt control bcf STATUS,RP0 ; repasser banque 0 goto start ; sauter au programme principal ;********************************************************************* ; Sous routine de temporisation * ;********************************************************************* ; ; Temporisation d'approximativement 1 seconde ; Cycles perdus : 262 144 * nombre du compteur 3 ; Soit approximativement 1 048 576 cylces de perdu pour cmp 3 = 4 ; ;______________________________________________________________________ tempo BANK0 movlw 4 ;4 boucles (amène 4 dans le registre W) movwf cmpt11 ;initialise compteur 11 à la valeur 4 boucle6 clrf cmpt10 ; effacer compteur10 boucle5 clrf cmpt9 ; effacer compteur9 boucle4 clrwdt ;remet à 0 le watchdog decfsz cmpt9,f ; décrémenter compteur9 goto boucle4 ; si pas 0, boucler decfsz cmpt10,f ; si 0, décrémenter compteur 2 goto boucle5 ; si cmpt10 pas 0, recommencer boucle4 decfsz cmpt11,f ; si 0, décrémenter compteur 3 goto boucle6 ; si cmpt11 pas 0, recommencer boucle5 return ; retour de la sous-routine ;********************************************************************* ; Sous routine de demi temporisation * ;********************************************************************* ; ; Temporisation d'approximativement 1/2 seconde ; ;_____________________________________________________________________ demitempo BANK0 movlw 2 ;2 boucles (amène 4 dans le registre W) movwf cmpt3 ;initialise compteur 3 à la valeur 4 boucle3 clrf cmpt2 ; effacer compteur2 boucle2 clrf cmpt1 ; effacer compteur1 boucle1 clrwdt ;remet à 0 le watchdog decfsz cmpt1,f ; décrémenter compteur1 goto boucle1 ; si pas 0, boucler decfsz cmpt2,f ; si 0, décrémenter compteur 2 goto boucle2 ; si cmpt2 pas 0, recommencer boucle1 decfsz cmpt3,f ; si 0, décrémenter compteur 3 goto boucle3 ; si cmpt3 pas 0, recommencer boucle2 return ; retour de la sous-routine ;********************************************************************* ; Sous routine de quart de temporisation * ;********************************************************************* ; ; Temporisation d'approximativement 1/4 seconde ; ;_____________________________________________________________________ quartempo BANK0 boucle8 clrf cmpt4 ; effacer compteur4 boucle7 nop ;perdre 1 cycle clrwdt ;remet à 0 le watchdog decfsz cmpt4,f ; décrémenter compteur4 goto boucle7 ; si pas 0, boucler decfsz cmpt5,f ; si 0, décrémenter compteur 5 goto boucle8 ; si cmpt5 pas 0, recommencer boucle7 return ; retour de la sous-routine ;********************************************************************* ; Sous programme de megatempo * ;********************************************************************* ; ; ;Temporisation très courte dédiée au sous programme de détection ;1 cycle d'un microcontrolleur durt 1 micro seconde (quand il est ;utilisé avec un quartz d'une fréquence de 4 MHz). ;Le but ici est de faire perdre 50 cycles (donc 50 micro secondes) ;au pic ;La temporisation est d'environ 52/53 cycles. ; ;_____________________________________________________________________ ;remarque : l'écriture est ici longue pour rien. On peut la racourcir en ;rajoutant un compteur. Je ne l'ai pas fait car je n'en avais pas envie. xP ;De plus c'est plus simple comme ça et au moins je suis sûr que ça marche xD megatempo BANK0 nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle clrwdt ;remet à 0 le watchdog nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle clrwdt ;remet à 0 le watchdog ;et de 10 cycles x) nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle clrwdt ;remet à 0 le watchdog nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle clrwdt ;remet à 0 le watchdog ;et de 20 x') nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle clrwdt ;remet à 0 le watchdog nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle clrwdt ;remet à 0 le watchdog ;et de 30, ça devient long :/ nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle clrwdt ;remet à 0 le watchdog nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle clrwdt ;remet à 0 le watchdog ;et de 40, j'adoooore le copié/collé xD nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle clrwdt ;remet à 0 le watchdog nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle nop ;fait perdre 1 cycle clrwdt ;remet à 0 le watchdog ;et de 50, OUF ! Enfin terminé :] return ;********************************************************************* ; Sous programme de détection * ;********************************************************************* ; ;Ce sous programme permet au système de "s'informer" de la présence ;ou non d'obstacles. ;Pour ce faire, il va envoyer de manière saccadée des émissions de rayons ;infrarouge. ;- S'il y a un obstacle : les rayons sont renvoyés au phototransistor qui ;devient passant et déclenche la routine d'intéruption du pic. ;- Dans le cas contraire : rien ne se passe. ; ;Ce sous programme alterne alimentation d'une diode infrarouge émettrice ;(droite ou gauche) et une temporisation. La période est de 100 micro secondes. ; ;_____________________________________________________________________ detection BANK0 ;1ère étape : allumer puis éteindre successivement la diode émettrice gauche ;pendant une période d'environ 550 micro secondes ;(inspiré du sujet bac si de 2009) adigon ;allumer del infrarouge gauche call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adigoff ;éteins la del infrarouge gauche call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adigon ;allumer del infrarouge gauche call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adigoff ;éteins la del infrarouge gauche call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adigon ;allumer del infrarouge gauche call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adigoff ;éteins la del infrarouge gauche call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adigon ;allumer del infrarouge gauche call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adigoff ;éteins la del infrarouge gauche call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adigon ;allumer del infrarouge gauche call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adigoff ;éteins la del infrarouge gauche call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adigon ;allumer del infrarouge gauche call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adigoff ;éteins la del infrarouge gauche ;2ème étape : on fait pareil avec l'autre del infrarouge adidon ;allume la del infrarouge droite call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adidoff ;éteins la del infrarouge droite call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adidon ;allume la del infrarouge droite call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adidoff ;éteins la del infrarouge droite call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adidon ;allume la del infrarouge droite call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adidoff ;éteins la del infrarouge droite call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adidon ;allume la del infrarouge droite call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adidoff ;éteins la del infrarouge droite call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adidon ;allume la del infrarouge droite call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adidoff ;éteins la del infrarouge droite call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adidon ;allume la del infrarouge droite call megatempo ;fait perdre environ 50 micro secondes clrwdt ;remet à 0 le watchdog adidoff ;éteins la del infrarouge droite return ;********************************************************************* ; sous programme : "T'as de beaux yeux tu sais ?" * ;********************************************************************* ; ;Ce sous programme permet de faire clignoter les del des yeux à une ;fréquence d'1Hz environ ; ;_____________________________________________________________________ clignotement BANK0 adjdon ;allume la del droite call demitempo ;temporisation d'1/2s clrwdt ;remet à 0 le watchdog adjdoff ;éteint la del droite call demitempo ;temporisation d'1/2s clrwdt ;remet à 0 le watchdog adjgon ;allume la del gauche call demitempo ;temporisation d'1/2s clrwdt ;remet à 0 le watchdog adjgoff ;éteint la del gauche call demitempo ;temporisation d'1/2s clrwdt ;remet à 0 le watchdog adjdon ;allume la del droite call demitempo ;temporisation d'1/2s clrwdt ;remet à 0 le watchdog adjdoff ;éteint la del droite call demitempo ;temporisation d'1/2s clrwdt ;remet à 0 le watchdog adjgon ;allume la del gauche call demitempo ;temporisation d'1/2s clrwdt ;remet à 0 le watchdog adjgoff ;éteint la del gauche call demitempo ;temporisation d'1/2s clrwdt ;remet à 0 le watchdog adjdon ;allume la del droite adjgon ;allume la del gauche call demitempo ;temporisation d'1/2s clrwdt ;remet à 0 le watchdog adjdoff ;éteint la del droite adjgoff ;éteint la del gauche call demitempo ;temporisation d'1/2s clrwdt ;remet à 0 le watchdog adjdon ;allume la del droite adjgon ;allume la del gauche call demitempo ;temporisation d'1/2s clrwdt ;remet à 0 le watchdog adjdoff ;éteint la del droite adjgoff ;éteint la del gauche call demitempo ;temporisation d'1/2s clrwdt ;remet à 0 le watchdog return ;********************************************************************* ; sous programme : "avrg" * ;********************************************************************* ; ;Ce sous programme permet de faire avancer la roue gauche (en alternant ;marche et coupure). Ce sous programme dure environ 1 seconde ; ;_____________________________________________________________________ avrg BANK0 argon ;allume le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog argoff ;éteint le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog argon ;allume le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog argoff ;éteint le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog return ;********************************************************************* ; sous programme : "rerg" * ;********************************************************************* ; ;Ce sous programme permet de faire reculer la roue gauche (en alternant ;marche et coupure). Ce sous programme dure environ 1 seconde ; ;_____________________________________________________________________ rerg BANK0 rrgon ;allume le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog rrgoff ;éteint le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog rrgon ;allume le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog rrgoff ;éteint le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog return ;********************************************************************* ; sous programme : "avrd" * ;********************************************************************* ; ;Ce sous programme permet de faire avancer la roue droite (en alternant ;marche et coupure). Ce sous programme dure environ 1 seconde ; ;_____________________________________________________________________ avrd BANK0 ardon ;allume le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog ardoff ;éteint le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog ardon ;allume le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog ardoff ;éteint le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog return ;********************************************************************* ; sous programme : "rerd" * ;********************************************************************* ; ;Ce sous programme permet de faire reculer la roue droite (en alternant ;marche et coupure). Ce sous programme dure environ 1 seconde ; ;_____________________________________________________________________ rerd BANK0 rrdon ;allume le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog rrdoff ;éteint le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog rrdon ;allume le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog rrdoff ;éteint le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog return ;********************************************************************* ; sous programme : "av" * ;********************************************************************* ; ;Ce sous programme permet de faire avancer les deux roues (en alternant ;marche et coupure). Ce sous programme dure environ 1 seconde ; ;_____________________________________________________________________ av BANK0 ardon ;allume les moteur argon call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog ardoff ;éteint les moteurs argoff call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog ardon ;allume les moteurs argon call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog ardoff ;éteint les moteurs argoff call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog return ;********************************************************************* ; sous programme : "rr" * ;********************************************************************* ; ;Ce sous programme permet de faire reculer les deux roues (en alternant ;marche et coupure). Ce sous programme dure environ 1 seconde ; ;_____________________________________________________________________ rr ;DragoOon BaAall !!! xD BANK0 rrdon ;allume les moteurs rrgon call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog rrdoff ;éteint les moteurs rrgoff call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog rrdon ;allume les moteurs rrgon call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog rrdoff ;éteint les moteurs rrgoff call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog return ;********************************************************************* ; sous programme : "lebd" * ;********************************************************************* ; ;Ce sous programme permet de lever le bras droit (en alternant ;marche et coupure). Ce sous programme dure environ 1 seconde ; ;_____________________________________________________________________ lebd BANK0 lbdon ;allume le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog lbdoff ;éteint le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog lbdon ;allume le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog lbdoff ;éteint le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog return ;********************************************************************* ; sous programme : "debd" * ;********************************************************************* ; ;Ce sous programme permet de descendre le bras droit (en alternant ;marche et coupure). Ce sous programme dure environ 1 seconde ; ;_____________________________________________________________________ debd BANK0 dbdon ;allume le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog dbdoff ;éteint le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog dbdon ;allume le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog dbdoff ;éteint le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog return ;********************************************************************* ; sous programme : "lebg" * ;********************************************************************* ; ;Ce sous programme permet de lever le bras gauche (en alternant ;marche et coupure). Ce sous programme dure environ 1 seconde ; ;_____________________________________________________________________ lebg ;'spèce de prétentieux sous ;programme va xP BANK0 lbgon ;allume le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog lbgoff ;éteint le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog lbgon ;allume le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog lbgoff ;éteint le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog return ;********************************************************************* ; sous programme : "debg" * ;********************************************************************* ; ;Ce sous programme permet de descendre le bras gauche (en alternant ;marche et coupure). Ce sous programme dure environ 1 seconde ; ;_____________________________________________________________________ debg BANK0 dbgon ;allume le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog dbgoff ;éteint le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog dbgon ;allume le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog dbgoff ;éteint le moteur call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog return ;********************************************************************* ; sous programme : "lb" * ;********************************************************************* ; ;Ce sous programme permet de lever les 2 bras (en alternant ;marche et coupure). Ce sous programme dure environ 1 seconde ; ;_____________________________________________________________________ lb BANK0 lbgon ;allume les moteurs lbdon call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog lbgoff ;éteint les moteurs lbdoff call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog lbgon ;allume les moteurs lbdon call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog lbgoff ;éteint les moteurs lbdoff call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog return ;********************************************************************* ; sous programme : "deb" * ;********************************************************************* ; ;Ce sous programme permet de descendre les 2 bras (en alternant ;marche et coupure). Ce sous programme dure environ 1 seconde ; ;_____________________________________________________________________ deb ;roh, méchant va è_é BANK0 dbgon ;allume les moteurs dbdon call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog dbgoff ;éteint les moteurs dbdoff call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog dbgon ;allume les moteurs dbdon call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog dbgoff ;éteint les moteurs dbdoff call quartempo ;1/4 de s clrwdt ;remet à 0 le watchdog return ;********************************************************************* ; PROGRAMME PRINCIPAL * ;********************************************************************* start ;_____________prêt au décollage ? call clignotement ;fait appel au sous programme de clignotement clrwdt ;remet à 0 le watchdog ;_____________allumage des feux (il y a du brouillard) xP ... adjgon ;allumer la del jaune gauche adjdon ;allumer la del jaune droite ;_____________allumage des moteurs... call av ;allume les 2 moteurs (dure 1s) ;_____________Activation du S.A.C. (système anti-collision) è_é ... call detection ;fait appel au sous programme détection ;_____________Et c'est parti !! :] call av ;allume les 2 moteurs pour avancer (dure 1s) argon ;avance la roue gauche ardon ;avance la roue droite adjgoff ;éteins la del jaune gauche lbdon ;lever le bras droit call tempo ;1seconde de temporisation call demitempo ;1/2 seconde de temporisation lbdoff ;arrêter de lever le bras droit clrwdt ;remet à 0 le watchdog ;éteins les 2 moteurs pour essayer d'éviter les surchauffes argoff ;éteins le moteur roue gauche ardoff ;éteins le moteur roue droite ;les rallume. Ca ne sert peut être pas à grand chose, test... argon ;allumer le moteur roue gauche ardon ;allumer le moteur roue droite dbdon ;descends le bras droit call tempo ;1seconde de temporisation call demitempo ;1/2 seconde de temporisation dbdoff ;arrête le moteur clrwdt ;remet à 0 le watchdog adjgon ;allume la del jaune gauche argoff ;éteins le moteur roue gauche ardoff ;éteins le moteur roue droite call av ;allume les 2 moteurs pour avancer ;(dure 1s) ;_____________Petite vérification xP call detection ;fait appel au sous programme détection ;_____________Et c'est reparti !!! x] call av ;allume les 2 moteurs pour avancer ;(dure 1s) argon ;avance la roue gauche ardon ;avance la roue droite adjdoff ;éteins la del jaune droite lbgon ;lever le bras gauche call tempo ;1seconde de temporisation call demitempo ;1/2 seconde de temporisation lbgoff ;arrêter de lever le bras gauche clrwdt ;remet à 0 le watchdog ;éteins les 2 moteurs pour essayer d'éviter les surchauffes argoff ;éteins le moteur roue gauche ardoff ;éteins le moteur roue droite ;les rallume. Ca ne sert peut être pas à grand chose, test... argon ;allumer le moteur roue gauche ardon ;allumer le moteur roue droite dbgon ;descends le bras gauche call tempo ;1seconde de temporisation call demitempo ;1/2 seconde de temporisation dbgoff ;arrête le moteur clrwdt ;remet à 0 le watchdog adjdon ;allume la del jaune droite argoff ;éteins le moteur roue gauche ardoff ;éteins le moteur roue droite call av ;allume les 2 moteurs pour avancer ;(dure 1s) ;____________Juste au cas où... <img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/ohmy.gif' class='bbc_emoticon' alt=':o' /> call detection ;fait appel au sous programme détection ;____________Wouhou !!! Il n'y a rien !!! (ou plus rien...) On lève les bras en signe de joie ! XDD lbdon ;lever le bras droit lbgon ;lever le bras gauche adjdoff ;éteins la del jaune droite adjgoff ;éteins la del jaune gauche lbdoff ;éteins le moteur lbgoff ;éteins le moteur ;à peu près pendant 4 secondes, ça doit permettre ;aux deux bras de faire un tour complet call lb ;lève les 2 bras (1seconde) clrwdt ;remet à 0 le watchdog call lb ;lève les 2 bras (1seconde) clrwdt ;remet à 0 le watchdog call lb ;lève les 2 bras (1seconde) clrwdt ;remet à 0 le watchdog call lb ;lève les 2 bras (1seconde) clrwdt ;remet à 0 le watchdog adjdon ;allume la del jaune droite adjgon ;allume la del jaune gauche ;_____________On est jamais trop prudent <img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/tongue.gif' class='bbc_emoticon' alt=':P' /> call detection ;fait appel au sous programme détection call av ;fait avancer les 2 roues ; Oh ! Mais qu'est-ce que c'est ??? ;______________________________________________________________________________________________ ; ___________________________________________________________________________ ; ___________AAAAAAAAAAHHHHHHHHHHHHHHHH!!!!!!!!___________ ; ____Je suis aspiré dans une faille____ ; ______Temporelle!!!!_____ ; ______!!!!elleropmeT_____ ; ____elliaf enu snad éripsa sius eJ____ ; ___________!!!!!!!!HHHHHHHHHHHHHHHHAAAAAAAAAA___________ ; ___________________________________________________________________________ ;______________________________________________________________________________________________ ; ??? tse'c euq ec-tse'qu siaM ! hO goto start ;boucle du programme principal END ; directive fin de programme
PS : méchante limitation des smileys :'(
#12
Posté 20 juillet 2011 - 09:15
A changer dans la partie "; initialisations spécifiques".
#13
Posté 20 juillet 2011 - 09:28
Et sinon je dois mettre :
bcf TRISA,0
bcf TRISA,1
...
bcf TRISA,4
bcf TRISB,1
bcf TRISB,2
...
bcf TRISB,7
?
Est-ce qu'il faut que je configure RB0 en entrée :
bsf TRISB,0
Parce que c'est peut être le fait que je ne l'ai pas configuré qui pose problème '^^
#14
Posté 20 juillet 2011 - 10:03
Vu que tu initialise toutes les variables à 0 toutes les IO seront en sortie donc les LEDs vont s'allumer !
#15
Posté 20 juillet 2011 - 10:08
(par contre qu'est-ce qu'un IO ? Les pins programmables ?)
#16
Posté 20 juillet 2011 - 10:12
#17
Posté 20 juillet 2011 - 10:24
Par contre,
J'ai essayé de changer en mettant les TRISx et en programmant RB0 en entrée mais ça ne change rien j'ai toujours le même problème qu'avant :/ Merci quand même pour ton aide !
Ca aiderait si je pouvais poster la vidéo du test mais on peut pas sur le forum :x Donc est-ce qu'il y a un moyen ? Ou alors je dois la mettre sur une plateforme genre you tube ?
#18
Posté 20 juillet 2011 - 10:43
Pour mettre une vidéo oui je pense que tu es obligé de passer par youtube.
#19
Posté 20 juillet 2011 - 10:46
Ok je mets 93 dans optionval, je fais la vidéo et j'essaierai de la mettre sur you tube
Ca ne marche pas non plus :/ Bon je vais essayer de mettre la vidéo sur you tube
Bon j'ai crée un compte you tube et j'ai mis la vidéo, malheureusement ya une bande son de ***** et j'ai pas réussi à supprimer la vidéo pour la retirer (si quelqu'un sait comment faire...)
Enfin bref, voici le lien de la vidéo du test :
(je prends la barre de métal qui est connecté au + de la pile et je touche RB0)
#20
Posté 20 juillet 2011 - 07:08
0 utilisateur(s) li(sen)t ce sujet
0 members, 0 guests, 0 anonymous users