Séquencement avec timer et module(s) sous IT [Forums - HC908 et S08]
Séquencement avec timer et module(s) sous IT [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 4 5 ... 12 »


Re: Séquencement avec timer et module(s) sous IT
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 536
Hors Ligne
Ok.

Jsuis en train de regarder mes routines iic afin de voir comment le modifier ... Pas facile !

Pour le buffer, je dois en déclarer un en fatigable globale ? Ou bien je peux me servir directement de mes variables actuelles (tableaux) ?

Posté le : 28/05/2016 21:27
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Séquencement avec timer et module(s) sous IT
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1924
Hors Ligne
la déclaration fatigable globale je ne sais pas ce que c'est

pour le reste il faut juste que ce soit déclaré en globale pour que la routine d'it y ait accès.

Posté le : 28/05/2016 22:00
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: Séquencement avec timer et module(s) sous IT
Accro
Inscrit:
06/07/2007 09:17
Messages: 697
Hors Ligne
tu devrais faire une truc dans ce genre là:

Faire un fichier IIC_Drv.c et IIC_Drv.h.

Dans IIC_DRV.c, tu déclare:
-en static ton tableau Buffer.
-une fonction Add_In_Buffer(x) qui ecrira dans ton tableau.
-une fonction static Get_From_Buffer (qui sera utilisé par ton IT) avec controle de buffer vide.
-ton IT.

Dans ton IIC_Drv.h, tu externalise ton Add_In_Buffer(x) et ton IT.

Résultat, ton main.c, qui inclut le driver, va passé par la fonction Add_In_Buffer(x) pour donner les data au driver.
Il faut encore que tu gère dans Add_ et Get_ l'access simultanée au tableau: Ton IT va Get pendant que ton main va Add...

Ce n'est qu'un exemple perfectible...

@++
Iko

Posté le : 30/05/2016 09:52
Transférer la contribution vers d'autres applications Transférer


Re: Séquencement avec timer et module(s) sous IT
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 536
Hors Ligne
Salut,

Merci pour l'idée.

Hier, j'ai commencé à bricoler mon driver existant (qui est très fonctionnel mais pas en IT donc) sur une copie du projet, car peur d'un carnage !!

Questions :

Puis-je déclarer mon tableau comme ceci
U8 I2C_buffer[];
et comme ça, la taille du tableau s'adaptera en fonction du nombre d'octets à traiter ?
Ou est-il préférable de déclarer un pointeur ? Etant donné que c'est à peu près la même chose ?

L'incrémentation du tableau ou du pointeur se fait dans l'IT et l'état d'une variable d'état également ?

Pourquoi dis-tu Citation :
Il faut encore que tu gère dans Add_ et Get_ l'access simultanée au tableau: Ton IT va Get pendant que ton main va Add...

?

Etant donné que le registre data I2C est le même pour l'envoi ainsi que pour la réception ?

En te remerciant pour tes conseils

Posté le : 30/05/2016 14:43
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Séquencement avec timer et module(s) sous IT
Accro
Inscrit:
06/07/2007 09:17
Messages: 697
Hors Ligne
Salut.
Si tu déclare ton tableau sans taille, tu va risque de générer du heap... pas tres conseillé sur un micro.

Pense que tu as plusieurs slave I2C. Donc tu organise des données en message.
1) il ne faudrait pas que tu puisse envoyer une parti du message de Slave2 à Slave 1 (tu fait que ton buffer n'est pas vide).
2) une copie n'est pas forcement atomique:
Imagine que sur un S08 tu copie un U32.
U32 MaVarReadSousISR 0xFFFF;
MaVarReadSousISR 0xCAFE;

L’exécution de ce code va prendre +- 4 coup de clock (micro 8 bits).
L'interruption qui utilise cette variable peut se déclencher pendant son écriture! Si un tel cas arrive, alors ta variable pour valoir 0xFFFE ou 0xCFFF... soit une valeur partiel...

Dans ton cas, tu fais des copie de 8 bits sur un S08 donc sur la data pas de pb, mais attention sur la gestion des index de ton buffer ;)

Posté le : 31/05/2016 11:13
Transférer la contribution vers d'autres applications Transférer


Re: Séquencement avec timer et module(s) sous IT
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 536
Hors Ligne
Salut,

Plus concrètement :

Actuellement, j'ai ce code, pour exemple :

