Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Comprendre les bases de la programmation PIC
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#51 Message par djviper16 » sam. 9 janv. 2021 14:37

satinas a écrit :Puisque que tu remets à 0 Ton, ça sert a rien qu'il figure à droite.
Et même si tu le remets pas à 0, cette instruction remplit la totalité des 8 bits de Ton, et Ton est plutôt un byte qu'un int.
Ton = (etatRC2<<0) | (etatRC1<<1) | (etatRA5<<2) | (etatRA4<<3) | (etatRA3<<4) | (etatRC5<<5) | (etatRC4<<6) | (etatRC3<<7);
Je vois pas l'intérêt de la variable etatRC2, tu peux travailler directement avec RC2, dans le programme actuel.


Tu as raison, les 3 solutions suivantes ont le même effet :

Ton = Ton | ((etatRC2<<0) | (etatRC1<<1) | (etatRA5<<2) | (etatRA4<<3) | (etatRA3<<4) | (etatRC5<<5) | (etatRC4<<6) | (etatRC3<<7));
Ton = ((etatRC2<<0) | (etatRC1<<1) | (etatRA5<<2) | (etatRA4<<3) | (etatRA3<<4) | (etatRC5<<5) | (etatRC4<<6) | (etatRC3<<7));
Ton = ((!RC2<<0) | (!RC1<<1) | (!RA5<<2) | (!RA4<<3) | (!RA3<<4) | (!RC5<<5) | (!RC4<<6) | (!RC3<<7));

Dans mon cas "int Ton" est une variable 8 bits de 0 à 255. Pourquoi dire que c'est un byte ? Enfin je veux dire, c'est une variable de 8 bits, donc c'est un byte mais je ne peux pas l'appeler "byte" à la place de "int", je ne vois pas où tu veux en venir.


PEDRO a écrit :Peux-tu etre plus précis sur ce point : tu dis que ça ne marche pas tout à fait, donc il y a une partie qui marche
Peux-tu expliquer ce qui marche et ce qui ne marche pas


Par exemple si je fais if(Ton==0xFF) ça marche, ma led en RA1 clignote,
Ton==0x00 ça marche pas,
Ton==0xF0 ça marche,
Ton==0x0F ça marche,
Ton==0xCC ça marche,
Ton==0x5C ça marche pas,
Ton==0x4C ça marche pas,
Ton==0x05 ça marche pas,
Ton==0x07 ça marche pas

PEDRO a écrit :Si tu veux, je veux bien discuter de l'architecture de ton programme, car cela est totalement indépendant du langage et du compilateur utilisé et peut-etre qu'en simplifiant cette architecture, tu vas t'affranchir de potentielles erreurs que je ne suis pas en mesure de déceler dans ton code


Le but final du projet est de faire un temporisateur cyclique programmable.
La programmation des temps Ton et Toff se ferait par l'intermédiaire des 8 interrupteurs.
1 - on programme la base de temps qu'on veut utiliser pour Ton.
Par exemple prenons une base de 1 seconde pour Ton, on mettra les interrupteurs à 00000001.
00000001 -> base 1 seconde
00000010 -> base 5 secondes
00000011 -> base 10 secondes
00000100 -> base 30 secondes
00000101 -> base 1 minute
etc...
2 - on fait un appui long sur le bouton poussoir de gauche pour enregistrer la base de temps Ton. La led clignote lentement 3 fois.
3 - on programme de la même manière la base de temps Toff.
4 - on programme la durée de Ton à l'aide des 8 interrupteurs.
Par exemple pour 10 minutes on imagine qu'on a programmé la base de temps à 1 minute, donc on place les 8 interrupteurs à 00001010.
5 - on fait un appui court sur le bouton poussoir de gauche pour enregistrer Ton. La led clignote rapidement 6 fois.
6 - on programme de la même manière la durée Toff.

PEDRO a écrit :Il y a un autre point de tes propos qui a retenu mon attention et qui pourrait laisser penser que tu as peut-etre un soucis sur la configuration des Pins de ton PIC
A mes débuts, j'ai eu comme problème le fait qu'une entrée sur un PIC ne marchait pas bien, cela était du au fait que par défaut, le module comparateur de ce PIC était activé, le pin en question ne se comportait donc par comme une I/O normale ... jusqu'à ce que je comprenne ça et que j'ajoute une ligne de code pour désactiver les comparateurs et tout est rentré dans l'ordre.
Maintenant, je fais très attention à ce qu'il y a sur chaque pin que j'utilise et je regarde de près pour voir ce qui est activé par défaut

Oui j'ai paramétré les registres pour désactiver les comparateurs (ANSEL).
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par djviper16 le sam. 9 janv. 2021 14:57, modifié 1 fois.

