Probleme de programmation d'un PIC 16F84

aeonxzero Messages postés 5 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 4 août 2010 - 21 juin 2010 à 18:16
aeonxzero Messages postés 5 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 4 août 2010 - 4 août 2010 à 22:35
Bonjour à tous, eh bien voila: je suis actuelement en train de construire un robot en suivant le livre "Petits Robots Mobiles" de Frédéric Giamarchi. Mon problème vient d'un script en assembleur (language que je ne maitrise pas encore) écrit dans ce livre. Ce script sert à programmer un PIC 16F84 .
Je précise que j'ai déja réussi à debbuger une dizaine de fois le programme pour d'autre problèmes mais celui-ci m'est insoluble.
Pour information j'utilise MPLAB IDE v6.61

Je dipose ci-dessous les 3 scripts (répartit dans 3 fichiers différent): macro.inc ; Config.inc et Prog_1.asm

;Config.inc
#define Del_V PORTA,0

#define Del_J PORTA,1

#define Del_R PORTA,3



#define CAN_P PORTB,0



#define Poussoir PORTA,2



#define Vit_Dr PORTB,3

#define Vit_Ga PORTB,6

#define Sens_Dr PORTB,4

#define Sens_Ga PORTB,5



#define Entree_A PORTB,7

#define Entree_B PORTB,2



#define Moteur_Dr_Av bcf Sens_Dr

#define Moteur_Dr_Ar bsf Sens_Dr

#define Moteur_Ga_Av bcf Sens_Ga

#define Moteur_Ga_Ar bsf Sens_Ga



#define Del_Verte_On bsf Del_V

#define Del_Verte_Off bcf Del_V

#define Del_Jaune_On bsf Del_J

#define Del_Jaune_Off bcf Del_J

#define Del_Rouge_On bsf Del_R

#define Del_Rouge_Off bcf Del_R



#define Moteur_Dr_On bsf Vit_Dr

#define Moteur_Dr_Off bcf Vit_Dr

#define Moteur_Ga_On bsf Vit_Ga

#define Moteur_Ga_Off bcf Vit_Ga





_250ms EQU 0

seconde EQU 1

can_ EQU 2





cblock 0x0E

Compt_100us

Compt_25ms

Compt_250ms

Etat

Etat_100us

MLI_compteur

MLI_rapport_Dr

MLI_rapport_Ga

CAN_Compt

CAN_Compt_Test

TOIF



endc



;macro.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC



w_temp EQU 0x0C

status_temp EQU 0x0D





BANK0 macro

bsf STATUS,RP0

endm

BANK1 macro

bsf STATUS,RP0

endm

Sauve_Reg macro

movwf w_temp

movf STATUS,w

movwf status_temp

endm

Restaure_Reg macro

movf status_temp,w

movwf STATUS

swapf w_temp,f

swapf w_temp,w

endm




;Prog_1.asm
errorlevel -302





list p=16f84

include

include <macro.inc>

include <Config.inc>

list







ORG 0x000

goto DEBUT







ORG 0x004

Sauve_Reg

movlw .255 - .44

movwf TMR0







movlw 0x08

addwf MLI_compteur,F

btfsc STATUS,Z

addwf MLI_compteur,F

movf MLI_compteur,W

addwf MLI_rapport_Dr,W



btfsc STATUS,C

Moteur_Dr_On

btfss STATUS,C

Moteur_Dr_Off

movf MLI_compteur,W

addwf MLI_rapport_Ga,W



btfsc STATUS,C

Moteur_Ga_On

btfss STATUS,C

Moteur_Ga_Off





incf Compt_100us,F

btfss STATUS,Z

goto Compt_Fin

movlw .4

movwf Compt_100us

incf Compt_25ms,F

btfss STATUS,Z

goto Compt_Fin

movlw .246

movwf Compt_25ms

bsf Etat,_250ms

incf Compt_250ms,F

btfsc Compt_250ms,2

bsf Etat,seconde

Compt_Fin





incf CAN_Compt,F





Fin_Int

bcf INTCON,TOIF

Restaure_Reg

Retfie





DEBUT

call INIT

movlw 0x10

movwf MLI_rapport_Dr

movlw 0x10

Lorsque je compile le tout, j'obtiens l'erreur suivante:

"error 116: Address label duplicated or different in the second pass" et on me précise: "Sens_Ga_Av" et "Sens_Dr_Av". (techniquement c'est sur 2 lignes différentes car l'IDE considére 2 erreurs).

Je suis allé voir l'aide de l'IDE mais cela ne m'a pas plus avançé.

Si quelqu'un peut m'aider ou sait résoudre cet insoluble probleme, il me serait d'une aide vraiment très précieuse. Toutes les réponses sont les bienvenue.
Merci d'avance.

7 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
22 juin 2010 à 00:50
salut,


dans tout ce que tu as donné, je ne vois pas Sens_Ga_Av et Sens_Dr_Av et je ne pense pas que le compilo l'invente tout seul.


@++
0
aeonxzero Messages postés 5 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 4 août 2010
22 juin 2010 à 12:14
salut;

Si j'ai bien compris tu pense qu'il faut que je déclare Sens_Ga_Av et Sens_Dr_Av.

Je ne vois pas comment Sens_Ga_Av et Sens_Dr_Av sont apparu comme probleme dans la compilation; je pensait que cela était lié aux lignes:
#define Moteur_Dr_Av bcf Sens_Dr
et
#define Moteur_Ga_Av bcf Sens_Ga

Le probleme c'est que je ne vois pas comment faire (comme je suis débutant).
Je vais tester:

#define Sens_Ga_Av
#define Sens_Dr_Av

