Microcontroleur PIC

Résolu
pickolo Messages postés 8 Date d'inscription lundi 11 juillet 2005 Statut Membre Dernière intervention 21 février 2006 - 15 févr. 2006 à 09:22
pickolo Messages postés 8 Date d'inscription lundi 11 juillet 2005 Statut Membre Dernière intervention 21 février 2006 - 21 févr. 2006 à 18:45
salut
j'utilise un PIC 16F628 pour traiter une serie d'information venant d'un PC via le port RS232.le probleme se posse lorsque je doit envoyer les informations a 4 equipements que j'ai monté avec toujours les meme PIC 16F628. Les informations du PC passe par un HUB construit a cette effet et chaque equipements a une adresse personnelle. Le probleme est que lorsque j'envoi les infos pour un equipement je ne peux plus envoyer d'autre informations aux autres equipements du moins ils ne reagissent plus aux nouveaux messages. Mais lorsque je fais un reset sur un equpement et que j'envoi un message a cet equipement il reagit.
je veux commender ces 4 equipements sans avoir a faire de reset pour que l'un traite les information quand un precedent en a deja traité.
Pouvier vous m'aider?

9 réponses

frobinet Messages postés 64 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 décembre 2006
20 févr. 2006 à 18:08
Salut,

Le protocole série n'a pas d'adressage ! Donc qui s'occupe de rediriger est-ce que c'est le Hub qui determine la cible ou est-ce que c'est le microcontroleur qui considère que c'est pour lui ou pas ? Comment les autres sont mis en attente (mise en attente logiciel ou matériel DTR/DSR) ?

Petite astuce :
Dans notre cas, nous envoyons dans chaque trame emise une entête reprenant la cible ce qui permet à chaque unité de vérifier si le message est pour lui et en cas de plantage il n'y a pas à faire de fonction de reveil!
3
frobinet Messages postés 64 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 décembre 2006
21 févr. 2006 à 12:53
Yes but,

As tu un exemple de trame qui fais planté ? (les douzes octets qui font planté à coups sûr par exemple !)
3
pickolo Messages postés 8 Date d'inscription lundi 11 juillet 2005 Statut Membre Dernière intervention 21 février 2006
21 févr. 2006 à 09:27
slt Frobinet

Dans ma conception actuelle ce sont les microcontroleurs de chaque boitiers qui reconnaisent les informations.car chaque information a une entete .pratiquement voila un extrait du code pour l'entete.

ADRESSE1 bsf RCSTA,CREN ; debut de réception

btfss PIR1,RCIF ; attend que le flag soit à 1 = => dés que l'octet est reçu et
; transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf CTRL_ADRESSE ; le sauver l'octet d'adresse
movfw CTRL_ADRESSE ; on charge RCREG dans W
xorlw 0x31 ;adresse définie pour la CABINE 1
btfss STATUS,Z
goto ADRESSE1

btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et
; transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf CTRL_PHONE ; le sauver l'octet d'adresse
movfw CTRL_PHONE ; on charge RCREG dans W
xorlw 0x41 ;Téléphone décroché
btfss STATUS,Z
goto RECEPTION1
call MES_AFF6

Pour la mise en attente des autres je ni ai vraiment pas pensé
Et je ne sais pas trop grande chose sur le DTR/DSR mais je vais faire des recherches tout à l'heure.
merci pour ton aide
mon contact msn si tu veux: kolotcholoma@hotmail.com
0
frobinet Messages postés 64 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 décembre 2006
21 févr. 2006 à 10:13
Salut,

Suivant les lignes de ton programme, tu reboucle sur le test de chaque caractère reçu par le port série jusqu'à ce que tu reconnaisse le numéro de cabine et pas seulement sur une entête !

La longueur de ta trame lorsque les deux interlocuteurs se parle est elle importante et est-tu sûr que dans une des trames que reçoit la cabine 2 (0x32) tu n'utiserai pas un 0x31 qui passerai du coup la cabine 1 en reception alors qu'elle ne devrait pas.
0

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

Posez votre question
pickolo Messages postés 8 Date d'inscription lundi 11 juillet 2005 Statut Membre Dernière intervention 21 février 2006
21 févr. 2006 à 12:16
Hi

Pour ce qui est des trames envoyer aux differentes cabines il n ya pas de risque de repeter par exemple l'adresse d'une autre cabine.j'ai devollopé parallelement une interface en VB qui me génére les trames pour chaque cabine avec les adresses comme entete de chaque trame.
comme je l'ai dit precedament quand j'envoi les informations pour la cabine 1 tout marche correctement ;par ailleurs si je souhaite envoyer des infos a la cabine 2 rien et il faut d'abors faire un reset de la cabine 2 avant puis renvoyer la trame pour observer quelque chose.
Et ce probleme se posse quand j'en vois plusieurs octets (12 octets environ )de suite a la cabine 1.
sinon pour 2 octets envoyés il n'ya pas de probleme a communiquer avec la cabine 2 bizar!
vois tu peux de quoi je parle?
comment faire une procedure de mise en attente?
0
pickolo Messages postés 8 Date d'inscription lundi 11 juillet 2005 Statut Membre Dernière intervention 21 février 2006
21 févr. 2006 à 16:54
ADRESSE1 bsf RCSTA,CREN ; debut de réception

btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf CTRL_ADRESSE ; le sauver l'octet d'adresse
movfw CTRL_ADRESSE ; on charge RCREG dans W
xorlw 0x32 ;adresse définie pour la CABINE 1
btfss STATUS,Z
goto ADRESSE1



btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf CTRL_PHONE ; le sauver l'octet d'adresse
movfw CTRL_PHONE ; on charge RCREG dans W
xorlw 0x41 ;Téléphone décroché
btfss STATUS,Z
goto RECEPTION1
call MES_AFF6

RECEPTION1

movfw CTRL_PHONE ;RCREG ; charger octet reçu dans W
movwf X0 ; sauver
nop


btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X1 ; sauver
nop


btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X2 ; sauver
nop



btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X3 ; sauver
nop


btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X4 ; sauver
nop


btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X5 ; sauver
nop



btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X6 ; sauver
nop



btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X7 ; sauver
nop



btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X8 ; sauver
nop



btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X9 ; sauver
nop



btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X10 ; sauver
nop


btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X11 ; sauver
nop



btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X12 ; sauver




btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X13 ; sauver
nop



btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X14 ; sauver
nop



btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X15 ; sauver
nop



btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X16 ; sauver
nop



btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X17 ; sauver
nop



btfss PIR1,RCIF ; attend que le flag soit à 1 ==> dés que l'octet est reçu et transféré dans rcreg
goto $-1
movfw RCREG ; charger octet reçu dans W
movwf X18 ; sauver
nop



bcf RCSTA,CREN ; FIN de réception


TRANSFERT1 ;call Clear_LCD ;on efface l'ecran


;**************************************************
;********************** LIGNE1 *******************

movlw ' ' ;espace
call LCD_PUTCHAR


movlw ' ' ;espace
call LCD_PUTCHAR


;*****************************************
;*************** ************ *************


movfw X0 ;prémiere lettre du type
call LCD_PUTCHAR


movfw X1 ;deuxième lettre du type
call LCD_PUTCHAR


movfw X2 ;troisième lettre du type
call LCD_PUTCHAR

;******************************************


movlw ' ' ;espace
call LCD_PUTCHAR


movlw ' ' ;espace
call LCD_PUTCHAR


;**********************************************
;*************** ***************** *************


movfw X3 ;prémiere lettre
call LCD_PUTCHAR


movfw X4 ;deuxième lettre
call LCD_PUTCHAR


movfw X5 ;troisième lettre
call LCD_PUTCHAR


movfw X6 ;quatrième lettre
call LCD_PUTCHAR


movfw X7 ;cinquième lettre
call LCD_PUTCHAR


movfw X8 ;sixième lettre
call LCD_PUTCHAR


movfw X9 ;septième lettre
call LCD_PUTCHAR


;******************************************


movlw ' ' ;espace
call LCD_PUTCHAR


movlw ' ' ;espace
call LCD_PUTCHAR



;*******************************************
;///////////////////////////////////////////
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;*******************************************


;**************************************************
;********************** LIGNE2 *******************


movlw 0xC0 ;basculement a la ligne 2 première position a gauche
call LCD_PUTCMD ;envoi la commande au LCD


;*******************************************
;************* TEMPS ECOULE****************


movlw 'T' ;T pour indiquer la zone de chrono (temps)
call LCD_PUTCHAR


movlw ':' ;deux point d'espacement
call LCD_PUTCHAR


;*******************************************


movfw X10 ;dizaines
call LCD_PUTCHAR


movfw X11 ;unités
call LCD_PUTCHAR


;*******************************************
movlw ':' ;deux point d'espacement
call LCD_PUTCHAR
;*******************************************


movfw X12 ;dizaines
call LCD_PUTCHAR


movfw X13 ;unités
call LCD_PUTCHAR


;********************************************
movlw ' ' ;espace
call LCD_PUTCHAR


movlw ' ' ;espace
call LCD_PUTCHAR


;********************************************
;****************************** **************


movlw 'F' ;
call LCD_PUTCHAR


movlw ':' ;deux point d'espacement
call LCD_PUTCHAR


;********************************************



movfw X14 ;
call LCD_PUTCHAR


movfw X15 ;
call LCD_PUTCHAR


movfw X16 ;
call LCD_PUTCHAR


movfw X17 ;
call LCD_PUTCHAR


movfw X18 ;
call LCD_PUTCHAR


goto ADRESSE1
0
pickolo Messages postés 8 Date d'inscription lundi 11 juillet 2005 Statut Membre Dernière intervention 21 février 2006
21 févr. 2006 à 17:01
ci.dessus c'est la trame la plus longue que les pic recoivent.
regarde s'il ya quelque chose d'anormal qui planterai le reste des cabines fait moi signe.
mais ça marche bien pour une cabine.
A +
0
frobinet Messages postés 64 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 décembre 2006
21 févr. 2006 à 17:19
Le caractère de sélection de la cabine est 0x31 soit '1' or tu envoie visiblement un afficheur horaire (LIGNE 2), il y a de grande chance que la trame contienne au moins un caractère numerique '2','3','4' ce qui fais que la mauvaise cabine croit que la trame est pour elle et rentre dans ta fonction de reception, la trame n'étant pas complète elle n'est plus en attente du prochaine ordre.

Choisit commme adresse de Cabine les adresses 0xB1, 0xB2, 0xB3, 0xB4 et comme adresse de racrochage un 0xBA comme ça il y a peu de chance que t'utilise ces carcatères
0
pickolo Messages postés 8 Date d'inscription lundi 11 juillet 2005 Statut Membre Dernière intervention 21 février 2006
21 févr. 2006 à 18:45
ok j'ai essayer ça et je te contact pour te donner une suite
merci encore
et A+
0
Rejoignez-nous