Comprendre les bases de la programmation PIC
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#52 Message par satinas » sam. 9 janv. 2021 14:52

Dans mon cas "int Ton" est une variable 8 bits de 0 à 255. Pourquoi dire que c'est un byte ? Enfin je veux dire, c'est une variable de 8 bits, donc c'est un byte mais je ne peux pas l'appeler "byte" à la place de "int", je ne vois pas où tu veux en venir.


Sur les autres compilateurs 8 bits l'int est de taille 16 bits, CCS c'est 8 bits, maintenant je le sais :-)
PCD c'est à dire CCS pour pic 16 bits, lui un a int 16 bits, logique.
En mettant int8 au lieu de int, tu forces la taille 8 bits, ce sera un octet même si compilé sur un pic 16 bits.
J'arrive pas à trouver si int est signed ou unsigned par défaut dans CCS, Pour 0 à 255, je mettrais unsigned int.
Modifié en dernier par satinas le sam. 9 janv. 2021 15:19, modifié 1 fois.

Comprendre les bases de la programmation PIC
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#53 Message par djviper16 » sam. 9 janv. 2021 15:19

satinas a écrit :
Dans mon cas "int Ton" est une variable 8 bits de 0 à 255. Pourquoi dire que c'est un byte ? Enfin je veux dire, c'est une variable de 8 bits, donc c'est un byte mais je ne peux pas l'appeler "byte" à la place de "int", je ne vois pas où tu veux en venir.


Sur les autres compilateurs 8 bits l'int est de taille 16 bits, CCS c'est 8 bits, maintenant je le sais :-)
PCD c'est à dire CCS pour pic 16 bits, lui un a int 16 bits, logique.
En mettant int8 au lieu de int, tu forces la taille 8 bits, ce sera un octet même si compilé sur un pic 16 bits.
Par contre int c'est -128 à +127, il faut mettre unsigned int (ou unsigned int8)


Je comprends mieux ta remarque ! Et sur un système 32 bits le int aura par défaut une taille de 32 bits il me semble.

Oui pour int8. J'avais vu ça dans la doc CCS.
J'ai aussi vu que par défaut les int sont "unsigned". On précisera seulement dans le cas d'une variable signée.

"All types, except float, by default are unsigned; however, maybe preceded by unsigned or signed. Short and long may have the keyword INT following them with no effect."

BINGO ! J'ai enfin trouvé pourquoi ça ne marchait qu'à moitié !

J'avais inversé l'ordre de mes interrupteurs.
À la place de :
Ton = ((!RC2<<0) | (!RC1<<1) | (!RA5<<2) | (!RA4<<3) | (!RA3<<4) | (!RC5<<5) | (!RC4<<6) | (!RC3<<7));
Il fallait mettre :
Ton = ((RC3<<0) | (RC4<<1) | (RC5<<2) | (RA3<<3) | (RA4<<4) | (RA5<<5) | (RC1<<6) | (RC2<<7));

oops exit dehors!!

Comprendre les bases de la programmation PIC
PEDRO
Amateur
Amateur
Messages : 127
Enregistré en : septembre 2015
Localisation : P.A.C.A

#54 Message par PEDRO » sam. 9 janv. 2021 15:27

Là, je ne comprend plus :

tu dis avoir désactivé les comparateurs dans le registre ANSEL.
En principe, ce registre est utilisé pour l'ADC et le 16F628 n'en a pas, de plus, sur diverses références de PIC, les comparateurs se désactivent dans les registres COM1CON0 et COM2CON0, il s'agit des bits C1ON et C2ON, mais, encore une fois, sur les références que j'utilise, pas forcément sur le tiens.
Ce dont j'ai parlé pour les comparateurs était un exemple, il se peut très bien qu'il y ait d'autres modules hard qui soient activés.


Déjà, pour clarifier un point, le BP de gauche sert pour mémorise la base de temps et un coefficient multiplicateur pour Ton, et je suppose que pour Toff c'est la meme chose avec le BP de droite.
Pour ce qui est du réglage de ta base de temps et des durées, c'est un peu une usine à gaz !

Ce qui me choque, ou alors j'ai mal compris, c'est que tu règles ta base de temps avec 8 switchs mais que les valeurs binaires obtenues par ces switchs ne sont pas proportionnelles aux valeurs que tu souhaites avoir, il va donc falloir que tu traites les 256 cas un par un pour déterminer la valeur de ta base de temps.

Comprendre les bases de la programmation PIC
PEDRO
Amateur
Amateur
Messages : 127
Enregistré en : septembre 2015
Localisation : P.A.C.A

