I2C sur S08SH8 [Forums - HC908 et S08]
I2C sur S08SH8 [Forums - HC908 et S08]
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
Recherche
 
   
 

Parcourir ce sujet :   1 Utilisateur(s) anonymes



(1) 2 3 »


I2C sur S08SH8
Régulier
Inscrit:
23/10/2012 16:36
Messages: 60
Hors Ligne
Bonjour,

Je cherche à faire communiquer deux microcontrôleurs S08SH8, un CTG et l'autre CPJ.

Mais je bloque, je n'arrive même pas à comprendre comment avoir 100kb.
J'ai bien placé deux résistances de pull-up de 2.3Khoms. Mais sinon, tous les codes que j'ai essayé ne fonctionne pas.

J’essaie d'envoyer un A et que celui qui reçoit allume une diode.

Si on pouvait m'aider au moins à bien configurer les deux micro ça m'aiderait beaucoup.

Posté le : 24/03/2013 14:25
Transférer la contribution vers d'autres applications Transférer


Re: I2C sur S08SH8
Accro
Inscrit:
06/07/2007 09:17
Messages: 697
Hors Ligne
Bonjour.
Déjà, il faut voir si le slave répond bien a l'adresse.
As-tu l'acknowledge ?

Posté le : 24/03/2013 14:40
Transférer la contribution vers d'autres applications Transférer


Re: I2C sur S08SH8
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1924
Hors Ligne
Salut

Je ne sais pas quel est ton besoin exact mais si tu as le choix, tente de faire causer tes deux µC par SPI plutôt que par I2C.
la SPI est ultra simple et plus rapide
L'I2C favorise assez dangereusement la perte de cheveux.

Posté le : 24/03/2013 16:23
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: I2C sur S08SH8
Régulier
Inscrit:
23/10/2012 16:36
Messages: 60
Hors Ligne
Je veux créer une carte d'asservissement moteur qui pourrait piloter 3 moteurs.
Il y aurais un micro contrôleur par moteur en mode esclave et un seul micro en mode maître pour donner les ordres (vitesses, distances, ...).


Dans ce cas précis, le maître serait le s08sh8ctg et l'esclave serait un s08sh16ctl (que je remplace pour m'entrainer par un s08sh8cpj). J'ai remarqué qu'il n'y avait qu'un seul spi disponible sur le maître (s08sh8ctg) donc je me suis orienté vers l'I2C mais je ne sais pas si c'est un choix judicieux.

Posté le : 24/03/2013 16:49
Transférer la contribution vers d'autres applications Transférer


Re: I2C sur S08SH8
Régulier
Inscrit:
23/10/2012 16:36
Messages: 60
Hors Ligne
Pour répondre à Ikoria,

Voila ma configuration pour l'esclave :

/* ### Init_IIC init code */
/* IICC2: GCAEN=1,ADEXT=0,AD10=0,AD9=0,AD8=0 */
IICC2 = 0x80;
/* IICA: AD7=0,AD6=1,AD5=0,AD4=0,AD3=0,AD2=0,AD1=0 */
IICA = 0x40;
/* IICF: MULT1=0,MULT0=0,ICR5=0,ICR4=0,ICR3=1,ICR2=0,ICR1=1,ICR0=1 */
IICF = 0x0B;
/* IICS: TCF=1,IAAS=0,BUSY=0,ARBL=1,SRW=0,IICIF=1,RXAK=0 */
IICS = 0x92; /* Clear the interrupt flags */
/* IICC1: IICEN=1 */
IICC1 |= (unsigned char)0x80;
/* IICC1: IICEN=1,IICIE=1,MST=0,TX=0,TXAK=0,RSTA=0 */
IICC1 = 0xC0;

Et pour le maître,