Mais je ne sais pas si cela va débloquer mon probleme.
Je te tiens au courant.
Merci encore pour ta réponse.
0
aeonxzero Messages postés 5 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 4 août 2010
22 juin 2010 à 18:21
Oups, erreur de copier-coller; dans le script que je vous ai fournit il manque une partie, la voici ci-dessous (j'ai repris à partir de "DEBUT" dans Prog_1.asm):

DEBUT

call INIT

movlw 0x10

movwf MLI_rapport_Dr

movlw 0x10

movwf MLI_rapport_Ga

clrf CAN_Compt_Test





Bouc_depart

Del_Verte_Off

Del_Jaune_On

call Tempo_250ms

Del_Jaune_Off

Del_Rouge_On

call Tempo_250ms

Del_Rouge_Off

Del_Verte_On

call Tempo_250ms

btfsc Poussoir

goto Bouc_depart





PROG

call CAN

movf CAN_Compt_Test,W

movwf MLI_rapport_Dr

movwf MLI_rapport_Ga



btfss Entree_A

goto Test_2

btfss Entree_B

goto Test_3



Test_1

Sens_Dr_Av

Sens_Ga_Av

goto Test_Fin



Test_2

btfss Entree_B

goto Test_3

Sens_Dr_Ar

Sens_Ga_Av

goto Test_Fin



Test_3

Sens_Dr_Av

Sens_Ga_Ar

btfss Entree_A

call Tempo_250ms

call Tempo_250ms

call Tempo_250ms

call Tempo_250ms

Test_Fin

goto PROG





INIT

BANK1

movlw b'00000100'

movwf TRISA

movlw b'10000110'

movwf TRISB

movwf b'10000000'

movwf OPTION_REG

BANKO

movlw INTCON

clrf TMR0

clrf PORTA

clrf PORTB

return





Tempo_250ms

btfss Etat,_250ms

goto Tempo_250ms

bcf Etat,_250ms

return





Tempo_200us

btfss Etat_100us,1

goto Tempo_200us

Tempo_200us_1

btfss Compt_100us,1

goto Tempo_200us_1

return





CAN

btfss Etat,seconde

goto CAN_Fin

bcf Etat,seconde

bcf INTCON,GIE

BANK1

movlw b'10000110'

movlw TRISB

BANK0

bsf INTCON,GIE

bsf CAN_P

call Tempo_200us

bcf INTCON,GIE

BANK1

movlw b'10000111'

movwf TRISB

BANK0

bsf INTCON,GIE

clrf CAN_Compt

CAN_Mesure

btfsc CAN_P

goto CAN_Mesure

movf CAN_Compt,W

andlw 0xF8

movwf CAN_Compt_Test

CAN_Fin

return



end



Désolé pour l'erreur...je ne sais pas comment j'ai fait une bétise pareil...

Au fait je viens de tester une nouvelle compilation en ajoutant au fichier Config.inc les 2 lignes que j'avais supposé utiles. Résultat: le programme à été compilé correctement (sans aucune erreurs). A part une bonne centaine de "warning" (que je suppose normal mais ce n'est qu'une supposition) rien à signaler.
En ce qui concerne le déroulement normal du programme; j'attend de transférer ce dernier dans le PIC.

Ma question est la suivante: pourquoi ai-je dû ajouter ces 2 lignes alors que
"Sens_Ga_Ar" et "Sens_Dr_Ar" fonctionne apparement très bien; comme vous pouvez le voir, il n'y a écrit nulle part:
#define Sens_Dr_Ar
#define Sens_Ga_Ar

Si quelqu'un peut m'éclairer, son explication me serait vraiment utile pour mieux comprendre ce programme.
Merci d'avance pour l'attention que vous pourrez porter à ce programme.
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
23 juin 2010 à 05:49
re,

non, ce que je pense, c'est que Sens_Dr_Av et Sens_Ga_Av sont deux symboles qui sont placés à la même adresse étant donné qu'aucun code n'est defini avec.

a mon avis, ce programme n'est pas complet si il devait se compiler.

@++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
23 juin 2010 à 05:53
je me demande plutot si Sens_Machin ne devrait pas plutôt être Moteur_Machin.
0
aeonxzero Messages postés 5 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 4 août 2010
25 juin 2010 à 11:58
Donc tu suppose que je dois remplacer chaque apparition du mot "Sens..." par "Moteur...".

je vais tester.

Par contre, je peut t'affirmer (cette fois-ci) que le code que j'ai fourni est complet.

Merci pour ta réponse
0
aeonxzero Messages postés 5 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 4 août 2010
4 août 2010 à 22:35
Désolé pour ce bon mois de retard mais j'ai du m'absenter de mon lieu d'expérimentation.

Je viens juste de tester l'hypothèse que patatalo m'avait proposé: remplacer chaque apparition de Sens_Machin par Moteur_Machin dans le fichier Prog_1.asm

Aucun probleme pour la compilation ni pour le transfert mais une fois sur le robot, rien ne se passe. Je vais donc étudier de nouveau les interconnexions entre les différentes cartes du robot afin de voir s'il n'y à pas un autre probleme de ce coté là.

Je me suis aussi mis à apprendre l'assembleur grace aux tutoriux du site de Bigonoff que je trouve très bien fait et fort interessant.

J'aurai juste besoin de savoir si du point de vue fonctionnel, le programme est "logique", c'est à dire que lorsqu'il y a detection le robot fait faire marche arriere à l'une de ses roue puis continue son cycle de fonctionnement jusqu'a sa prochaine détection.

Merci d'avance pour vos réponses
0
Rejoignez-nous