Prog C (Pic), Récupérer un byte (Débutant)

Fermé
Mars31nko Messages postés 4 Date d'inscription mercredi 13 mai 2009 Statut Membre Dernière intervention 11 août 2009 - 13 mai 2009 à 21:10
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 15 mai 2009 à 01:31
Bien le Bonjour,

Tout d'abord, je préfère dire que je suis débutant en programmation C (PIC), donc désolé d'avance si j'ai un peu de mal. Bon je vais essayer de faire simple et d'être claire, nous avons un tableau de char que j'ai déclarer comme suit : char NewTabl[128] (128 pour 1024 bytes) dans se tableau je dois enregistrer les valeurs d'un capteurs (0 ou 1 --> 0 lorsque le capteur ne détecte rien et 1 lorsqu'il détecte quelque chose) d'où ses valeurs sont sur 1 bytes.. Pour être un peu plus clair dans me explication, ci-dessous le schéma que mon boss m'a fait pour m'expliquer comment je dois enregistrer ses valeurs

X = Etat inconnu
_______
||||||||| Représentation de mon tableau NewTab sur 1 octect
________ Donc ici NewTab[0]

---------------------------------------------------------------------------------------------------------------------------------------
______________
|0|x|x|x|x|x|x|x| On lit la premier valeur du capteur 0
______________
______________
|1|0|x|x|x|x|x|x| On lit la deuxième valeur du capteur 1, on décale la premier
______________________________________ valeur et on insert la deuxième

______________
|1|1|0|x|x|x|x|x| On lit la troisieme valeur du capteur 1, on décale les autres
_______________ valeurs et on insert la troisieme


______________
|0|1|1|0|x|x|x|x| On lit la quatrieme valeur du capteur 0, on décale les autres
______________ valeur et on insert la quatrieme

Ainsi de suite ...
Si vous vous demandez pourquoi se décalage? c'est parce que le programme toute 24h sur 24h est on reçois la valeur du capteur toutes les 1 ms.

Ensuite je dois assigner a une autre variable par exemple Toto le 4ème byte de se tableau.

Donc mes questions :) vu que je déclare un tableau de char, comment je fais pour inserer un byte dans le tableau ? Es que si j'écris NewTabl[0] = valeur du capteur ... etc cela fonction ? Vu que NewTab[0] est logiquement sur 1 octet (donc 8 bytes) si je ne me trompe pas?

Ensuite comment décaler par exemple les 15 premier bytes d'un tableau ? Es qu'avec l'instruction >> sa devrait suffir? si oui comment faire?

Pour finir ma dernière question, comment récupérer par exemple le 4ème byte d'un tableau et l'assigner a une variable ???

J'espere avoir été clair.
Si vous n'avez pas compris quoique se soit n'hésitez pas

Un grand merci d'avance ;)
A voir également:

6 réponses

mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
13 mai 2009 à 22:47
Pour commencer il y a une confusion entre byte (8bits, un octet) et bit. Or un char fait un byte (8 bits).
https://fr.wikipedia.org/wiki/Byte

En admettant que tu veuilles manipuler un tableau de byte je ne vois pas trop l'intérêt de ne pas déclarer directement travailler avec un byte[...].

Pour manipuler des bits tu peux utiliser les opérateurs <<, |, &, ~, >> (respectivement décaler d'un bit à gauche, faire un ou logique entre deux champs de bits, faire un et logiques entre deux champs de bits, et décaler d'un bit vers la droite). Ces opérateurs ne s'appliquent pas toutefois pour tous les types (par exemple pas un float). C'est pourquoi tu peux être amené à manipuler un champ de bits via un tableau pour le découper en tronçons dans lesquels tu pourras utiliser ces opérateurs. Par exemple :
#include <stdio.h>

int main(){
    unsigned i;
    int x=27;
    for(i=0;i<8*sizeof(x);++i){
        printf("%d",x & (1 << (8*sizeof(x) - i - 1)) ? 1 : 0);
    }
    printf("\n");
    return 0;
}

