Questions générales C [Forums - Langage C]
Questions générales C [Forums - Langage C]
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 ... 11 »


Re: Questions générales C
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Bonjour tout le monde,

Merci Dark pour cette info. J'ai bien compris l'emploi du fichier h. D'ailleurs, je viens de terminer mes libs pour l'instant et qui concernent l'I2C, 1WIRE, et init de mon proc. J'ai inclus tout ça dans mon projet et ça marche.

Je réitère ma question précédente ;

Et a quoi sert par exemple un _PORT_PTAD.Bits.PTAD3 (avec le underscore qui semblerait servir dans les macros) ?

Posté le : 02/03/2016 10:55
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Questions générales C
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Il faut que tu regardes dans le .h de ton µC. En principe, l'usage veut qu'on définisse des constantes symboliques en majuscules à l'aide de #define.

Apparemment, cette utilisation de majuscules est aussi utilisée pour le nommage des registres et la définition des registres.

Exemple avec un 9S08QD:
/*** PTAD - Port A Data Register; 0x00000000 ***/
typedef union {
  
byte Byte;
  
struct {
    
byte PTAD0       :1;                                       /* Port A Data Register Bit 0 */
    
byte PTAD1       :1;                                       /* Port A Data Register Bit 1 */
    
byte PTAD2       :1;                                       /* Port A Data Register Bit 2 */
    
byte PTAD3       :1;                                       /* Port A Data Register Bit 3 */
    
byte PTAD4       :1;                                       /* Port A Data Register Bit 4 */
    
byte PTAD5       :1;                                       /* Port A Data Register Bit 5 */
    
byte             :1
    
byte             :1
  } 
Bits;
  
struct {
    
byte grpPTAD :6;
    
byte         :1;
    
byte         :1;
  } 
MergedBits;
PTADSTR;
extern volatile PTADSTR _PTAD @0x00000000;
#define PTAD                            _PTAD.Byte
#define PTAD_PTAD0                      _PTAD.Bits.PTAD0
#define PTAD_PTAD1                      _PTAD.Bits.PTAD1
#define PTAD_PTAD2                      _PTAD.Bits.PTAD2
#define PTAD_PTAD3                      _PTAD.Bits.PTAD3
#define PTAD_PTAD4                      _PTAD.Bits.PTAD4
#define PTAD_PTAD5                      _PTAD.Bits.PTAD5
#define PTAD_PTAD                       _PTAD.MergedBits.grpPTAD

Posté le : 02/03/2016 11:25
Transférer la contribution vers d'autres applications Transférer


Re: Questions générales C
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1943
Hors Ligne
Salut

Les majuscules sont souvent une convention d’écriture pour les define et autres trucs dont la valeur/signification est fixe.
rappel un define est une réécriture
#define TOTO 23
signifie que le fait d’écrire TOTO ou 23 fera la même chose dans ton code

le _ n'a a ma connaissance aucune signification en C, ça sert ici à faire un "espace"

le .sert à désigner les éléments d'une structure

Ce que Jacques te montre est un outil puissant du c, beaucoup utilisé dans le .h du µc, créé par défaut par Code Warrior.

pour les port cela combine des structures dans des union;
Cela sert a désigner un port complet ou juste une partie d'un port ou un bit

tu peux utiliser ce genre d'outil dans ton code pour définir des Flag
Par exemple tu déclares un octet u8status et tu vas donner un nom à chacun de ses bits
typedef union {
  
unsigned char u8loctet;
  
struct {
      
unsigned char FLAG_ERREUR1     :1;       
      
unsigned char FLAG_LED_ON     :1;                                    
      
unsigned char FLAG_POELE_CHAUD :1;                                      
      
unsigned char bit3            :1;                                     
      
unsigned char bit4         :1;                               
      
unsigned char bit5            :1;                                   
      
unsigned char bit6          :1;                                 
      
unsigned char bit7         :1;                                    
  } 
Bits;
OctetStatus;



Tu déclares l'octet de status en faisant

OctetStatus u8MonOctetDeStatus


et ensuite soit tu manipules l'ensemble de l'octet
u8MonOctetDeStatus.u8loctet 156 ;

soit tu manipules chacun des flags indépendamment
u8MonOctetDeStatus.Bits.FLAG_LED_ON ;



La structure seule, sans union est un outil très utile que l'on rencontre beaucoup.
Les unions de structure comme ci dessus plaisent à certains, ne sont pas du tout utilisées par d'autres qui préfèrent utiliser des masques
u8MonOctetDeStatus |= MASK_LED_ON ;


Sur les Kinetis les définitions se font plutôt avec les masques dans les exemples et wizard de freescale, contrairement aux S08 ou les unions sont beaucoup utilisées.

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


Re: Questions générales C
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Ok j'en comprend à peu prés le principe.

D'ailleurs une question me vient :

Comment puis-je redéfinir le nom d'un bit par exemple comme ceci je présume :

PORT_PTDD_PTDD1 LED


Comme cela je fais ensuite
LED 1


ça marche ça ?

Posté le : 02/03/2016 13:33
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Questions générales C
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1943
Hors Ligne
pas du tout

si tu veux que écrire LED soit la même chose que écrire PORT_MACHIN_TRUC
tu dois faire
[code]#define PORT_MACHIN_TRUC LED

et là tu pourras faire LED = 1

sans le define déclaré avant tu ne peux pas écrire LED = 1 tout simplement parce que LED le compilo ne sait pas ce que c'est.

Posté le : 02/03/2016 13:42
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: Questions générales C
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Et pour compléter la réponse de Charly avec un exemple concret en relation avec le code que j'ai donné plus haut, il suffit de s'inspirer de la ligne
<code>#define PTAD_PTAD0 _PTAD.Bits.PTAD0 </code>
pour écrire
#define LED                      _PTAD.Bits.PTAD0

ou plus simple
#define LED                      PTAD_PTAD0

Posté le : 02/03/2016 20:24
Transférer la contribution vers d'autres applications Transférer


Re: Questions générales C
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1943
Hors Ligne
Et pour reboucler la boucle, je te rappelle à la première chose que Jacques t'as écrit dans sa première réponse
Citation :
D'une manière générale si tu écris a=b; il y a lecture de b puis écriture de a.


PORT_PTDD_PTDD1 = LED n'est pas possible parce que LED ne peut pas être lu (le compilateur lèvera une erreur : "qu'est ce que c'est LED ?")

Posté le : 02/03/2016 20:36
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: Questions générales C
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Je serais moins affirmatif Charly. Peut-être que je me trompe, mais d'après ce dont je me souviens, on peut lire un port de sortie. En fait, on récupérera la valeur du registre de sortie.

A confirmer ...

Posté le : 02/03/2016 21:22
Transférer la contribution vers d'autres applications Transférer


Re: Questions générales C
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1943
Hors Ligne
je parle de LED qui ne peut être lu parce que non déclaré.

Dans sa question dinastar parle de "redéfinir le nom d'un bit"

en écrivant Nom_Du_port = led il confond avec

#define Nom_du_port led


Posté le : 03/03/2016 06:29
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: Questions générales C
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1354
Hors Ligne
Autant pour moi. Je n'avais pas remarqué cet aspect de la question.

Posté le : 03/03/2016 09:18
Transférer la contribution vers d'autres applications Transférer



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



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

Questions générales C [Forums - Langage C]