Bon, bah j'ai finalement décidé de me mettre au C pour PIC avec CC5X !
Premier blocage. J'ai un unsigned int ( de 8 bits donc ), et je souhaiterai pouvoir accéder au nième bit.
J'ai essayé :
unsigned int truc;
PORTA.0 = truc.0;
mais ça ne passe pas, il refuse le point après "truc".
J'ai fouillé un peu le net, mais pas plus trouvé que ça ... pouvez-vous me donner une piste svp ?
Re : C pour PIC : récupérer le nième bit d'un entier
Ma question est mal posée ?
Y'a quelque chose de compliqué ?
Ne me forcez pas à retourner en ASM !!
14/10/2007 - 22h00
invite76a
Date d'inscription
août 2005
Localisation
Belgique
Messages
0
Re : C pour PIC : récupérer le nième bit d'un entier
Bonsoir, Toufinet
Ta question est très bien posée et est très claire.
Le langage C permet cela sachant que :
- Une structure permet d'associer des variables de différents types
- Une variable peut être déclarée avec une taille spécifiée en nombre de bits
- une union est composée de variables occupant le même espace mémoire
Dernière modification par invite76a ; 14/10/2007 à 22h03.
Motif: ortografe
14/10/2007 - 22h11
RISC
Date d'inscription
novembre 2006
Messages
2 881
Re : C pour PIC : récupérer le nième bit d'un entier
Salut,
Pour pouvoir faire cela, il faut que des structures à champs de bits aient été définies dans un fichier header.
Sur les compilateurs Microchip C18 et C30, toutes les déclarations sont faites dans les fichiers header pour chaque micro. Tu peux télécharger ces compilateurs ou chercher un fichier header sur internet dans un projet
Regarde sur CC5x ce qui existe comme fichier header ou fabrique toi ces structures en recopiant celles du compilateur C18.
a+
14/10/2007 - 22h19
invite76a
Date d'inscription
août 2005
Localisation
Belgique
Messages
0
Re : C pour PIC : récupérer le nième bit d'un entier
Envoyé par RISC
Salut,
Pour pouvoir faire cela, il faut que des structures à champs de bits aient été définies dans un fichier header.
a+
Certainement pas, si ce n'est pas déclaré dans un fichier header, il y a toujours moyen de faire cette manipulation pour n'importe quelle variable en utilsant la syntaxe standard du C.
Mais c'est effectivement le genre de déclaration que l'on trouve pour les ports d'E/S dans les fichiers header.
th
Dernière modification par invite76a ; 14/10/2007 à 22h24.
Re : C pour PIC : récupérer le nième bit d'un entier
Bonsoir, alors premièrement : le type int est à utiliser avec precaution, en effet, c'est un type qui varie selon la cible ...
Sur PIC, tu dis que c'est un 8b, mais sur intel, c'est un 32b ... docn il faut preferer systematiquement les type figés ( char, short et long )
Ensuite, pour obtenir un bit, il est preferable de declarer ta variable comme union d'un champ de bit et d'un unsigned char, comme cela, tu peux utiliser ta variable comme un uchar ou comme un groupe de bits.
15/10/2007 - 07h00
mictour
Date d'inscription
septembre 2005
Localisation
touraine
Messages
136
Re : C pour PIC : récupérer le nième bit d'un entier
Bonjour Toufinet,
CC5X ne suit pas la norme AINSI notamment pour les variables :
uns8 u8; // 8 bit unsigned
uns16 u16; // 16 bit unsigned
uns24 u24; // 24 bit unsigned
uns32 u32; // 32 bit unsigned
int8 s8; // 8 bit signed
int16 s16; // 16 bit signed
int24 s24; // 24 bit signed
int32 s32; // 32 bit signed
unsigned a8; // 8 bit unsigned
char a8; // 8 bit unsigned
Ce petit extrait que je viens de tester dans un programme "passe"
char i;
…………
void main(void)
{
init();
do
{
PORTA.2 = n.2;
……..
Bonne prog, mictour.
15/10/2007 - 07h10
mictour
Date d'inscription
septembre 2005
Localisation
touraine
Messages
136
Re : C pour PIC : récupérer le nième bit d'un entier
.... Re
Une erreur d'inattention (copier coller !) il faut lire :
char n; et non char i; .... mais je pense que tu avais rectifié.
mictour.
15/10/2007 - 08h21
Toufinet
Date d'inscription
mars 2006
Âge
28
Messages
1 177
Re : C pour PIC : récupérer le nième bit d'un entier
Bonjour à tous,
Merci pour vos réponses, mais une des informations de mon problème ne semble pas être passée. Je veux pouvoir accéder au i-ième bit de ma variable.
Exemple ( non fonctionnel ) :
unsigned int i;
char variable;
for (i=0; i<8; i++) {
PORTA.0 = variable.i;
}
De la même manière, comment parcourir un port ( PORTA.i ) ?
C'est vraiment casse-pied, car en assembleur, ça se fait très facilement !
15/10/2007 - 09h53
Jack
Date d'inscription
avril 2003
Localisation
Metz
Messages
12 231
Re : C pour PIC : récupérer le nième bit d'un entier
Il te suffit d'écrire une fonction ou une macro. Il faudra utiliser les décalages et les masques à l'aide ET et de OU pour forcer un bit à 0 ou à 1.
En fait c'est pareil qu'en assembleur.
Exemple: tu veux mettre à 1 le bit n de data: ton masque vaut 0b00000001 au départ et tu vas le décaler n fois à gauche et faire un OU avec ta donnée.
data |= 0x01 << n;
A+
15/10/2007 - 12h12
mictour
Date d'inscription
septembre 2005
Localisation
touraine
Messages
136
Re : C pour PIC : récupérer le nième bit d'un entier
CC5X n'aime pas l'ecriture indexée : variable.i Mais ceci devrait passer (pas testé),
lecture fixe + décalage du registre, comme Jack te l'indiques.
Re : C pour PIC : récupérer le nième bit d'un entier
Super , ça marche impec !
Sauf que lorsque je simule, la valeur de PORTA ne change pas ... mais ça c'est un autre problème
19/01/2009 - 17h30
Benoit_ofr
Date d'inscription
mai 2008
Âge
28
Messages
6
Re : C pour PIC : récupérer le nième bit d'un entier
Bonjour,
Je me permet de réouvrir la discussion car j'ai un problème similaire mais dont la solution n'est pas encore donnée ici.
Je cherche également à accéder au nième bit d'une variable mais également de lui donner un nom pour améliorer la lisibilité du code.
Par exemple je déclare une variable PORTBBuf :
unsigned char PORTBBuf
Puis je défini un nom pour le bit 0
#define RB0Buf PORTBBuf,0
Cette solution fonctionne si je viens lire RB0Buf dans mon programme mais j'ai une erreur de compilation lorsque je veux écrire RB0Buf.
Quelqu'un aurait il une solution pour avoir une variable pointant sur le bit d'une autre et pouvoir utiliser cette variable en lecture et en écriture??
Merci d'avance.
Benoit
19/01/2009 - 17h32
Benoit_ofr
Date d'inscription
mai 2008
Âge
28
Messages
6
Re : C pour PIC : récupérer le nième bit d'un entier
Pour être plus précis je travaille avec HITECH compiler sur MPLAB
19/01/2009 - 18h27
Tix
Date d'inscription
octobre 2004
Localisation
france
Messages
1 515
Re : C pour PIC : récupérer le nième bit d'un entier
Salutation
bitn =( octet AND 2^n )/ 2^n
si je ne m'abuses. sinon, tu peus aussi remplacer le /2^n par des décallages à droite ">>" ou à gauche "<<"
si tu est moins exigent et qu'un seul bit de l'octet te suffit :
int bitn(char octet, int pos)
{
if(octet AND 2^pos)
{
return 1;
}
else
{
return 0;
}
}
si je ne m'abuse, bien évidemment...
désolé, mauvaise appréciation de la question =)
Benoit_ofr, un define est un préprocesseur, autrement dit, toutes les entités définies sont remplacée avant compilation, ce ne sont pas des variables !
don tu ne peu pas modifier un define, il faut trouver autre chose.
plusplus, Tix.
Dernière modification par Tix ; 19/01/2009 à 18h31.