... écrit 27 en binaire. De la même façon tu seras sans doute amené à découper ton champ de bits en un tableau de type de base (par exemple un tableau d'int à toi de voir ce qui est le plus pratique) et d'appliquer ce genre de méthode pour récupérer les bits qui t'intéressent.

Bonne chance
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
14 mai 2009 à 19:59
Salut,
Toi aussi tu fais la confusion ;-))).
En C, un char fait un byte d'au moins 8 bits. Il n'y a aucune garantie que le byte (qui doit se traduire en français par multiplet, sauf lorsqu'il fait 8 bits ce qui est souvent le cas, mais pas en C) donne 8 bits.
0
pont Messages postés 198 Date d'inscription samedi 2 mai 2009 Statut Membre Dernière intervention 16 novembre 2010 27
13 mai 2009 à 23:00
Bonjour,

Apparemment, tu fais une erreur fondamentale: si tu déclares un tableau de 128 bytes il n'y aura que 128 bytes.
Et si tu précisais quel PIC tu utilises on irait voir la doc pour voir ses capacités mémoire. Un byte, ça fait un octet, tu ne le sais pas?

Deuxième erreur importante, c'est pour un tout petit programme de capteur, tu utilises du C qui n'a d'intérêt que pour de gros calculs, et ton programme serait beaucoup plus simple en assembleur de Microchip: MPLAB, on dirait que tu prends un camion pour bouger un sac de sable.

Si on te pose ce problème, c'est qu'on t'a fait une formation, je ne donnerais pas ça à faire à un débutant, je lui ferais juste allumer une led, c'est tout, déjà qu'il arrive à faire ça c'est extraordinaire, rends-toi compte qu'il y a une entrée d'un capteur qui semble être un contact donc il faut que tu saches écrire une routine de "débounce", sinon quand ton capteur t'enverra 1, tu recevras de 15 à 300 fois 1, et la mémoire sera gavée en un millième de seconde.
Que s'est-il passé tu arrives en fin de trimestre alors que les autres programment depuis des mois? Tu ne dois pas venir souvent aux cours, car ton orthographe....

Apparemment, d'après le schéma de ton "boss", il ne demande pas de mettre des bytes dans des octets, mais seulement des bits, ce qui est tout différent. Et l'instruction de décalage, tu la trouves dans ton tableau d'instructions, c'est RLF pour faire tourner vers la gauche à travers le bit C (carry) ou RRF pour faire tourner vers la droite, et cela pour le PIC16F88 C'est page 150 de la data sheet. Il te faut connaître la data sheet et le schéma de ta carte d'application, sinon tu ne peux programmer un PIC.
Et sur quelle broche est ton capteur?

Le programme tourne 24h/24, pendant combien de temps? avec tes 128 octets qui vont être pleins en 1seconde, où vas-tu mettre les 86.400 secondes d'un seul jour? Cela ne tient pas debout ton affaire, dis à ton boss que tu ne peux pas car ce n'est pas possible.
Cordialement
pont
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
15 mai 2009 à 01:31
Deuxième erreur importante, c'est pour un tout petit programme de capteur, tu utilises du C qui n'a d'intérêt que pour de gros calculs, et ton programme serait beaucoup plus simple en assembleur de Microchip: MPLAB, on dirait que tu prends un camion pour bouger un sac de sable.

Ca dépend du PIC, de la mémoire.

Le C:

- rend la programmation plus rapide (productivité)
- rend la (re)lecture du code vivable (maintenance, debuggage)
- produit du code compilé compact, selon le compilateur et les options choisies, en règle générale on atteind des proportions proches de l'asm fait maison.


Et l'instruction de décalage, tu la trouves dans ton tableau d'instructions, c'est RLF pour faire tourner vers la gauche à travers le bit C (carry) ou RRF pour faire tourner vers la droite, et cela pour le PIC16F88 C'est page 150 de la data sheet. Il te faut connaître la data sheet et le schéma de ta carte d'application, sinon tu ne peux programmer un PIC.

Ou prendre l'opérateur de décalage de bit pour le C? Puisqu'il fait du C.

Si on te pose ce problème, c'est qu'on t'a fait une formation, je ne donnerais pas ça à faire à un débutant, je lui ferais juste allumer une led, c'est tout, déjà qu'il arrive à faire ça c'est extraordinaire, rends-toi compte qu'il y a une entrée d'un capteur qui semble être un contact donc il faut que tu saches écrire une routine de "débounce", sinon quand ton capteur t'enverra 1, tu recevras de 15 à 300 fois 1, et la mémoire sera gavée en un millième de seconde.


Ya pas d'heure pour apprendre!

Que s'est-il passé tu arrives en fin de trimestre alors que les autres programment depuis des mois? Tu ne dois pas venir souvent aux cours, car ton orthographe....

Au contraire son orthographe m'a plutôt frappé au premier abord, elle est quasi-nickel!
0
bonjour

Merci mamiemando d'avoir pris le temps de me répondre. Mais je savais que 1octect = 8 bits j'ai juste fait une faute d'orthographe ... désolé.

Alors pour 'pont', alors toi tu es vraiment un gars comme je me demande à tu sers ? Dit moi se que sa t'a apporté de m'attaquer ?t'a mieux dormi ? Si mon poste t'énerve, sérieusement n'y réponds pas ...

"Deuxième erreur importante, c'est pour un tout petit programme de capteur, tu utilises du C qui n'a d'intérêt que pour de gros calculs, et ton programme serait beaucoup plus simple en assembleur de Microchip: MPLAB, on dirait que tu prends un camion pour bouger un sac de sable."
J'utilise Microchip, et le programme ne fait pas que 5 lignes, il fait beaucoup d'autre chose derrière. Donc oui ici j'ai besoin d'un camion car se n'est pas un sac de sable que je dois charger mais un gros bac à sable ...


"Si on te pose ce problème, c'est qu'on t'a fait une formation, je ne donnerais pas ça à faire à un débutant, je lui ferais juste allumer une led, c'est tout, déjà qu'il arrive à faire ça c'est extraordinaire, rends-toi compte qu'il y a une entrée d'un capteur qui semble être un contact donc il faut que tu saches écrire une routine de "débounce, sinon quand ton capteur t'enverra 1, tu recevras de 15 à 300 fois 1, et la mémoire sera gavée en un millième de seconde.
Que s'est-il passé tu arrives en fin de trimestre alors que les autres programment depuis des mois? Tu ne dois pas venir souvent aux cours, car ton orthographe.... "

Oui j'ai été en cour, mais il y a 4ans et depuis se temps je n'ai fais que du Html, php, javascript et mysql, mes connaissance scolaire en C sont assez vague donc mon 'Patron' me fais faire quelque exercice, histoire de me remettre à niveau (mais c'est vrai que j'ai besoin d'une bonne remise à niveau, que je vais surement faire).
Et sérieusement pour mes faute d'orthographe, en quoi sa te dérange? tu vas pas me dire que c'est incompréhensible? Donc ici à part pour essayer de me rabaisser j'en voix pas l'intérêt ...

"Le programme tourne 24h/24, pendant combien de temps? avec tes 128 octets qui vont être pleins en 1seconde, où vas-tu mettre les 86.400 secondes d'un seul jour? Cela ne tient pas debout ton affaire, dis à ton boss que tu ne peux pas car ce n'est pas possible. "
Apparemment mamiemando à compris le schema (pas trés beau je sais ...) mais pas toi ...

Mais tu m'as peut être aider sans le vouloir.
Sur ceux merci tout de même d'avoir pris le temps de me répondre.
Bonne journée

Ps: Désoler j'ai pas le temps de me relire ...
0
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
14 mai 2009 à 11:19
J'ai failli sévir sur le post de pont car il est effectivement moyennement agréable, mais quelques remarques sont pertinentes d'un point de vue technique.

pont : l'important n'est pas de remettre en question un choix technique, le but est de répondre à la question. Tu peux éventuellement proposer une autre approche mais de manière diplomatique. De plus je pense que même si le C est peut être disproportionné pour son problème, il a le mérite d'être plus simple. Or on sent bien dans le premier message que c'est un programme pour se remettre à niveau (surtout que c'est marqué "débutant" dans le titre !).

MaRs31nko : 1octect = 8 bits mais il faut juste que tu fasses attention car byte = octet. Autant tes quelques fautes d'orthographes ne sont pas trop gênantes à la compréhension (et bien moins nombreuses que celles que j'ai l'occasion de régulièrement observer sur le forum), autant là ça change complètement le sens. Est-ce que les indications que je t'ai données t'éclairent un peu plus ou tu as besoin de précisions ?

pont, MaRs31nko : je vous serais reconnaissante de reprendre le sujet initial dans un bon esprit, sinon je vais être contrainte de modérer.

Bonne journée à tout les deux
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pont Messages postés 198 Date d'inscription samedi 2 mai 2009 Statut Membre Dernière intervention 16 novembre 2010 27
14 mai 2009 à 19:52
Bonjour mammiemando,

. La technique n'est pas une affaire de salamaleks et de courbettes diverses, si vous aviez travaillé dans des ateliers de production, vous le sauriez. On doit rester poli, mais dur, il s'agit de choses matérielles.

. Par ex l'orthographe, dans un roman de chez Grasset, on s'en fiche, cela n'a pas de conséquence. Par contre en technique, on ne peut se permettre de s'en passer, l'informatique est là pour le rappeler et il y a 15 jours j'ai passé une journée à chercher pourquoi mon programme fonctionnait mal, et c'était un point-virgule oublié qui en était le responsable. Donc il faut insister, dans l'intérêt du demandeur, surtout débutant.

. . .Et il faut reconnaître que son programme ne tenait pas debout: il veut enregistrer 24h/24 des impulsions qui arrivent toutes les millisecondes, donc des dizaines de mégaoctets sont nécessaires, et il n'à qu'une mémoire de 128 octets.
. Devant tant de bêtise, quelle est votre réaction?
Cordialement
pont
0
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
15 mai 2009 à 00:27
La technique n'est pas une affaire de salamaleks et de courbettes diverses, si vous aviez travaillé dans des ateliers de production, vous le sauriez. On doit rester poli, mais dur, il s'agit de choses matérielles.

Justement on n'est pas dans un atelier. Si tu lis la charte il est marqué "réserver un accueil cordial aux usagers". Même si certains propos sont aberrants (et je peux te dire que c'est loin d'être le seul j'en vois passer plein tous les jours) et quel que soit ton niveau, tu n'as pas à rentrer dans le lard de quelqu'un qui a juste demandé un coup demain poliment.

Si les règles du jeu ne te conviennent pas peut être que tu devrais aller sur des forums d'usagers plus avertis et tu ne verras pas de messages qui te hérisseront le poil.

Par ex l'orthographe, dans un roman de chez Grasset, on s'en fiche, cela n'a pas de conséquence. Par contre en technique, on ne peut se permettre de s'en passer, l'informatique est là pour le rappeler et il y a 15 jours j'ai passé une journée à chercher pourquoi mon programme fonctionnait mal, et c'était un point-virgule oublié qui en était le responsable. Donc il faut insister, dans l'intérêt du demandeur, surtout débutant.

C'est une question de rigueur pas d'orthographe. Les deux sont souvent liés (sauf chez les dyslexiques) mais ce n'est de loin pas (encore une fois) ce que j'ai vu de pire. Tu as tout à fait le droit de demander à quelqu'un de faire un effort sur l'orthographe, je suis la première gênée pour déchiffrer un message truffé de fautes. Mais ça ne te donne pas le droit d'être vexant.

Et il faut reconnaître que son programme ne tenait pas debout: il veut enregistrer 24h/24 des impulsions qui arrivent toutes les millisecondes, donc des dizaines de mégaoctets sont nécessaires, et il n'à qu'une mémoire de 128 octets.

Je suis entièrement d'accord. Ca fait partie des remarques qui m'ont parues pertinentes auxquel j'ai fait allusion. Ceci dit je pense que son champ de bits est juste un tampon (chose qu'il n'a certes pas mentionné), il ne cherche pas à tout dumper, c'est la seule explication logique.
0