Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3039 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C/C++]Programme cube led, besoin d'aide pour comprendre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C/C++]Programme cube led, besoin d'aide pour comprendre

n°2179808
nerdherd
Posté le 11-03-2013 à 18:01:05  profilanswer
 

Bonjour à tous.
 
En ce moment je travail sur un projet personnel d'un cube LED en 3D 4*4*4, le cube marche parfaitement à l'aide d'une carte Arduino Uno.
Seulement mon problème et que j'utilise un code qui n'est pas le mien et j'aimerai le comprendre, ainsi que l'algorithme contenu dans void loop (boucle faire tant que), afin d'améliorer ou modifier certaines choses.
J'avais déjà commencé moi même un programme, mais celui ci fonctionnant parfaitement, je me dois de le comprendre si une ame généreuse pouvait m'aider ce serait très sympa.
Voici le code, enfait les pins des LED sont associées à un tableau, et on peut créer des séquences très simplement avec des 0 et des 1 tout en haut du code. Voici le code complet tel que je l'ai trouvé :
 

Code :
  1. //int LEDPin[] = {16, 3, 1, 15, 4, 6, 14, 5, 7};
  2. int LEDPin[] = {5, 6, 7, 8, 9, 10, 11, 12, 13};
  3. //int PlanePin[] = {19, 18, 17};
  4. int PlanePin[] = {2, 3, 4};
  5. // initialization
  6. void setup()
  7. {
  8.   int pin;      // loop counter
  9.   // set up LED pins as output (active HIGH)
  10.   for (pin=0; pin<PLANESIZE; pin++) {
  11.     pinMode( LEDPin[pin], OUTPUT );
  12.   }
  13.   // set up plane pins as outputs (active LOW)  
  14.   for (pin=0; pin<CUBESIZE; pin++) {
  15.     pinMode( PlanePin[pin], OUTPUT );
  16.   }
  17. }
  18. // display pattern in table until DisplayTime is zero (then repeat)
  19. void loop()
  20. {
  21.   // declare variables
  22.   byte PatternBuf[ PLANESIZE ];      // saves current pattern from PatternTable
  23.   int PatternIdx;
  24.   byte DisplayTime;        // time*100ms to display pattern
  25.   unsigned long EndTime;
  26.   int plane;      // loop counter for cube refresh
  27.   int patbufidx;   // indexes which byte from pattern buffer
  28.   int ledrow;    // counts LEDs in refresh loop
  29.   int ledcol;    // counts LEDs in refresh loop
  30.   int ledpin;    // counts LEDs in refresh loop
  31.   // Initialize PatternIdx to beginning of pattern table
  32.   PatternIdx = 0;
  33.   // loop over entries in pattern table - while DisplayTime>0
  34.   do {
  35.     // read pattern from PROGMEM and save in array
  36.     memcpy_P( PatternBuf, PatternTable+PatternIdx, PLANESIZE );
  37.     PatternIdx += PLANESIZE;
  38.     // read DisplayTime from PROGMEM and increment index
  39.     DisplayTime = pgm_read_byte_near( PatternTable + PatternIdx++ );   
  40.     // compute EndTime from current time (ms) and DisplayTime
  41.     EndTime = millis() + ((unsigned long) DisplayTime) * TIMECONST;
  42.     // loop while DisplayTime>0 and current time < EndTime
  43.     while ( millis() < EndTime ) {
  44.       patbufidx = 0;    // reset index counter to beginning of buffer
  45.       // loop over planes
  46.       for (plane=0; plane<CUBESIZE; plane++) {
  47.         // turn previous plane off
  48.         if (plane==0) {
  49.           digitalWrite( PlanePin[CUBESIZE-1], HIGH );
  50.         } else {
  51.           digitalWrite( PlanePin[plane-1], HIGH );
  52.         }
  53.         // load current plane pattern data into ports
  54.         ledpin = 0;
  55.         for (ledrow=0; ledrow<CUBESIZE; ledrow++) {
  56.           for (ledcol=0; ledcol<CUBESIZE; ledcol++) {
  57.             digitalWrite( LEDPin[ledpin++], PatternBuf[patbufidx] & (1 << ledcol) );
  58.           }
  59.           patbufidx++;
  60.         }
  61.         // turn current plane on
  62.         digitalWrite( PlanePin[plane], LOW );
  63.         // delay PLANETIME us
  64.         delayMicroseconds( PLANETIME );
  65.       }    // for plane
  66.     }    // while <EndTime
  67.   } while (DisplayTime > 0);        // read patterns until time=0 which signals end
  68. }


 
Merci d'avance.


Message édité par nerdherd le 11-03-2013 à 18:01:39
mood
Publicité
Posté le 11-03-2013 à 18:01:05  profilanswer
 

n°2179848
nerdherd
Posté le 11-03-2013 à 22:32:45  profilanswer
 

Quelqu'un a une idée sur le fonctionnement globale de la boucle do while ? Moi je sèche complètement ...

n°2179859
gilou
Modérateur
Modzilla
Posté le 12-03-2013 à 00:17:42  profilanswer
 

C'est pas dur a comprendre:
Quelque part, tu as une table PatternTable qui doit avoir la tronche suivante:
Des lignes constituées de PLANESIZE octets correspondants a un pattern a afficher, suivis d'un octet indiquant le temps d'affichage
La dernière ligne est mise à 0
 
bref, tu as quelque chose comme  
struct {
    byte Pattern[PLANESIZE];
    byte DisplayTime;
} DisplayTime[NbPatterns + 1];
 
 
La boucle externe fait
int i = 0;
PatternBuf[PLANESIZE];
byte DisplayTime;
do {
    PatternBuf <- PatternTable[i].Pattern
    DisplayTime <- PatternTable[i].DisplayTime
    i++
    // une boucle interne, pas executée si DisplayTime = 0
   ...
   // et on utilise DisplayTime = 0 comme test d'arret de parcours du tableau des patterns
} while (DisplayTime);
 
Sauf que c'est probablement pas un tableau de taille fixe, mais une structure dynamique, qui a été allouée en faisant:
byte *DisplayTime = malloc((PLANESIZE+ 1) * (NbPatterns + 1));
et que le code travaille par adressage relatif au début de la table:
  PatternBuf <- PatternTable[i].Pattern
  se traduit alors en  
  memcpy_P( PatternBuf, PatternTable + PatternIdx, PLANESIZE );
  PatternIdx += PLANESIZE;
et  
   DisplayTime <- PatternTable[i].DisplayTime
en  
   DisplayTime = pgm_read_byte_near( PatternTable + PatternIdx);  
   PatternIdx += 1;
   (simplifié en DisplayTime = pgm_read_byte_near( PatternTable + PatternIdx++);  
 
A+,


Message édité par gilou le 12-03-2013 à 00:18:50

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C/C++]Programme cube led, besoin d'aide pour comprendre

 

Sujets relatifs
[ASP.NET - C#] Récupérer valeur d'un gridviewRencontre C++ Francophone
[C] Aide pour comprendre un petit codeJ'ai vraiment besoin d'aide ! C'est urgent !
Macros C++ - Remplacement de la macro par le code final[C] Petit programme
Problème programme CChoix d'ecole de formation C# .NET
Plus de sujets relatifs à : [C/C++]Programme cube led, besoin d'aide pour comprendre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR