modif code spider board

Questions générales sur le code arduino / C++
General questions about arduino code / C++
Répondre
phebusco
Messages : 3
Enregistré le : mer. 21 févr. 2024 14:13

modif code spider board

Message par phebusco »

Bonjour à tous
j'ai un montage à base d'arduino nano et un shield pca 9685 avec 16 mosfets en sortie, j'utilise le programme " arpschuino-2spider-board " modifié
( adressage en dip-switch, rajout de strobe ) jusqu’à là tout fonctionne bien.
Je veux rajouter un dimmer général et c'est là que ça bloque, j'arrive a dimmer toutes les sorties à la seule condition que tout les canaux aient une valeur inférieure à 129.
La partie du code
{ int mult=0;
mult = ArduinoDmx0.RxBuffer[0];
for(int i=0;i<16;i++)
pwm1.setPWM( i, 0, ( ArduinoDmx0.RxBuffer[i+1]* mult/255) <<4 ) ;
}

est-ce quelqu'un aurait une idée ?

Merci d'avance
Jacques
Messages : 278
Enregistré le : dim. 31 oct. 2021 19:37

Re: modif code spider board

Message par Jacques »

Hello,
je pense que tu débordes la taille du int (-32 768 à 32 767), essaie uint16_t mult=0;
uint16_t : de 0 à 65 535
phebusco
Messages : 3
Enregistré le : mer. 21 févr. 2024 14:13

Re: modif code spider board

Message par phebusco »

Merci beaucoup, ça marche nickel !
Avatar du membre
RitoonL
Administrateur du site
Messages : 116
Enregistré le : dim. 31 oct. 2021 10:21

Re: modif code spider board

Message par RitoonL »

Hello,

Juste pour ajouter de l'eau au moulin quand aux bonnes pratiques de programmation :

Il est important de maitriser et de définir le type de variables que vous allez utiliser dans vos codes. pour ce faire, il faut d'abord savoir la gamme des valeurs qui seront contenues dans votre variable

exemple simple, et très courant :

nous voulons stocker dans une variable la valeur d'un canal DMX. Une valeur DMX est en 8 bits et n'est pas signée: c'est à dire qu'elle ne pourra prendre que des valeurs incluses entre 0 et 255 et seulement des nombres entiers, de plus nous manipulons dans ce cas, seulement des valeurs positives. Il n'est dans ce cas pas nécessaire de le stocker dans un int qui fait 16 bits. De plus un int est signé, c'est à dire qu'il partagera la moitié de ses valeurs admissibles entre valeurs positives et négatives.

un int de 16 bits pourra donc prendre 65 535 valeurs réparties entre −32 768 et +32 767. Si on ne veux stocker dedans que notre valeur DMX, ce qui est possible, un int prendra donc plus de place en mémoire. Cette mémoire si précieuse lorsqu’on code pour un micro-controlleur, car elle est, disons, plutôt limitée. Il faudra donc dans ce cas privilégier un uint8_t dont la définition est incluse dans la library stdint.h qui faudra inclure dans votre code.

Code : Tout sélectionner

#include <stdint.h>
Décortiquons maintenant la terminologie :

uint8_t = Unsigned Int 8bits Type
il est équivalent à un unsigned char

on peux le décliner en uint16_t (pour une valeur 16 bits), uint32_t (pour une valeur 32 bits), uint64_t (devinez pourquoi ???)
ils existent aussi dans la version signée. dans ce cas, nous enlèverons le u (int8_t, int16_t ...)

dans ton cas, phebusco, tu tentais de faire rentrer une valeur 16 bit non-signée pouvant atteindre une valeur supérieur à +32 767 dans un conteneur 16 bits signé. On appelle cela un débordement. Le comportement dans ce cas de figure est que la valeur qui déborde, fait repasser ton int à sa première valeur octale (0000000000000000), donc la valeur +32 768 devient en fait -32 768 (+32 769 devient -32 767 et ainsi de suite). ce qui explique que ton code ne fonctionnait qu'à une valeur de 50%

On peut noter aussi qu'un int ne fait pas forcément 16 bits pour tous les compilateurs ou toutes les plateformes. Il est donc important de bien borner le type d'une variable afin qu'elle corresponde au besoin de votre code.
Administrateur - Forum arpschuino
phebusco
Messages : 3
Enregistré le : mer. 21 févr. 2024 14:13

Re: modif code spider board

Message par phebusco »

Merci pour ta réponse, j'avoue que j'avais du mal à assimiler tout ça, mais je pense que grâce à ton explication, c'est une erreur que je vais essayer de ne plus commettre !
Répondre