#55 Message par PEDRO » sam. 9 janv. 2021 15:31

djviper16 a écrit :Source du message Et sur un système 32 bits le int aura par défaut une taille de 32 bits il me semble.


Non, ça ne dépend pas du nombre de bits d'un µC, c'est une convention

variables.jpg


Cela dit, ça peut peut-etre différer d'un compilateur à l'autre, je ne saurai etre catégorique sur ce point
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Comprendre les bases de la programmation PIC
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#56 Message par djviper16 » sam. 9 janv. 2021 15:38

PEDRO a écrit :Source du message En principe, ce registre est utilisé pour l'ADC et le 16F628 n'en a pas,

Je ne suis plus sur un 16F628, mais sur un 16F684. Voir post #33.

PEDRO a écrit :Source du message Déjà, pour clarifier un point, le BP de gauche sert pour mémorise la base de temps et un coefficient multiplicateur pour Ton, et je suppose que pour Toff c'est la meme chose avec le BP de droite.

C'est ça :wink:

PEDRO a écrit :Source du message Ce qui me choque, ou alors j'ai mal compris, c'est que tu règles ta base de temps avec 8 switchs mais que les valeurs binaires obtenues par ces switchs ne sont pas proportionnelles aux valeurs que tu souhaites avoir, il va donc falloir que tu traites les 256 cas un par un pour déterminer la valeur de ta base de temps.

En fait non je n'aurai qu'une 10ène de cas. Voir peut-être même seulement 8 à paramétrer avec la mise à 1 d'un seul des 8 bits.
Tout ce système doit être simplement utilisable par mon papa qui n'y connait rien en électronique, alors je lui imprimerai un tableau avec les différentes valeurs correspondantes.

PEDRO a écrit :Source du message Non, ça ne dépend pas du nombre de bits d'un µC, c'est une convention

J'ai lu hier sur internet que justement non, il n'y a pas de règle harmonisée, chaque compilateur gère ça comme il veut.

Comprendre les bases de la programmation PIC
PEDRO
Amateur
Amateur
Messages : 127
Enregistré en : septembre 2015
Localisation : P.A.C.A

#57 Message par PEDRO » sam. 9 janv. 2021 15:45

djviper16 a écrit :Source du message Tout ce système doit être simplement utilisable par mon papa qui n'y connait rien en électronique, alors je lui imprimerai un tableau avec les différentes valeurs correspondantes.

Les Ton et Toff dont tu as besoin vont de 0.5s à ... combien ?

djviper16 a écrit :Source du message Je ne suis plus sur un 16F628, mais sur un 16F684.

Ca explique beaucoup de choses !

Comprendre les bases de la programmation PIC
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#58 Message par djviper16 » sam. 9 janv. 2021 16:06

PEDRO a écrit :Source du message Les Ton et Toff dont tu as besoin vont de 0.5s à ... combien ?

À peu près 1 seconde à 1h pour Ton, et 1 minute à 12h pour Toff.

PEDRO a écrit :Source du message Ca explique beaucoup de choses !

Tu m'étonnes que tu comprenais pas ! :lol:

Pour distinguer un appui long d'un appui court sur les BP, je pense utiliser le Timer0 en compteur, et regarder combien de flag il a déclenché.
Vous en pensez quoi ?

Comprendre les bases de la programmation PIC
PEDRO
Amateur
Amateur
Messages : 127
Enregistré en : septembre 2015
Localisation : P.A.C.A

#59 Message par PEDRO » sam. 9 janv. 2021 16:11

djviper16 a écrit :Source du message À peu près 1 seconde à 1h pour Ton, et 1 minute à 12h pour Toff.

Il y a peut-etre moyen de simplifier, par exemple pour n'avoir que 2 mémorisations à faire au lieu de 4, car je suppose que lorsque tu as besoin d'un Ton de 1H, soit 3600 secondes, pouvoir également régler 3599 ou 3598 ne présente aucun interet
Modifié en dernier par PEDRO le sam. 9 janv. 2021 16:13, modifié 1 fois.

Comprendre les bases de la programmation PIC
PEDRO
Amateur
Amateur
Messages : 127
Enregistré en : septembre 2015
Localisation : P.A.C.A

#60 Message par PEDRO » sam. 9 janv. 2021 16:12

djviper16 a écrit :Source du message Pour distinguer un appui long d'un appui court sur les BP, je pense utiliser le Timer0 en compteur, et regarder combien de flag il a déclenché.

Et mettre 4 BP au lieu de 2, ce ne serait pas plus simple, surtout que si j'ai bien vu, sur ton 16F684 c'est faisable


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 30 invités