/* ### Init_IIC init code */
/* IICC2: GCAEN=1,ADEXT=0,AD10=0,AD9=0,AD8=0 */
IICC2 = 0x80;
/* IICA: AD7=0,AD6=0,AD5=0,AD4=0,AD3=0,AD2=0,AD1=0 */
IICA = 0x00;
/* IICF: MULT1=0,MULT0=0,ICR5=0,ICR4=0,ICR3=1,ICR2=0,ICR1=1,ICR0=1 */
IICF = 0x0B;
/* IICS: TCF=1,IAAS=0,BUSY=0,ARBL=1,SRW=0,IICIF=1,RXAK=0 */
IICS = 0x92; /* Clear the interrupt flags */
/* IICC1: IICEN=1 */
IICC1 |= (unsigned char)0x80;
/* IICC1: IICEN=1,IICIE=1,MST=0,TX=1,TXAK=0,RSTA=0 */
IICC1 = 0xD0;

J'utilise les interruptions pour information ^^

Posté le : 24/03/2013 16:53
Transférer la contribution vers d'autres applications Transférer


Re: I2C sur S08SH8
Pilier de la communauté
Inscrit:
27/09/2005 18:26
Messages: 794
Hors Ligne
Salut Seb !

J'avais personnellement implémenté l'I2C en soft dans une appli après beaucoup d'essais, plus simple, car comme le dit Charly, il y a risque a y perdre beaucoup...

As tu un oscilloscope ou un analyseur logique pour essayer de déboguer (step 1 : voir si le maitre émet quelque chose) ?

Joël

Posté le : 24/03/2013 20:21
En Savoie, on a pas de pétrole, mais on a des Diots !
Transférer la contribution vers d'autres applications Transférer


Re: I2C sur S08SH8
Accro
Inscrit:
29/08/2006 10:42
De cambrai
Messages: 658
Hors Ligne
Je vais fouiller dans mes archives, je dois avoir les codes maitres et esclaves pour SH8

Posté le : 24/03/2013 20:29
La perfection est atteinte non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer....
(A de St EXUPERY)
Transférer la contribution vers d'autres applications Transférer


Re: I2C sur S08SH8
Accro
Inscrit:
06/07/2007 09:17
Messages: 697
Hors Ligne
plop
Il faudrait voir également plusieurs élements:
- comment tu gère le module dans les IT...
- comment ce situe le module I2C dans tes slaves (priorité des IT etc...)?

Effectivement un oscillo est bien pour voir si tu n'as pas de probleme sur ton bus.

NOTE: il est vrais que le SPI est beaucoup plus facile d'utilisation que l'I2C. Cependant, il est (à mon avis) également beaucoup plus sensible au perturbation...

Posté le : 24/03/2013 22:56
Transférer la contribution vers d'autres applications Transférer


Re: I2C sur S08SH8
Régulier
Inscrit:
23/10/2012 16:36
Messages: 60
Hors Ligne
Déjà merci de m'aider, car je me tire les cheveux pour que ça fonctionne ^^.

Donc je vais mettre mon code.

Maître :

LE Main

void delay (unsigned int long value){
for (;value>0;value--)__RESET_WATCHDOG();
}

void main(void) {
MCU_init(); /* call Device Initialization */
PTBD_PTBD6 = 0;

delay(10000);

/* include your code here */
I2C_DATA_ENVOYE[0] = 'A';
envoieMessage(ADRESSE_SLAVE, 1);
recupMessage(ADRESSE_SLAVE, 1);
if(I2C_DATA_RECU[0] == 'B'){
PTBD_PTBD6 = 1;
}


for(;;) { __RESET_WATCHDOG();
/* __RESET_WATCHDOG(); by default, COP is disabled with device init. When enabling, also reset the watchdog. */
} /* loop forever */
/* please make sure that you never leave main */
}

Et la fonction d’interruption :

