Aller au contenu


Photo
- - - - -

Simulation d'un programme asm


  • Veuillez vous connecter pour répondre
31 réponses à ce sujet

#1 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 12 juillet 2011 - 06:51

Bonjour,
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 :D) 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 Maïck

Maïck

    Membre passionné

  • Membres
  • PipPipPip
  • 390 messages
  • Gender:Male
  • Location:Suisse

Posté 14 juillet 2011 - 09:38

J'ai programmé pas mal de pics et je n'ai jamais eu de problème avec l'outil de simulation... Le debugeur je ne dit pas, mais le simulateur à toujours bien fonctionné !

Tu es sur que ton problème ne vient pas de ton code ?

#3 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 14 juillet 2011 - 05:46

A mon avis c'est justement mon code le problème XD (pour ça que je veux simuler ^^). Mais bon je pense surtout que je ne sais pas du tout me servir de mp lab et que je fais beaucoup de bêtises ! :s
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 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 14 juillet 2011 - 05:54

(désolé pour le double post mais j'avais oublié quelques questions "^^)
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 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 15 juillet 2011 - 02:33

(vraiment désolé pour les posts en boucle... "^^)
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 ! :D
Donc si vous avez des conseils n'hésitez pas ! :o
Merci d'avance :)

#6 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 15 juillet 2011 - 03:56

C'est bon pour la programmation, j'ai modifié mon programme et il marche désormais !! :D Cependant mon robot, lui, ne fonctionne toujours pas "-- mais bon ce sera dans une autre section xD
merci (pour les lectures et la réponse, on se sent moins seul xD)

#7 Maïck

Maïck

    Membre passionné

  • Membres
  • PipPipPip
  • 390 messages
  • Gender:Male
  • Location:Suisse

Posté 17 juillet 2011 - 12:23

Si tu veut de l'aide sur un programme commence par le poster ! ;)

Pour le codage en "schéma" comme tu dit je pense que tu veut parler du flowcode. Je le déconseille vivement...

#8 Mic*

Mic*

    Habitué

  • Membres
  • PipPip
  • 229 messages
  • Gender:Male
  • Location:Sarthe
  • Interests:électronique, jardin, promenade,bricolage

Posté 18 juillet 2011 - 04:25

Bonjour,

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 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 19 juillet 2011 - 11:16

Excusez moi je suis peut être en retard pour les réponses "^^ (j'ai pas encore trouvé le moyen de voir si on a répondu sur l'un de mes sujets autrement qu'en y allant :x D'ailleurs si vous savez comment on fait, ce serait super xD)

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 :P)
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 ! :D
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 Maïck

Maïck

    Membre passionné

  • Membres
  • PipPipPip
  • 390 messages
  • Gender:Male
  • Location:Suisse

Posté 19 juillet 2011 - 10:24

Le programme en entier aiderais bien ! Parce que là il n'y a pas vraiment de quoi se tromper... ;)

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 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 20 juillet 2011 - 08:44

Ah ok ! xD Cool pour l'arrêt des intérupts ^^

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... :rolleyes:
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 Maïck

Maïck

    Membre passionné

  • Membres
  • PipPipPip
  • 390 messages
  • Gender:Male
  • Location:Suisse

Posté 20 juillet 2011 - 09:15

Déjà une grosse faute, pour initialiser en entrée ou en sortie il faut mettre les registre TRISx à 1 ou 0 pas PORTx.

A changer dans la partie "; initialisations spécifiques".

#13 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 20 juillet 2011 - 09:28

Ok merci ^^ Je vais essayer en le changeant ! :o Mais tu es sûr que ça pose problème ? Parce que mon programme fonctionne (enfin sauf les intérupts :rolleyes: )

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 Maïck

Maïck

    Membre passionné

  • Membres
  • PipPipPip
  • 390 messages
  • Gender:Male
  • Location:Suisse

Posté 20 juillet 2011 - 10:03

Justement, oui il faut le configurer en entrée ! :)

Vu que tu initialise toutes les variables à 0 toutes les IO seront en sortie donc les LEDs vont s'allumer ! :ph34r:

#15 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 20 juillet 2011 - 10:08

Ok, je le configure en entrée et je test merci ^^
(par contre qu'est-ce qu'un IO ? :unsure: Les pins programmables ?)

#16 Maïck

Maïck

    Membre passionné

  • Membres
  • PipPipPip
  • 390 messages
  • Gender:Male
  • Location:Suisse

Posté 20 juillet 2011 - 10:12

I/O, Input/Output ==> Entrée sortie, les pins du uP quoi ! :)

#17 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 20 juillet 2011 - 10:24

Ah ! D'accord !! xD

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 Maïck

Maïck

    Membre passionné

  • Membres
  • PipPipPip
  • 390 messages
  • Gender:Male
  • Location:Suisse

Posté 20 juillet 2011 - 10:43

Pas certain que ça puisse poser problème, mais ayant déjà été emmerdé avec ça: essaye de mettre 93 à la place de 13 dans OPTIONVAL. (désactivation des pull up)

Pour mettre une vidéo oui je pense que tu es obligé de passer par youtube.

#19 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 20 juillet 2011 - 10:46

Merci je test mais normalement mes pull up ont déjà été désactivé '^^
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 Maïck

Maïck

    Membre passionné

  • Membres
  • PipPipPip
  • 390 messages
  • Gender:Male
  • Location:Suisse

Posté 20 juillet 2011 - 07:08

Les interruptions fonctionnent sur des transitions, RB0 est il relié à la masse via une résistance ? (10k ou plus)




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users