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 6 ... 12 »


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
ca chauffe

Posté le : 31/05/2016 15:21
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
Sauf Erreur de ma part, l'IT I2C va trig sur chaque étape de la communication:
Envoie du start->ISR Start sent
Envoie ID ->ISR Ack/Nack
Envoie Data -> ISR Ack/Nack
etc..
Je ne sais plus si le STOP génère un IT ou non...

Donc tu peux faire une state machine, managé par l'IT, qui évoluera en fonction du trafic sur le bus ;)

Posté le : 31/05/2016 16:25
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
A priori, les start et stop ne déclenche pas l'IT, et c'est bien dommage :

Voici le passage dans la doc :
Interrupt source                  Status      Flag      Local enable
Complete 1
-byte transfer          TCF         IICIF     IICIE
Match of received calling address IAAS        IICIF     IICIE
Arbitration lost                  ARBL        IICIF     IICIE
SMBus SCL low timeout             SLTF        IICIF     IICIE
SMBus SCL high SDA low timeout    SHTF2       IICIF     IICIE 
SHTF2IE
Wakeup from stop3 
or wait mode    IAAS        IICIF     IICIE WUEN

Posté le : 31/05/2016 16:53
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
Etant un mordu des state machine, je te recommande d'en utiliser une dans l'IT pour gérer ta comm.
State_1 : Send Start, set state_2
State_2: send data from buffer (device id shall be the first data).
if buffer empty, set state_3
state_3: send Stop, disable IT.

Ou un truc du genre...Tu m'as compris je pense :)

Posté le : 01/06/2016 08:39
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,

Oui j'ai bien capté l'utilité des states machines. Mais d'abord, il faut que j'arrive à faire fonctionner tout ça en IT.

Je pense avoir le bon schéma en tête, il y a un exemple ici qui m'a aidé à la compréhension.

Je note ici car ce soir, j'aurai oublié ...


Dans la fonction d'appel :
- remplissage du buffer des datas utiles uniquement
- I2C_FREE = 0
- START I2C
- envoi de l'adresse slave et déclenchement de l'IT
On sort

Dans la fonction d'IT :
- effacement du flag IT
- envoi du 1er octet du buffer I2C
- dernier octet envoyé ?
=> si oui
- STOP I2C
- I2C_FREE = 1
- return
=> si non
- return


Posté le : 01/06/2016 10:44
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:
28/09/2005 14:02
De Catalunya (66)
Messages: 536
Hors Ligne
Interruptions activées ainsi que celle de l'I2C :

I2C_C1_IICIE = 1;

Pourquoi dés que je vois "interruption pending", le programme ne saute pas dans l'isr si dessous ?

interrupt VectorNumber_Viic void i2c_IT (void)
{
    
I2C_S_IICIF 1;                         // Clear the interrupt event flag
    
    
    
if(I2C_byte_ctn == I2C_nb_byte)            // If the last bytes has been sent
    
{
        
I2C_STOP();                            // Generate Stop Condition
        
I2C_bus_idle 1;                    // I2C bus is now free
        
I2C_byte_ctn 0;                    // Clear counter byte
        
return;                                // Go out !
    
}
    
    
I2C_D I2C_buffer[I2C_byte_ctn]; 
    
//I2C_OUT(I2C_buffer[I2C_byte_ctn]);        // Send a byte of buffer
    
I2C_byte_ctn++;                            // Increment for the next byte to send
    
I2C_C1_IICIE 0;
}


Bon c'est tard ...

Posté le : 02/06/2016 00:18
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
Je pense que tu ne doit pas faire le
// IIC Interrupt Enable. The IICIE bit determines whether an IIC interrupt is requested.
// 0 IIC interrupt request not enabled
// 1 IIC interrupt request enabled
I2C_C1_IICIE 0;


Cela désactive l'IT. Du coup, plus d'IT alors que tu n'as pas finit d'envoyer ton message.
Quand tu entre dans l'IT qui survient après avoir copier la dernière data dans I2C_D (du coup c'est une IT de Transmit complete), là tu envoie le STOP et tu désactive.

interrupt VectorNumber_Viic void i2c_IT (void)
{
    
I2C_S_IICIF 1;                         // Clear the interrupt event flag
    
    
    
if(I2C_byte_ctn == I2C_nb_byte)            // If the last bytes has been sent
    
{
        
I2C_STOP();                            // Generate Stop Condition
        
I2C_C1_IICIE 0;
        
I2C_bus_idle 1;                    // I2C bus is now free
        
I2C_byte_ctn 0;                    // Clear counter byte
        
return;                                // Go out !
    
}
    
    
I2C_D I2C_buffer[I2C_byte_ctn]; 
    
//I2C_OUT(I2C_buffer[I2C_byte_ctn]);        // Send a byte of buffer
    
I2C_byte_ctn++;                            // Increment for the next byte to send
}


Note: Un return au mileur du code c'est pas tres beau...
interrupt VectorNumber_Viic void i2c_IT (void)
{
    
I2C_S_IICIF 1;                         // Clear the interrupt event flag    
    
    
if(I2C_byte_ctn == I2C_nb_byte)            // If the last bytes has been sent
    
{
        
I2C_STOP();                            // Generate Stop Condition
        
I2C_C1_IICIE 0;
        
I2C_bus_idle 1;                    // I2C bus is now free
        
I2C_byte_ctn 0;                    // Clear counter byte
    
}
    else
    {    
        
I2C_D I2C_buffer[I2C_byte_ctn]; 
        
//I2C_OUT(I2C_buffer[I2C_byte_ctn]);        // Send a byte of buffer
        
I2C_byte_ctn++;                            // Increment for the next byte to send
    
}
    return;    
// Go out !
}

autre chose: il faudra que tu implémente le check de status du bus. si tu as 3 octets a send et que le slave te fait un NACK sur le premier, il faut faire un STOP et reprendre de zero... idem pour l'arbitrage ou le busy. Mais il me semble que tu connais le fonctionnement d'un bus IIC ^^.

Posté le : 02/06/2016 08:33
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 ces infos :

Bon faut que je m'y replonge à tête reposée, mais même si je les désactive en fin d'ISR, encore faudrait-il que je rentre dedans lors de la première IT ?!!

Pour le return, c'est vrai que je le vois souvent sur le net, au beau milieu d'une fonction. En quoi c'est pas propre ?

Posté le : 02/06/2016 10:30

Edité par dinastar sur 02/06/2016 11:01:21
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:
28/09/2005 14:02
De Catalunya (66)
Messages: 536
Hors Ligne
Y'a t'il un ordre d'activation entre le bit du CCR, celui de l'activation I2C, et celui de l'activation IT I2C ?

En plus, mon IT KBI elle, fonctionne toujours ...

Posté le : 02/06/2016 11:05
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:
28/09/2005 14:02
De Catalunya (66)
Messages: 536
Hors Ligne
Enfin dans tout les cas, les IT I2C doivent-être désactivées puisque, même si je n'avais pas bien configuré la ligne de la fonction ISR, le PC devrait partir à l'adresse de l'IT donc, dans les choux en pas à pas ...!

Posté le : 02/06/2016 11:59
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 6 ... 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]