__interrupt void isrViic(void)
{
/* Write your interrupt code here ... */
IICS_IICIF = 1;

if(IICS_RXAK==1){ /* Verify if byte sent was ACK */
IICC_MST = 0;
IIC_ETAT = IIC_ERROR_STATUS;
return;
}

switch(etapeActuelle){
case 0:
if(IICS_SRW == 1){//Si on recoie des donnees

if(pointeur_Data_Recu < (MAX_LENGTH-2) && nbreDonneesARecevoir > 1)
{
I2C_DATA_RECU[pointeur_Data_Recu] = IICD; // save data to RAM;
pointeur_Data_Recu++;
nbreDonneesARecevoir--;
return;
}
else if(pointeur_Data_Recu < (MAX_LENGTH-1) && nbreDonneesARecevoir == 1)
{
IICC_TXAK = 1; // acknowledge disable;
I2C_DATA_RECU[pointeur_Data_Recu] = IICD; // save data to RAM;
pointeur_Data_Recu++;
nbreDonneesARecevoir--;
return;
}else{
IICC_MST = 0; // generate stop signal;
IIC_ETAT = IIC_OK;

}
}else{//Si on envoie des donnees
if(pointeur_Data_Recu < (MAX_LENGTH-1) && nbreDonneesAEnvoyer > 0)
{
IICD = I2C_DATA_RECU[pointeur_Data_Envoie];
pointeur_Data_Envoie++;
nbreDonneesAEnvoyer--;
return;
}
else
{
IICC_MST = 0; // generate stop signal;
IIC_ETAT = IIC_OK;
return;
}
}
}

}

Et les fonctions d'envoient et de récupération des messages :

unsigned char adresse;
unsigned char nbreDonneesAEnvoyer;
unsigned char nbreDonneesARecevoir;
unsigned char IIC_ETAT;
unsigned char etapeActuelle;

unsigned char pointeur_Data_Recu;
unsigned char I2C_DATA_RECU[MAX_LENGTH];
unsigned char pointeur_Data_Envoie;
unsigned char I2C_DATA_ENVOYE[MAX_LENGTH];


void envoieMessage(unsigned char adresseSlave, unsigned char nbreData)
{
adresse = adresseSlave;
nbreDonneesAEnvoyer = nbreData;
pointeur_Data_Envoie = 0; // for interrupt only;
IIC_ETAT = IIC_EN_COURS_DAQUISITION; // for interrupt only;
etapeActuelle = 0;
if(nbreDonneesAEnvoyer >= MAX_LENGTH) nbreDonneesAEnvoyer = MAX_LENGTH-1;
while(IICS_BUSY)__RESET_WATCHDOG();//Si la ligne est libre on continue
IICC_TXAK = 0; // RX/TX = 1; MS/SL = 1, TXAK = 0;
IICC |= 0x30; // And generate START condition;
IICD = (adresse<<1)|0; // Maitre -> esclave Address the slave and set up for master transmit;
}

void recupMessage(unsigned char adresseSlave, unsigned char nbreData)
{
adresse = adresseSlave; // load address;
nbreDonneesARecevoir = nbreData; // load length of data pack to be written;
pointeur_Data_Recu = 0; // for interrupt only;
IIC_ETAT = IIC_EN_COURS_DAQUISITION; // for interrupt only;
etapeActuelle = 0;
if(nbreDonneesARecevoir >= MAX_LENGTH) nbreDonneesARecevoir = MAX_LENGTH-1; // set limit;
while(IICS_BUSY)__RESET_WATCHDOG();//Si la ligne est libre on continue
IICC_TXAK = 0; // RX/TX = 1; MS/SL = 1; TXAK = 0;
IICC |= 0x30; // And generate START condition;
IICD = (adresse<<1)|1; // Esclave -> Maitre Address the slave and set up for master transmit;
}

Posté le : 25/03/2013 14:00
Transférer la contribution vers d'autres applications Transférer


Re: I2C sur S08SH8
Régulier
Inscrit:
23/10/2012 16:36
Messages: 60
Hors Ligne
:/ C'est pas très lisible.

Je met tous dans les fichiers suivants pour le maitre :

Attacher un fichier:


c IIC_MASTER.c Taille: 1.82 KB; Hits: 132
c main.c Taille: 1.03 KB; Hits: 141
c MCUinit.c Taille: 10.53 KB; Hits: 220

Posté le : 25/03/2013 14:05
Transférer la contribution vers d'autres applications Transférer



 Haut   Précédent   Suivant
(1) 2 3 »



Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

I2C sur S08SH8 [Forums - HC908 et S08]