Forums - Tous les messages
Forums - Tous les messages
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
Recherche
 
   
 
   Tous les messages (ikoria)

 Bas   Précédent   Suivant

(1) 2 3 4 ... 68 »


Re: Compilateur Loop est optimisation
Accro
Inscrit:
06/07/2007 09:17
Messages: 694
Hors Ligne
Bon re et fin de sujet XD

J'ai trouvé mon problème.

Comme je fais de l'attente active sur un périphérique, j'utilise un compteur timeout.
Dans mon cas il était mal configuré, donc je quitter mon exécution avec que le périphérique lève son flag...

En Bon Mauvais codeur, je me suis fait avoir sur la description du bit "Transfert complet".
Il faut vraiment être vigilent par rapport au comportement HW et les optimisation compilo.
Rappel: sans optimisation, l’exécution se faisait sans problème...

while(SPI0SR_SPTEF == 0U){ /* !Add timeout! */};
/** write a byte */
SPI0DRL data;
/** wait for completed byte reception */
while((SPI0SR_SPIF == 0U) && (u16Timeout 0U))
{
    
/** Decrement timeout counter */
    
u16Timeout--;
}



Posté le : 10/12 17:04
Transférer la contribution vers d'autres applications Transférer


Re: Compilateur Loop est optimisation
Accro
Inscrit:
06/07/2007 09:17
Messages: 694
Hors Ligne
première réponse à moi-même

en mode optimisé, l'execution est 5 à 6 fois plus rapide.
Dans le code présenté, je ne regardais pas le flag de buffer empty avant d'écrire...
...
while(
SPI0SR_SPTEF == 0U){};
/** write a byte */
SPI0DRL data;
...


bon en ajoutant le check avant d'écrire, il me manque toujours un byte sur le bus...
je devrais avoir [12][0]; [12][1]; [12][2]; [12][3];
et jai           [12]   ; [12][1]; [12][2]; [12][3];


Posté le : 10/12 16:29
Transférer la contribution vers d'autres applications Transférer


Compilateur Loop est optimisation
Accro
Inscrit:
06/07/2007 09:17
Messages: 694
Hors Ligne
Salut à tous

J'ai des problèmes d’exécution quand j'active les optimisation compilo (O3).
L'ordre d'envoi des data sur le SPI est perturbé...

Dans main.c
// variable globale
U1 u1ReturnState U1_FALSE;
U8 TxTab[2] = {0};
U8 RxTab[2] = {0};
...
//dans le main
for (Cptr1 0Cptr1<4Cptr1++)
  {
      
TxTab[1]=Cptr2;
      
u1ReturnState u1MAL_SPI_SyncExchange(TxTab,RxTab,2U);
      
Cptr2++;
  }
...


Dans Spi.c
U1 u1MAL_SPI_SyncExchange(
        
U8 au8TxData[],    /**<        array of data to send        */
        
U8 au8RxData[],            /**<[out]    array of data to received    */
        
U8 u8DataSize)    /**<        number of byte to proceed    */
{
    
/** Variable used to hold return status */
    
U1 u1ReturnStatus;
    
/** Variable used as buffer index */
    
U8 u8Index 0U;
    
/** Variable used as timeout for spi byte exchange */
    
U16 u16Timeout;
    
    
/** Reject command if Data size is null or above buffer size limit */
    
if ((u8DataSize == 0x00U) || (u8DataSize U8_MAL_SPI_MAX_BUFFER_SIZE))
    {
        
/** Set return status */
        
u1ReturnStatus U1_TRUE;
    }
    
/** Reject command if Rx or Tx buffer address are NULL */
    
else if ((au8TxData == NULL) || (au8RxData == NULL))
    {
        
/** Set return status */
        
u1ReturnStatus U1_TRUE;
    }
    
/** Reject command if there is any running exchange */
    
else if (u1SPIIsExchangeInProgress == U1_FALSE)
    {
        
/** Lock Spi Exchange process */
        
u1SPIIsExchangeInProgress U1_TRUE;
        
        
/** handle buffer transmission */
        //for (u8Index = 0U; u8Index < u8DataSize; u8Index++)
        
u8Index 0U;
        
        while (
u8Index u8DataSize)
        {
            
/** Reset timeout */
            
u16Timeout U16_MAL_SPI_TIMEOUT_VALUE_TICKS;
            
/** write a byte */
            
SPI0DRL au8TxData[u8Index];
            
/** wait for completed byte reception */
            
while((SPI0SR_SPIF == 0U) && (u16Timeout 0U))
            {
                
/** Decrement timeout counter */
                
u16Timeout--;
            }
            
            if (
u16Timeout == 0U)
            {
                
/** Set return status */
                
u1ReturnStatus U1_TRUE;
                
au8RxData[u8Index] = 0x00U;
                
/** leave for loop */
                
break;
            }
            else
            {
                
/** read a byte */
                
au8RxData[u8Index] = SPI0DRL;
            }
            
u8Index++;
        }
        
/** Unlock Spi Exchange process */
        
u1SPIIsExchangeInProgress U1_FALSE;
    }
    else
    {
        
/** Set return status */
        
u1ReturnStatus U1_TRUE;
    }
    return (
u1ReturnStatus);
}


