com i2c.

Postby phillou » Wed May 30, 2007 12:00 am

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
 
Posts: 18
Joined: Mon Jan 20, 2014 8:01 am

Postby phillou » Wed May 30, 2007 12:00 am

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
 
Posts: 18
Joined: Mon Jan 20, 2014 8:01 am

Postby phillou » Wed May 30, 2007 12:00 am

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
 
Posts: 18
Joined: Mon Jan 20, 2014 8:01 am

Postby phillou » Wed May 30, 2007 12:00 am

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
 
Posts: 18
Joined: Mon Jan 20, 2014 8:01 am

Postby phillou » Wed May 30, 2007 12:00 am

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.
phillou
 
Posts: 18
Joined: Mon Jan 20, 2014 8:01 am

Postby ymasquel » Wed May 30, 2007 12:00 am

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.
Amicalement,
Yves.
ymasquel
Site Admin
 
Posts: 3392
Joined: Thu Jan 02, 2014 10:44 am
Location: Oise (60)

Postby phillou » Wed May 30, 2007 12:00 am

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
 
Posts: 18
Joined: Mon Jan 20, 2014 8:01 am

Postby phillou » Wed May 30, 2007 12:00 am

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
phillou
 
Posts: 18
Joined: Mon Jan 20, 2014 8:01 am


Return to E-blocks

Who is online

Users browsing this forum: No registered users and 1 guest