void ClearDisplay(void)
{
    
I2C_START();
    
I2C_OUT(LCDadr);
    
I2C_OUT(Comsend);
    
I2C_OUT(LCD_CLEARDISPLAY);
    
I2C_STOP();
    
dly1msU16(2);
}


Si je fais ça, pour commencer, Est-ce bon ?
void ClearDisplay(void)
{
    
I2C_START();
        
I2C_buffer[] = {LCDadr,Comsend,LCD_CLEARDISPLAY};
    
I2C_STOP();
    
dly1msU16(2);
}


Sauf que je vois que ce n'est pas bon, puisque le I2C_STOP va s'exécuter avant même que les paquets soient envoyé !

Où gérer les instructions de cette fonction autres que celles du buffer ?

Posté le : 31/05/2016 11:46
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Séquencement avec timer et module(s) sous IT
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1924
Hors Ligne
Comme te le disais ikoria il faut fixer la taille de ton buffer.

après là tu remplis ton buffer, ok, mais aprés l'IRC ne va rien en faire toute seule

et tu as toujours une tempo de 2ms là, donc c'est que t'as pas pigé le truc, sous it ton appli ne doit plus jamais attendre dans le vide !

il faut remplir ton buffer
Puis activer l'I2C et envoyer le premier octet.
a ce moment là ta fonction a terminé.

Dans ta boucle principale tu va faire autre chose

sous it tu vas gérer l'envoi du 2 eme puis du 3eieme octet et quand le 3ieme aura terminé tu vas prévenir la boucle principale que c'est fini.

La boucle principale se contente de regarder le signal qui dit si c'est fini
Si oui elle traite
Si non elle repart faire ce qu'elle a à faire (lancer un autre cycle sur une autre I2C, gérer une com Rs485, faire le traitement des données lues lors du dernier cycle I2C, mise ne veille ...)






Posté le : 31/05/2016 11:59
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: Séquencement avec timer et module(s) sous IT
Accro
Inscrit:
06/07/2007 09:17
Messages: 697
Hors Ligne
Oui.
Ta fonction ClearDisplay(void) ne fait que remplir le buffer et active l'IT d'emission I2C. Le handler d'IT va gérer le Start, les ACK etc en vidant ton buffer.
Lorsque l'IT envoie le dernier octet (sans erreur) il fera le stop sur le bus.
Je veux dire, il faut que les fonctions Start et Stop soit dans l'IT.

Ton mail va faire autre chose en attendant qu'un Flag FullMessageTransmit (piloté par l'IT) soit TRUE.

Posté le : 31/05/2016 13:44
Transférer la contribution vers d'autres applications Transférer


Re: Séquencement avec timer et module(s) sous IT
Accro
Inscrit:
06/07/2007 09:17
Messages: 697
Hors Ligne
Tu pourrais organiser ton buffer comme un buffer de message:

typedef struc
{
 
DeviceId
 U8 NbreByte
 U8 
pData
}StrucMsg

StrucMsg MonBuffer
[10// buffer de 10 msg


Pardon d'avance pour les fautes ;)

Posté le : 31/05/2016 13:57
Transférer la contribution vers d'autres applications Transférer


Re: Séquencement avec timer et module(s) sous IT
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 536
Hors Ligne
Haaaaaa !!!

C'est ça que je voulais savoir et qui me donnait le doute ! Les START STOP ACK NACK dans l'IT yes !

Donc si je récapitule :

Ma fonction citée en exemple serait tout simplement :
void ClearDisplay(void
{  
     
I2C_buffer[] = {LCDadr,Comsend,LCD_CLEARDISPLAY}; 
     
I2C_OUT();   //Fonction que je dois réécrire pour déclencher l'envoi sous IT et je sort direct => envoi d'un octet bidon ?
}


Et Dans mon IT I2C un truc du style :
Vector_IIC(void)
{
I2C_START(); 

ptr_buffer++     //incrémenter le pointeur buffer
fonction1();     //envoi de l'octet suivant
test1();     //dernier octet envoyé ?
I2C_STOP(); 
I2C_free=1;
}


C'est un bon début ?


Posté le : 31/05/2016 15:08
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer



 Haut   Précédent   Suivant
« 1 (2) 3 4 5 ... 12 »



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

Séquencement avec timer et module(s) sous IT [Forums - HC908 et S08]