|
phillou
18 messages
 De passage
|
01-02-2006 02:43
Bonjour, je recherche une macro flowcode pour une com en i2c,comment puis-je la faire facilement ou bien ou la trouvé toute faite? Flowcode est un outil super et facile d'utilisation,dommage que l'i2c n' est pas intégré d' origine. Merci d' avance. Philou245@hotmail.com Phillou
|
|
phillou
18 messages
 De passage
|
19-02-2006 20:27
Après avoir questionné le forum de chez Matrix, J’ai reçu comme réponse ceci. Une étude est en cour pour avoir une (des) macro (s) pour cette communication en i2c. En attendant il m’a laisser ce code provisoirement pour dépannage. Mais je me pose la question, faut-il placer tout ce code a l’ intérieur d’ une même cellule ou bien faut-il en créer plusieurs en séparant les éléments ? Merci pour vos réponses. //prototypes char I2C_Initialize(); char MAC_MaskFromBit(char bit); void MAC_SendI2CByte(char val); void MAC_SendI2CStart(); void MAC_SendI2CStop(); char I2C_Initialize() { //initialise i2c #define I2C_TRIS trisc #define I2C_SDA 4 #define I2C_SCL 3 set_bit(I2C_TRIS, MX_I2C_SDA); set_bit(I2C_TRIS, MX_I2C_SCL); sspadd=48; //48 = 100kHz, 11 = 400kHz (@ 19.6608MHz) sspstat = 0; set_bit(sspstat,SMP); sspcon2 = 0; //i2c master mode, SPEN sspcon = 0; set_bit(sspcon,SSPM3); set_bit(sspcon,CKP); set_bit(sspcon,SSPEN); } char I2C_MaskFromBit(char bit) { char retVal = 0; switch (bit) { case 0: retVal = 0x01; break; case 1: retVal = 0x02; break; case 2: retVal = 0x04; break; case 3: retVal = 0x08; break; case 4: retVal = 0x10; break; case 5: retVal = 0x20; break; case 6: retVal = 0x40; break; case 7: retVal = 0x80; break; } return (retVal); } char I2C_ReadByte(char lastbyte) { char retVal = 0; char mask; //wait until the bus is idle... mask = I2C_MaskFromBit(R_W); while (sspstat & mask); // tx in progress? mask = I2C_MaskFromBit(ACKEN); mask = mask | I2C_MaskFromBit(RCEN); mask = mask | I2C_MaskFromBit(PEN); mask = mask | I2C_MaskFromBit(RSEN); mask = mask | I2C_MaskFromBit(SEN); while (sspcon2 & mask); // bus busy? //set RCEN and wait for it to clear mask = I2C_MaskFromBit(RCEN); sspcon2 |= mask; while ((sspcon2 & mask) == mask); if (lastbyte == 0) { clear_bit(sspcon2, ACKDT); } else { set_bit(sspcon2, ACKDT); } //set ACKEN and wait for it to clear mask = I2C_MaskFromBit(ACKEN); sspcon2 |= mask; while ((sspcon2 & mask) == mask); retVal = sspbuf; return (retVal); } void I2C_SendByte(char val) { char rw_mask = I2C_MaskFromBit(R_W); char mask; //wait until the bus is idle... while (sspstat & rw_mask); // tx in progress? mask = I2C_MaskFromBit(ACKEN); mask = mask | I2C_MaskFromBit(RCEN); mask = mask | I2C_MaskFromBit(PEN); mask = mask | I2C_MaskFromBit(RSEN); mask = mask | I2C_MaskFromBit(SEN); while (sspcon2 & mask); // bus busy? mask = I2C_MaskFromBit(BF); while (sspstat & mask); // buffer still full? sspbuf = val; while (sspstat & rw_mask); // tx in progress? return; } void I2C_SendStart() { //set SEN and wait for it to clear char mask = I2C_MaskFromBit(SEN); sspcon2 |= mask; while ((sspcon2 & mask) == mask); return; } void I2C_SendStop() { //set PEN and wait for it to clear char mask = I2C_MaskFromBit(PEN); sspcon2 |= mask; while ((sspcon2 & mask) == mask); return; }
|
|
phillou
18 messages
 De passage
|
15-03-2006 02:39
Je n' ai toujours pas de rèponsse venant de chez matrix. Je suis plus habile de programmer en c qu' en basic(je n'y comprend rien). Savez-vous m' aider? Je souhaite réaliser un protocole en i2c avec un pcf8574 (8 entrées ou sorties),le tout sur flowcode. Merci.
|
|
phillou
18 messages
 De passage
|
03-04-2006 22:16
J' ai réussis à dialogué (écriture)en I2C avec un PIC 16f877 et un PCF8574A (8 entrées, 8 sorties)le tout en flowcode. Pour infos, Philou245@hotmail.com
|
|
phillou
18 messages
 De passage
|
21-04-2006 16:26
Salut a tous, Voila, j' ai aussi la lecture en I2C avec flowcode maintenant et toujour mon petit PCF8574A qui me donne satisfaction. Le tout fait avec des insertions de codes asm dans l' organigramme. Placement de variables pour pouvoir les modifier lors d' appel pour l' addressage, lecture ou écriture de données directement avec la macro "calculation". Je vais faire des essais en le placant en interruption avec timer 0. Bien a vous. Si cela vous branche, Philou245@hotmail.com bonne journée.
|
|
YMasquel
2504 messages
 Expert
|
21-04-2006 17:24
Bonjour Phillou, Formidable, tu poses les questions et tu fournis les réponses. Voilà une excellente utilisation du forum. Personne ne t'a aidé sur le sujet, tu t'es dé..brouillé comme un chef et, sans la moindre hésitation tu donnes toutes les informations pour qu'un autre ne rame pas. Exemple à suivre. Je te tire mon chapeau. Amicalement, Yves.
|
|
phillou
18 messages
 De passage
|
01-05-2006 17:37
Merci Yves. A la demande de plusieurs personnes voici un petit rappel, Comment placer correctement un code asm à l' intérieur d' une macro C. Procèdure. -1. A l' aide de l' icône C, placement de la fonction à l 'organigramme. -2. effacer tout ce qu 'il est écrit dans l' éditeur asm après ouverture de celui-ci SAUF asm et les accolades de début et de fin d 'édition. -3. placement du code entre les accolades -4. placement d 'un titre au dessus de asm. -5. fermeture de la macro et compilation du code pour contrôler le code. N.B - lors d 'insertions de variables définies dans l' éditeur de variable flowcode, il faut l' écrire comme ceci. _FCV_nom de la variable - Lors de la création du code compilé asm il est définis comme ceci ... void FCM_nom de la macro. - lors d' appel d'une macro dans l' éditeur asm flowcode,il faut l' écrire comme ceci. call FCM_nom de la macro. Mais il faut que cette macro soit appelée au moin une fois dans l' organigramme. Phillou.
|
|
phillou
18 messages
 De passage
|
27-05-2006 00:21
Infos. Pour un PIC 16F877 SDA :RC4 sur borne 23 du pic et borne 5 de la db9 SCL :RC3 sur borne 18 du pic et borne 4 de la db9 masse : sur la borne 9 de la db9 Phillou
|