par , 23/04/2020 à 13h32 (1414 Affichages)
Partie 2 - PSoC 4, programmer la LED RVB depuis l’EDI PSoC Creator
Avant de confier le contrôle de la LED au Raspbery Pi via la liaison I2C (voir Partie 1), voyons un peu comment se programme notre carte PSoC 4.
Si vous ne connaissez pas l’environnement des cartes Cypress PSoC, je vous invite à le découvrir dans le tutoriel Débuter avec les cartes Cypress PSoC et l'EDI PSoC Creator. On rappelle LA particularité des puces du constructeur Cypress : elles sont configurables, un principe qui rappelle le fonctionnement des FPGA.
La LED RVB intégrée en surface de la carte est reliée aux ports P0.6 (Rouge), P2.6 (Vert) et P6.5 (Bleu) d’après la documentation.
Pour illuminer plus ou moins chaque composante rouge, verte ou bleue, il suffit de configurer trois générateurs de signaux PWM et de diriger leur sortie vers nos trois ports. Et là, tout se fait graphiquement et à la souris dans l’onglet TopDesign de l’EDI PSoC Creator (EDI pour Environnement de Design Intégré) :
Design de la configuration
Routage des entrées-sorties
Une horloge (clock) commune 12 MHz est routée vers chaque entrée des générateurs PWM. Tout ce qui est en bleu fait partie du décor pour rendre le schéma plus compréhensif, sans influence sur la configuration du PSoC, l’équivalent des commentaires dans le code…
Si on va dans la configuration des blocs PWM, par exemple pour le rouge :
Configuration PWM
Le champ period est à 255, et on joue avec la luminosité de la couleur en faisant varier le rapport cyclique du PWM avec le paramètre compare (ici à 127 pour un signal carré, voir le chronogramme de la sortie line_n).
compare=0, LED éteinte ; compare=255, LED allumée à la luminosité maximum.
Vous pouvez régler les paramètres dans les boites de dialogue des composants, mais vous pouvez évidemment les faire varier dans le code.
Par exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #include <project.h>
int main()
{
const uint8_t delay = 10; /* tempo en ms */
/* Activation des générateurs PWM */
PWM_Red_Start();
PWM_Green_Start();
PWM_Blue_Start();
/* LED rouge initialement */
PWM_Red_WriteCompare(255);
PWM_Green_WriteCompare(0);
PWM_Blue_WriteCompare(0);
/* Autoriser les interruptions globales */
// CyGlobalIntEnable;
/* Boucle infinie */
for (;;) {
/* initialement, rouge */
for(uint8_t i = 0; i < 255; i++){
PWM_Green_WriteCompare(i); /* + de vert ==> jaune */
CyDelay(delay);
}
for(uint8_t i = 0; i < 255; i++){
PWM_Red_WriteCompare(255 - i); /* - de rouge ==> vert */
CyDelay(delay);
}
for(uint8_t i = 0; i < 255; i++){
PWM_Blue_WriteCompare(i); /* + de bleu ==> cyan */
CyDelay(delay);
}
for(uint8_t i = 0; i < 255; i++){
PWM_Green_WriteCompare(255 - i); /* - de vert ==> bleu */
CyDelay(delay);
}
for(uint8_t i = 0; i < 255; i++){
PWM_Red_WriteCompare(i); /* + de rouge ==> magenta */
CyDelay(delay);
}
for(uint8_t i = 0; i < 255; i++){
PWM_Blue_WriteCompare(255 - i); /* - de bleu ==> rouge */
CyDelay(delay);
}
// CyDelay(2000);
}
} |
Ici, je génère progressivement les couleurs de l’arc-en-ciel : rouge d’abord, puis qui tend vers le jaune, vert, cyan, bleu, magenta, puis le cycle reprend.
Simplissime et élégant. Voyons maintenant comment préparer et configurer notre carte en esclave pour la communication I2C…