Si vous regardez bien, j'ai testé les 2 type de boucles (for ou while).

En O0 et O1, l'envoie est dans le bon ordre: TxTab[0]TxTab[1], puis TxTab[0]TxTab[1]...
Mais en O2 et O3, l'envoie est dans le désordre: TxTab[0]TxTab[0], puis TxTab[1]TxTab[1]...

hors cpu dépendant, je peux comprendre mais là...

Avez vous une idée?
(ca doit être liée à une parallélisation mais j'avoue ne pas savoir... je cherche)

Posté le : 10/12 15:15
Transférer la contribution vers d'autres applications Transférer


Re: Delta Sigma ADC
Accro
Inscrit:
06/07/2007 09:17
Messages: 694
Hors Ligne
J'avoue que cela me choque un peu :)
J'ai toujours en tête les problèmes lié au dépassement des tensions de saturation des aop ^^

Posté le : 24/10/2018 22:29
Transférer la contribution vers d'autres applications Transférer


Re: Delta Sigma ADC
Accro
Inscrit:
06/07/2007 09:17
Messages: 694
Hors Ligne
Merci pour ce retour :)
malheureusement, je n'ai pas le choix des techno :(
Nous allons avoir un NTC 100k +-5 @ 25°C (B=3955+-3)

J'ai une question techno sur les delta sigma.
J'ai bien comprit les 2 entrées SI pour une mesure différentiel.
J'ai bien comprit les 2 entrées VR pour la tension de référence.
+-DeltaSI doit être comprit dans le DeltaVR.
Mais que ce passe-t-il dans le cas suivant:
VR+ = 5V ; VR- =0V => DeltaVR = 5V
SI+ = 9V ; SI- =7V => DelaSI = 2V... le delta est bon mais les entrées sont out pour moi..

Merci d'avance pour cet éclaircissement :)

Posté le : 24/10/2018 20:49
Transférer la contribution vers d'autres applications Transférer


Re: Delta Sigma ADC
Accro
Inscrit:
06/07/2007 09:17
Messages: 694
Hors Ligne
Bonjour.
Je passe le sujet en résolut
De fait, l'adc delta-sigma n'est pas parfait.

il faut prendre en compte plusieurs sources d'erreurs:
- le gain sur la mesure différentiel SI+ SI-.
- l'offset sur cette même mesure
- (fct de l'elect.) le gain sur le différentiel de tension de référence VR+ VR-.

De plus:
- la tension du pont diviseur (interne au cpu) n'est pas parfaite (2.34 au lieu de 2.4)
- la résistance top (interne au cpu) fait 88k au lieu de 100k...

Je vais m'amuser :)
Merci

Posté le : 23/10/2018 09:25
Transférer la contribution vers d'autres applications Transférer


Re: Delta Sigma ADC
Accro
Inscrit:
06/07/2007 09:17
Messages: 694
Hors Ligne
Je suis désolé charly, mais je n'ai pas beaucoup de détail sur le composant.
il est intégré dans un chip de chez Hycon.

https://www.hycontek.com/en/products-en/3268


et pour tout te dire, je suis dans l'obligation de travailler en asm...


Posté le : 19/10/2018 07:50
Transférer la contribution vers d'autres applications Transférer


Re: Delta Sigma ADC
Accro
Inscrit:
06/07/2007 09:17
Messages: 694
Hors Ligne
chose encore plus surprenante:
si je fais:
SI+: Ve
SI-: Vrefn
VR+: Ve
VR-: Vrefn

la sortie n'est pas max non plus :/ au lieu de 7FFFh, j'ai 7FEEh :/

Posté le : 18/10/2018 11:14
Transférer la contribution vers d'autres applications Transférer


Re: Delta Sigma ADC
Accro
Inscrit:
06/07/2007 09:17
Messages: 694
Hors Ligne
je join un doc pour mieux conprendre :)

Attacher un fichier:


zip First.zip Taille: 86.47 KB; Hits: 19

Posté le : 18/10/2018 10:44
Transférer la contribution vers d'autres applications Transférer


Re: Delta Sigma ADC
Accro
Inscrit:
06/07/2007 09:17
Messages: 694
Hors Ligne
Le montage est un pont diviseur classique pour la mesure d'une NTC (Vs=Ve*R2/(R1+R2) sachant que la NTC c'est R2).
L'adc et la résistance R1 sont intégré à un micro/asic.

La tension d'alim, fournit par le cpu, est 2.4V.
J'ai 4 broches configurables:
SI+: sur Vs ou Ve en fonction de la mesure.
SI-: sur Vrefn, le retour de la NTC (câblé en interne à Vssa)
VR+: sur Ve
VR-: sur Vrefn

Je peux également amplifier Delta_SI et Delta_VR mais je les laisse en x1.

Posté le : 18/10/2018 10:38
Transférer la contribution vers d'autres applications Transférer



 Haut
(1) 2 3 4 ... 68 »




Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

Forums - Tous les messages