Go Down

Topic: Bargraph qui pose des problèmes (Read 882 times) previous topic - next topic

EGT59

Bonsoir,

Je me suis lancé dans la réalisation d'un indicateur de niveau constitué d'un bargraph de 12 segments bicolores et géré par un MAX 7219, tout ça avec une Nano.

Je me suis inspiré du tuto suivant :

https://f-leb.developpez.com/tutoriels/arduino/piloter-bargraphe/

les exemples fournis fonctionnent à merveille, ce qui me laisse penser que mon câblage est ok.

Le code suivant :

Code: [Select]
#include <SPI.h>

#define LOAD          10   // Entrée LOAD du MAX72219
#define DISPLAY_TEST  0x0F // Registre Display-Test
#define SHUTDOWN      0x0C // Registre Shutdown
#define DECODE_MODE   0x09 // Registre Decode-mode
#define SCAN_LIMIT    0x0B // Registre Scan-limit
#define INTENSITY     0x0A // Registre Intensity
#define DIGIT0        0x01 // Registre Digit 0
#define DIGIT1        0x02 // Registre Digit 1
#define DIGIT2        0x03 // Registre Digit 2
const int m = 2000;

void setup() {
  pinMode(LOAD, OUTPUT);
  digitalWrite(LOAD, HIGH);
  SPI.begin();
  SPI.setBitOrder(MSBFIRST); /* bits de poids fort en premier */
 
  writeRegister(DISPLAY_TEST, 0x00); /* Normal operation */
  writeRegister(DECODE_MODE, 0x00);  /* No decode */
  writeRegister(SCAN_LIMIT, 0x02);   /* Display digits 0, 1, 2 */
  writeRegister(INTENSITY, 0x04);    /* LED brightness, max=0x0F */
  writeRegister(SHUTDOWN, 0x01);     /* Normal operation */
 
}
void writeRegister(byte thisRegister, byte thisValue) // Écrire dans un registre du MAX7219
{
  // Mettre l'entrée LOAD à l'état bas
  digitalWrite(LOAD, LOW);

  SPI.transfer(thisRegister); // Adresse du registre
  SPI.transfer(thisValue); // Contenu du registre

  // Basculer l'entrée LOAD à l'état haut pour verrouiller et transférer les données
  digitalWrite(LOAD, HIGH);
}

/*void niveau1() {
  byte red = 0x00;
  writeRegister(DIGIT0, 0x00); // 0000 0000
  writeRegister(DIGIT1, 0x00); // 0000 0000
  writeRegister(DIGIT2, 0x00); // 0000 0000

  for (int i = 0; i < 4; i++) {
    red |= (1 << i);
    writeRegister(DIGIT0, red); // scan du premier digit en rouge
    delay(500);
  }
  for (int i = 0; i < 5; i++) {
    writeRegister(DIGIT0, 0x0F);
    delay(100);
    writeRegister(DIGIT0, 0x00);
    delay(100);
  }
}*/

void niveau2() {
  writeRegister(DIGIT0, 0xCF); // 1100 1111
  writeRegister(DIGIT1, 0xF0); // 1111 0000
  writeRegister(DIGIT2, 0xF0); // 1111 0000
}

void niveau3() {
  writeRegister(DIGIT0, 0xCE); // 1100 1110
  writeRegister(DIGIT1, 0xF0); // 1111 0000
  writeRegister(DIGIT2, 0xF0); // 1111 0000
}
void niveau4() {
  writeRegister(DIGIT0, 0xCC); // 1100 1100
  writeRegister(DIGIT1, 0xF0); // 1111 0000
  writeRegister(DIGIT2, 0xF0); // 1111 0000
}
void niveau5() {
  writeRegister(DIGIT0, 0x88); // 1000 1000
  writeRegister(DIGIT1, 0xF0); // 1111 0000
  writeRegister(DIGIT2, 0xF0); // 1111 0000
}
void niveau6() {
  writeRegister(DIGIT0, 0x00); // 0000 0000
  writeRegister(DIGIT1, 0xF0); // 1111 0000
  writeRegister(DIGIT2, 0xF0); // 1111 0000
}
void niveau7() {
  writeRegister(DIGIT0, 0x00); // 0000 0000
  writeRegister(DIGIT1, 0xE0); // 1110 0000
  writeRegister(DIGIT2, 0xF0); // 1111 0000
}
void niveau8() {
  writeRegister(DIGIT0, 0x00); // 0000 0000
  writeRegister(DIGIT1, 0xC0); // 1100 0000
  writeRegister(DIGIT2, 0xFF); // 1111 1111
}
void niveau9() {
  writeRegister(DIGIT0, 0x00); // 0000 0000
  writeRegister(DIGIT1, 0x80); // 1000 0000
  writeRegister(DIGIT2, 0x7F); // 0111 1111
}
void niveau10() {
  writeRegister(DIGIT0, 0x00); // 0000 0000
  writeRegister(DIGIT1, 0x00); // 0000 0000
  writeRegister(DIGIT2, 0x2E); // 0010 1110
}
void niveau11() {
  writeRegister(DIGIT0, 0x00); // 0000 0000
  writeRegister(DIGIT1, 0x00); // 0000 0000
  writeRegister(DIGIT2, 0x0C); // 0000 1100
}
void niveau12() {
  writeRegister(DIGIT0, 0xCF); // 1100 1111
  writeRegister(DIGIT1, 0xF0); // 1111 0000
  writeRegister(DIGIT2, 0xF0); // 1111 0000
}

void loop()

{
//  niveau1();  delay(m);
  niveau2();  delay(m);
  niveau3();  delay(m);
  niveau4();  delay(m);
  niveau5();  delay(m);
  niveau6();  delay(m);
  niveau7();  delay(m);
  niveau8();  delay(m);
  niveau9();  delay(m);
  niveau10();  delay(m);
  niveau11();  delay(m);
  niveau12();  delay(m);
  }
que j'ai créé en m'inspirant des exemples ne fonctionne pas correctement.

De "niveau2()" à "6", les segments s'éteignent ou changent de couleur selon mon code mais à la fonction "niveau7()", tout s'éteint sans tenir compte des autres niveaux et le code cesse de fonctionner.

La loop ne redémarre plus.

je ne trouve pas de quoi ça vient.

Merci d'avance pour votre aide.

J-M-L

#1
Nov 10, 2018, 07:46 pm Last Edit: Nov 10, 2018, 07:46 pm by J-M-L
si vous mettez dans niveau7() le code de niveau6() - que se passe-t-il?

quelle R avez vous mis sur ISET de votre MAX7219? correspond-elle bien aux specifications de vos LEDs?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

EGT59

Pour R, j'ai au max 10 leds vertes et 4 rouges allumées en même temps (2 rouges, 2 oranges et 8 vertes), j'ai donc mis une R de 22.9K (27+2.2).

J'avais mis en commentaires les lignes des niveaux 8 à 12 mais ça changeait rien.

Pour les inversions de fonction, je testerais demain.


EGT59

Bonjour,

Bon voilà, j'ai fait mes tests :

Cà fonctionne y compris le niveau 7.  La loop fait son job.  :)

J'ai remplacé les instructions des niveaux 8 et 9 par celles des 6 et 5 et là Miracle ça fonctionne.

J'ai donc ré-écrit les instructions qui posent problèmes (on ne sait jamais : une faute de frappe qui passe inaperçue) mais ça change rien. Ca bloque tout.

Je suis donc coincé.....

Et franchement, je ne vois pas ce qui bloque (à part mon incapacité)

Merci de m'aider

J-M-L

essayez d'isoler en mettant 1 fois dans le setup le code de chacune des fonctions pour voir ce qu'il se passe...
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

EGT59

J'ai testé chaque fonction individuellement et pour les fonctions niveau 8 et 9, ça ne marche pas.


J'ai ensuite essayé de niveau 2 à 7 : c'est bon, de niveau 10 à 12 c'est bon, de niveau 2 à 7 puis 10 à 12 ça marche toujours mais dès que j'inclue dans la boucle les niveaux 8 et 9  là c'est mort.

C'est donc bien le code de ces fonctions qui ne fonctionne pas.

Mais ou est l'erreur ....... ?  :o


Je vais les reprendre dans le détail. Je crois que ça sera mieux.


J-M-L

#6
Nov 12, 2018, 07:29 pm Last Edit: Nov 12, 2018, 07:58 pm by J-M-L
mais si vous ne mettez que le code de 8 et 9, pas dans la boucle mais dans le setup (avec la pause) - ça fait quoi ?

si vous conservez tout le code et mettez le code de la fonction 6 dans 8 et 9 (juste pour voir), ça fait quoi ?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

EGT59

Sans rien dans la loop et si dans le setup je mets le code d'une fonction autre que 8 et 9, ça fonctionne et si je mets le code de la 8 et/ou 9, ça compile mais rien ne se passe......


Si je remplace les codes des 8 et 9 par le code de la 6 ou une autre, ça fonctionne.


J-M-L

les fonctions 8 et 9 sont les seules qui utilisent plus de 7 lignes de data à 1 dans la commande ==> problème de puissance ?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

EGT59

#9
Nov 13, 2018, 12:47 pm Last Edit: Nov 13, 2018, 12:50 pm by EGT59
La nano à son alim et le bargraph à une alim 5V 2A. Les GND sont reliés. C'est le niveau 2 qui consomme le + avec 14 leds allumées en meme temps

J-M-L

c'est louche... vous avez essayé d'inverser des pins ?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

EGT59

Non, si j'inverse des pins ça ne pilotera plus les bons segments.

Et puis comme ça marche pour les autres niveaux et les exemples du tuto , le câblage semble bon

J-M-L

je veux dire complètement inverser - changer la pin 3 des 2 côtés- juste pour éliminer un soucis hardware avec une pin ?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

EGT59

Ok je vais voir de ce côté la

Merci de me consacrer du temps

J-M-L

essayez en remplaçant le setup et la fonction par ceci:
Code: [Select]
void setup()
{
  pinMode(LOAD, OUTPUT);
  digitalWrite(LOAD, HIGH);
  SPI.begin();

  writeRegister(DISPLAY_TEST, 0x00); /* Normal operation */
  writeRegister(DECODE_MODE, 0x00);  /* No decode */
  writeRegister(SCAN_LIMIT, 0x02);   /* Display digits 0, 1, 2 */
  writeRegister(INTENSITY, 0x04);    /* LED brightness, max=0x0F */
  writeRegister(SHUTDOWN, 0x01);     /* Normal operation */

}

void writeRegister(byte thisRegister, byte thisValue) // Écrire dans un registre du MAX7219
{
  SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0))
  // Mettre l'entrée LOAD à l'état bas
  digitalWrite(LOAD, LOW);

  SPI.transfer(thisRegister); // Adresse du registre
  SPI.transfer(thisValue); // Contenu du registre

  // Basculer l'entrée LOAD à l'état haut pour verrouiller et transférer les données
  digitalWrite(LOAD, HIGH);
  SPI.endTransaction();
}


il manqueait la gestion des transaction SPI dans writeRegister(), vous êtes peut-être victime d'une interruption inadéquate

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up