Parcourir ce sujet :
1 Utilisateur(s) anonymes
Questions générales C |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 14:02 De Catalunya (66)
Messages:
581
![]() |
Salut tous !
Bon j'avance dans mon apprentissage avec le C. Et j'avoue que j'y prend un certain plaisir. Ce soir, après avoir effectué quelques petites choses et notamment faire clignoter ma LED, et ce grâce à vous, j'ai réussi à adresser mon eeprom et afficheur I2C. Ils me répondent un "ACK" à tour de rôle. Étant donné que j'ai pleins de questions qui me viennent, et que je ne veux pas polluer le forum, je les poserai ici si vous le voulez bien. 1) je sais écrire dans un registre quelconque. Par exemple en I2C, je fais
I2C_D = 0x08
Mais je viens de me rendre compte que je ne sais pas lire un registre quelconque en C !! Donc qu'elle est l'instruction que ferait
lda I2C_D
2) je galère avec la structure générale d'un code C. J'aimerais mettre mes fonctions I2C dans un fichier séparé (une lib) mais je comprend pas l'emploi d'un fichier h ? Voilà pour commencer ![]() Biz
Posté le : 26/02/2016 01:00
|
|
Les octets s'envolent, les écrits restent !
|
||
![]() |
Re: Questions générales C |
||
---|---|---|
Pilier de la communauté
![]() ![]() Inscrit:
27/09/2005 18:07 De Metz
Messages:
1354
![]() |
il suffit d'affecter la valeur de ton registre à une variable par exemple.
unsigned char accu;
Tu n'est pas obligé de passer par une variable. Le simple fait de placer I2C_D dans la partie droite d'une affectation entraine une lecture. D'une manière générale si tu écris a=b; il y a lecture de b puis écriture de a. A+
Posté le : 26/02/2016 09:53
|
|
![]() |
Re: Questions générales C |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 14:02 De Catalunya (66)
Messages:
581
![]() |
Merci Jacques,
Si je comprend bien, écrire I2C_D = accu est différent de accu = I2C_D ? Le 1er écrit dans I2C_D et le 2ème lit I2C_D ?
Posté le : 26/02/2016 10:35
|
|
Les octets s'envolent, les écrits restent !
|
||
![]() |
Re: Questions générales C |
||
---|---|---|
Pilier de la communauté
![]() ![]() Inscrit:
23/10/2005 11:40 De Aix les Bains (73)
Messages:
1943
![]() |
tout a fait
C'est une base importante bien retenir la formule de Jacques "D'une manière générale si tu écris a=b; il y a lecture de b puis écriture de a." Tu as d'autres opérateurs à connaitre en C http://www.commentcamarche.net/conten ... -langage-c-les-operateurs Il faudra juste veiller au type des variables utilisées ; il faudra quelquefois faire une conversion de type par exemple unsigned char u8toto = 56; unsigned long u32titi = 230000 ; unsigned long u32tata = 0 ; u32tata = (unsigned long)u8toto * u32titi ; // on demande à convertir u8toto en unsigned long
Posté le : 26/02/2016 10:44
|
|
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
|
||
![]() |
Re: Questions générales C |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 14:02 De Catalunya (66)
Messages:
581
![]() |
Mmmm ... là ça se complique !!!
![]() EDIT : Jacques, tu veux bien qu'on échange nos avatars ? lol
Posté le : 26/02/2016 11:13
|
|
Les octets s'envolent, les écrits restent !
|
||
![]() |
Re: Questions générales C |
||
---|---|---|
Pilier de la communauté
![]() ![]() Inscrit:
23/10/2005 11:40 De Aix les Bains (73)
Messages:
1943
![]() |
non c'est tout simple
en ASM tu ne pouvais pas faire rentrer 66000 dans un registre 16 bit. Le compilateur ne sait pas faire non plus et s'il sait manipuler des variables de 8 bit (char), 16 bit (short) ou 32 bit (long) il ne sait pas faire rentrer du 32 bit dans du 16. Dans des langages comme le Visual Basique le compilo va supposer ce que tu voulais faire alors que tu n'as pas précisé, ca marchera jusqu'à ce qu'il n'arrive plus à supposer ce que tu veux et braouuuum il te pète à la figure. De manière générale le C impose que les choses soient claires; il t'impose de déclarer les variables et leur type il t'impose de déclarer les fonctions et les types qu'elles manipule en paramètre et en sortie et dans le cas cité avant où tu manipules des variables de type différents ( des car et des long dans mon exemple) il va vouloir que tu lui dises qui devient quoi.
Posté le : 26/02/2016 11:36
|
|
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
|
||
![]() |
Re: Questions générales C |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 14:02 De Catalunya (66)
Messages:
581
![]() |
Le lien m'apporte beaucoup David merci.
Je reviendrai plus tard sur la conversions de taille. Tu peux m'expliquer le fichier H stp ? Peut-on s'en passer ?
Posté le : 26/02/2016 13:24
|
|
Les octets s'envolent, les écrits restent !
|
||
![]() |
Re: Questions générales C |
||
---|---|---|
Pilier de la communauté
![]() ![]() Inscrit:
27/09/2005 18:07 De Metz
Messages:
1354
![]() |
Pour revenir sur l'affectation, le symbole = peut effectivement prêter à confusion car il ne s'agit pas d'une égalité.
Quand on écrit a = b; en fait ça devrait plus ressembler à ceci: a <- b; ou en asm lda b (charger a avec la valeur de b) Citation : Tu peux m'expliquer le fichier H stp ? Peut-on s'en passer ? Toutes les lignes commençant par # sont des commandes du préprocesseur qui sont des commandes qui interviennent au niveau du fichier source et donc avant la compilation. L'avantage des fichiers h, c'est par exemple d'écrire une bonne fois pour toutes un certain nombre de déclaration telles que l'adresse des registres au lieu de faire figurer systématiquement ces lignes dans ton programme. Là ou les fichiers .h sont indispensables quand on programme POUR UN pc, c'est qu'il permettent d'appeler les foncions des librairies qui sont déjà compilées et dont on ne possède pas le source. Les fichier .h possède les déclarations des fonctions que l'on peut appeler dans ces bibliothèques. Il faut savoir qu'en C, on ne peut utiliser que ce qui est déclaré au préalable, donc pour utiliser la fonction printf, il faut inclure stdio.h qui possède la déclaration de cette fonction (en fait son entête)
Posté le : 26/02/2016 16:02
|
|
![]() |
Re: Questions générales C |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 14:02 De Catalunya (66)
Messages:
581
![]() |
Ok c'est compris.
Mais par exemple, pour ma lib I2C que je suis en train de créer ; Si ma lib s'appelle I2C.c, et que j'appelle les fonctions à partir de mon main() de cette lib, à quoi pourrait me servir le H ? Puisque tous les registres sont déjà déclarés dans le mc9s08pa16.h ? Et a quoi sert par exemple un _PORT_PTAD.Bits.PTAD3 (avec le underscore qui semblerait servir dans les macros) ?
Posté le : 26/02/2016 22:05
|
|
Les octets s'envolent, les écrits restent !
|
||
![]() |
Re: Questions générales C |
||
---|---|---|
Accro
![]() ![]() Inscrit:
28/09/2005 11:53 De In Space
Messages:
157
![]() |
Salut,
Le fichier *.h sert à mettre "les prototypes", c'est à dire les fonctions que l'on souhaite utiliser en dehors du fichier toto.c. un prototype est une copie de la déclaration d'une fonction, sans celui-ci, la fonction est en quelque sorte privé : utilisable uniquement dans le fichier toto.c, en ajoutant le prototype dans un fichier toto.h, la fonction devient public est peut être utilisé dans un autre fichier *.c à la condition de faire appel à toto.h via un #include.
Posté le : 26/02/2016 23:03
|
|
“Tomber est permis ; se relever est ordonné.” proverbe russe
|
||
![]() |
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.