31/05/2007, 18h07
|
#1 |
Date d'inscription: mars 2007 Âge: 23
Messages: 58
| reception 2 octets en I2C
bonjour à tous,
voilà, je communique entre mes 2 PIC16F876a via l'i2c, j'arrive à envoyer un octet, mais le soucis c'est que maintenant je dois en envoyer 2 d'un coups!
et je vois pas comment faire au niveau de la reception...si vous pouviez me donner un coup de main...ça serai gentil,
voici mon prog(en gros...) pour la réception d'un octet via interruption:
bsf STATUS,RP0 ; sélectionner banque1
btfss PIE1,SSPIE ; tester si interrupt autorisée
goto restorereg ; et fin d'interrupt
bcf STATUS,RP0 ; oui, sélectionner banque0
btfss PIR1,SSPIF ; oui, tester si interrupt en cours
goto restorereg ; et fin d'interrupt
call intI2C ; oui, traiter interrupt
bcf PIR1,SSPIF ; effacer flag interupt
goto restorereg ; et fin d'interrupt
intI2C
movf SSPBUF,w ; charger octet reçu
btfss SSPSTAT,D_A ; tester si octet de donnée
return ; non, retour
movwf data_i2c ; oui, le charger dans variable data_i2c
bsf flag,0 ; mettrele flag à 1
bsf PORTB,7 ; allumer LED pour indiquer réception OK
return ; retour
merci à tous et bonne fin de journée
|
| | Aujourd'hui
| | | | Liens sponsorisés | |
|
|
31/05/2007, 21h38
|
#2 |
Date d'inscription: juillet 2004
Messages: 813
| Re : reception 2 octets en I2C
Salut,
La 3ème ligne de ton code pose problème car un fois tu es en BANK1 et une autre tu es en BANK0, ce qui inévitablement cause un sérieux bug dans ton programme...
David.
|
| |
01/06/2007, 09h00
|
#3 |
Date d'inscription: mars 2007 Âge: 23
Messages: 58
| Re : reception 2 octets en I2C
ok, merci, je vais corriger ça, pourtant ça marche nikel pour un octet...
et pour deux, vous avez pas d'idées du comment faut faire??
au niveau du maître je dois envoyer un repeat start et mon deuxième octet, mais au niveau de l'esclave...comment je le receptionne???....
|
| |
01/06/2007, 09h21
|
#4 |
Date d'inscription: mars 2007 Âge: 23
Messages: 58
| Re : reception 2 octets en I2C
j'ai modifié, et ça marche plus...et j'ai vérifié, je uis bien dans les bonnes bank,
PIE1 est en banque1 et PIr1 en banque 0, donc c'est normal que je change de banque!
|
| |
01/06/2007, 14h55
|
#5 |
Date d'inscription: mars 2007 Âge: 23
Messages: 58
| Re : reception 2 octets en I2C
personne n'a d'idée pour la réception de deux octets???
et même l'emmission (je suis pas sur qu'il faille juste envoyer un repeat start puis la donnée).
|
| |
01/06/2007, 17h42
|
#6 |
Date d'inscription: juillet 2004
Messages: 813
| Re : reception 2 octets en I2C
Salut,
C'est le "restorreg" qui pose problème!!!!
Tu as au minimum une erreur de BANK et de ce fait, il est probable que la réception du première octet fonctionne correctement avant plantage de ton programme...
David.
|
| |
01/06/2007, 19h27
|
#7 |
Date d'inscription: mars 2007 Âge: 23
Messages: 58
| Re : reception 2 octets en I2C
salut David,
je ne vois vraiment pas ou tu vois un problème, enfin je ne comprends pas.
Si tu sais qu'il y a une erreur est-ce que tu peux être plus explicite, parce que la je ne comprends pas vraiment.
Je teste si le bit SSPIE est à 1 (registre PIE1 en banque1)
si non , fin d'interruption et donc le restorereg,
et si oui je vais tester le bit SSPIF, mais comme il est en banque 0 je passe d'abord en banque 0 ...
donc je ne vois vraiment pas, mais si tu es sur de toi, eclaire moi STP
bonne soirée
|
| |
01/06/2007, 19h53
|
#8 |
Date d'inscription: juillet 2004
Messages: 813
| Re : reception 2 octets en I2C
Dans le premier restorreg, tu sorts de la routine sans repasser en BANK0...
bsf STATUS,RP0 ; sélectionner banque1
btfss PIE1,SSPIE ; tester si interrupt autorisée goto restorereg ; et fin d'interrupt
Je ne peux pas être plus clair que celà...
David.
|
| |
04/06/2007, 09h14
|
#9 |
Date d'inscription: mars 2007 Âge: 23
Messages: 58
| Re : reception 2 octets en I2C
bonjour,
et merci david, je vais modifier ça ce matin!
et pour la réception de deux octets, personne n'a de solutions???
|
| |
04/06/2007, 14h51
|
#10 |
Date d'inscription: juillet 2004
Messages: 813
| Re : reception 2 octets en I2C
Salut,
Modifie cette partie du code, et cela devrait fonctionner, car le reste de la routine semble correct.
Si cela ne fonctionne pas, place ton code sur le forum.
David.
|
| |
04/06/2007, 16h58
|
#11 |
Date d'inscription: mars 2007 Âge: 23
Messages: 58
| Re : reception 2 octets en I2C
j'ai changé la partie du prog, ça a l'air de marcher.
mais je ne sais toujours pas comment faire pour recevoir mon deuxième octet?
quel bit il faut tester dans l'interruption?? parceque je ne peut pas en sortir, sinon je vais écraser le premier...bref, si quelqu'un sait comment on fait...
vous avez bien deja utilisé l'I2C quand même.... |
| |
04/06/2007, 17h21
|
#12 |
Date d'inscription: juillet 2004
Messages: 813
| Re : reception 2 octets en I2C
Au lieu de placer SPBUFF dans "data_i2c" range les données dans un buffer circulaire soft.
Ensuite, tu disposes de tes données et tu peux les manipuler comme tu l'entends...
David.
|
| |
04/06/2007, 18h06
|
#13 |
Date d'inscription: mars 2007 Âge: 23
Messages: 58
| Re : reception 2 octets en I2C
ouais c'est une idée, mais je sais pas trop faire ce genre de truc, j'avais deja essayé pour une autre appli, sans grand succées!
et pour juste deux octets je vois pas trop l'intéret d'utiliser un buffer...mais je me trompe surement...
par contre ça me dit toujours pas comment recevoir cet octet....
en tout cas merci quand même de ton aide, mon prog à l'air de mieu marcher pour un octet deja!!!!
|
| |
04/06/2007, 18h15
|
#14 |
Date d'inscription: juillet 2004
Messages: 813
| Re : reception 2 octets en I2C
Bon,
Si je te donne un exemple pour recevoir deux octets, le premier dans data_i2c et le deuxième dans data_i2c+1, cela te suffirait-il pour exploiter les données ?
David.
|
| |
04/06/2007, 18h57
|
#15 |
Date d'inscription: juillet 2004
Messages: 813
| Re : reception 2 octets en I2C
Allez, un bout de code pour te dépanner...
A mettre à la place de "IntI2C" Code: flags res .1 ; flag divers
data_i2c res .2
#define FlagDon flags, 0 ; deuxième donnée à réceptionner ?
#define FlagTrait flags, 1 ; traiter les deux octets
intI2C btfss SSPSTAT,D_A ; tester si octet de donnée
return ; non, retour
movf SSPBUF, w ; charger donnée dans registre de travail
btfss FlagDon ; réception du deuxième octet ?
goto PremDon ; non, alors ranger dans data_i2c
movwf data_i2c + 1 ; oui, alors ranger dans data_i2c + 1
bsf FlagTrait ; indiquer qu'il faut traiter les données
bcf FlagDon ; replacer pour prochaine réception
return ; retour
PremDon movwf data_i2c ; première octet, placer dans data_i2c
bsf FlagDon ; indiquer que le première octet est reçu
return ; et retour
; dans la boucle principale, traiter les deux données si FlagTrait est à un
; une fois les données traitées, effacer FlagTrait
David.
|
| |
05/06/2007, 09h43
|
#16 |
Date d'inscription: mars 2007 Âge: 23
Messages: 58
| Re : reception 2 octets en I2C
bonjour,
merci beaucoup david, je vais essayé ça aujourd'hui, si jamais j'ai des soucis je viendrai te faire signe...
en esperant que ça marche! |
| | |
|