IMA4 2018/2019 EC1 : Différence entre versions
(→Description du projet) |
(→Travail effectué) |
||
(32 révisions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 18 : | Ligne 18 : | ||
La communication entre la partie "contrôle" et les deux autres parties s'effectue via un bus SPI. Les trois parties sont conçues et réalisées séparément mais doivent s'interconnecter facilement. Les 3 PCB sont rectangulaires et doivent s'assembler aussi sous la forme d'un rectangle. Pour passer les lignes SPI et l'alimentation, des connecteurs doivent être prévus sur les 3 PCB. Vous commencerez par vous mettre d'accord sur les dimensions des PCB et sur l'emplacement des connecteurs. Une première phase de conception des PCB avec placement des composants peut être nécessaire pour cette étape. | La communication entre la partie "contrôle" et les deux autres parties s'effectue via un bus SPI. Les trois parties sont conçues et réalisées séparément mais doivent s'interconnecter facilement. Les 3 PCB sont rectangulaires et doivent s'assembler aussi sous la forme d'un rectangle. Pour passer les lignes SPI et l'alimentation, des connecteurs doivent être prévus sur les 3 PCB. Vous commencerez par vous mettre d'accord sur les dimensions des PCB et sur l'emplacement des connecteurs. Une première phase de conception des PCB avec placement des composants peut être nécessaire pour cette étape. | ||
− | Vous êtes | + | Vous êtes chargé de réaliser la partie contrôle. Vous trouverez, sur les Wiki IMA, de nombreux exemples de cartes avec ATMega328p et FT232. Partez de l'un de ces exemples. Utilisez le logiciel Fritzing pour la conception de la carte. N'oubliez pas le connecteur ICSP pour la première programmation du micro-contrôleur. |
Une fois la carte fonctionnelle vous adapterez l'ordonnanceur réalisé en TP pour utiliser deux périphériques SPI plutôt qu'un seul. Il est évident qu'un processus utilisant un périphérique SPI ne peut pas prendre le contrôle du bus tant qu'un autre s'en sert. | Une fois la carte fonctionnelle vous adapterez l'ordonnanceur réalisé en TP pour utiliser deux périphériques SPI plutôt qu'un seul. Il est évident qu'un processus utilisant un périphérique SPI ne peut pas prendre le contrôle du bus tant qu'un autre s'en sert. | ||
Ligne 26 : | Ligne 26 : | ||
{| class="wikitable" | {| class="wikitable" | ||
! Description !! Fabricant !! Référence Fabricant !! Fournisseur !! Quantité !! Lien fournisseur | ! Description !! Fabricant !! Référence Fabricant !! Fournisseur !! Quantité !! Lien fournisseur | ||
+ | |- | ||
+ | |Atmega328p | ||
+ | |Microchip Technology | ||
+ | |ATMEGA328P-AN | ||
+ | |RS-Online | ||
+ | |1 | ||
+ | |[https://fr.rs-online.com/web/p/microcontroleurs/1310270/ Atmega328p] | ||
+ | |- | ||
+ | |FT232 | ||
+ | |FTDI chip | ||
+ | |FT232RL-REEL | ||
+ | |Farnell | ||
+ | |1 | ||
+ | |[https://fr.farnell.com/ftdi/ft232rl-reel/usb-vers-uart-ssop28-232/dp/1146032/ FT232] | ||
+ | |- | ||
+ | |Condensateurs 100 nF CMS | ||
+ | |KEMET | ||
+ | |C0603C104K9RACTU | ||
+ | |RS-Online | ||
+ | |5 | ||
+ | |[https://fr.rs-online.com/web/p/condensateurs-ceramique-multicouche/1806419/ Condensateurs 100 nF] | ||
+ | |- | ||
+ | |Condensateurs 22 pF CMS | ||
+ | |KEMET | ||
+ | |C1206C220J5GACTU | ||
+ | |RS-Online | ||
+ | |2 | ||
+ | |[https://fr.rs-online.com/web/p/condensateurs-ceramique-multicouche/2644040/ Condensateurs 22pF] | ||
+ | |- | ||
+ | |Résistance 10 kOhms CMS | ||
+ | |Panasonic | ||
+ | |ERA3AEB103V | ||
+ | |RS-Online | ||
+ | |3 | ||
+ | |[https://fr.rs-online.com/web/p/resistances-cms/7419789/ Résistance 10 kOhms] | ||
+ | |- | ||
+ | |Résistance 1 MOhms CMS | ||
+ | |Panasonic | ||
+ | |ERJ3EKF1004V | ||
+ | |RS-Online | ||
+ | |1 | ||
+ | |[https://fr.rs-online.com/web/p/resistances-cms/1051157/ 1 Résistance MOhms] | ||
+ | |- | ||
+ | |Résistance 1 kOhms CMS | ||
+ | |RS PRO | ||
+ | | | ||
+ | |RS-Online | ||
+ | |2 | ||
+ | |[https://fr.rs-online.com/web/p/resistances-cms/7134141/ 1 Résistance kOhms] | ||
+ | |- | ||
+ | |Résistance 220 Ohms CMS | ||
+ | |Panasonic | ||
+ | |ERA8AEB221V | ||
+ | |RS-Online | ||
+ | |4 | ||
+ | |[https://fr.rs-online.com/web/p/resistances-cms/6696528/ Résistance 220 Ohms] | ||
+ | |- | ||
+ | |LED CMS boitier 0603 | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | |5 | ||
+ | | | ||
+ | |- | ||
+ | |Bouton poussoir | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | |2 | ||
+ | | | ||
+ | |- | ||
+ | |Quartz | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | |1 | ||
+ | | | ||
+ | |- | ||
+ | |Connecteur ICSP | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | |1 | ||
+ | | | ||
+ | |- | ||
+ | |Connecteur Femelle 6 ports | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | |2 | ||
+ | | | ||
|- | |- | ||
|} | |} | ||
Ligne 32 : | Ligne 123 : | ||
== Travail effectué == | == Travail effectué == | ||
+ | Mon travail se positionne autour de la partie contrôle de l'ensemble de la carte finale attendue. Cette partie devra permettre une communication avec les deux autres parties (Matrice LEDs et Afficheurs 7-Segments) via un unique bus spi. | ||
+ | |||
+ | En vue de cette réalisation, l'ensemble du travail s'axera autour de deux grandes parties : la conception de la carte et sa programmation. | ||
+ | |||
+ | ''' PARTIE CONCEPTION ''' | ||
+ | |||
+ | Avec le logiciel de conception Fritzing, Il a fallut réaliser dans un premier temps le schéma complet de notre carte. Elle est composée essentiellement d'un Atmega328p; d'un module FTDI (FT232) relié à un connecteur USB afin de servir à la fois de biais d'alimentation et de port de programmation; de deux boutons poussoirs; de quelques LEDs, résistances et condensateurs pour le bon fonctionnement de la carte. | ||
+ | |||
+ | De plus, afin de dialoguer plus aisément avec les deux autres parties, il nous a fallut un connecteur ICSP auquel deux autres connecteurs de type femelle 6 ports étaient reliés. Ces derniers fournissaient les différentes liaisons nécessaires à la communication SPI. | ||
+ | |||
+ | À la différence de la partie contrôle, les deux autres parties serviront de périphériques esclaves. Ayant toutes les deux leur comportement propre et devant se partager le bus SPI, il faut en tenir compte et intégrer l'usage de deux sélecteurs de périphérique esclaves (CS1 et CS2) sur ma carte. | ||
+ | |||
+ | L'image suivante illustre les connections qui s’opéreront. | ||
+ | |||
+ | [[Fichier:Spi_ec.png|400px|thumb|center|Liaison SPI]] | ||
+ | |||
+ | Notons cependant que la ligne MISO, ici, nous est complètement inutile, car nous n'avons pas besoin de recevoir des données en provenance des périphériques esclaves. | ||
+ | |||
+ | |||
+ | Nous avons donc obtenu le schéma suivant : | ||
+ | |||
+ | [[Fichier:Ec1_schema.png|400px|thumb|center|Schematic]] | ||
+ | |||
+ | |||
+ | Le schéma étant terminé et validé, il a donné lieu à un circuit imprimé dont le routage proposé par M. Redon suivant : | ||
+ | |||
+ | [[Fichier:Ec1_pcb1.png|300px|thumb|center|Circuit routé]] | ||
+ | |||
+ | |||
+ | La carte regroupant les trois parties a été imprimée et j'en ai reçu un exemplaire afin de souder les composants de ma partie. L'Atméga328p ainsi que le FTDI ont été soudés au préalable par M. Redon et il m'a fourni les composants restants à souder. | ||
+ | |||
+ | Après plusieurs soudures plus ou moins bien réalisées et des corrections suivies directement par des tests, nous avons obtenus une carte complètement fonctionnelle : | ||
+ | |||
+ | |||
+ | [[Fichier:Ec1_carte.jpg|400px|thumb|center|Carte]] | ||
+ | |||
+ | |||
+ | Cette partie étant terminée, il a fallut passer maintenant à l'implantation du code. | ||
+ | |||
+ | ''' PARTIE PROGRAMMATION ''' | ||
+ | |||
+ | Le but de cette dernière partie est de réussir à réaliser une communication SPI dont le bus est partagée par deux périphériques. Il faudra donc gérer ce partage afin d'envoyer les données nécessaires aux deux périphériques pour qu'ils puissent les exploiter. | ||
+ | |||
+ | Pour cela, je dois programmer ma carte en mode Maître. Il m'a été suggéré de réutiliser le code du TP d'ordonnancement et de le modifier pour notre application. Et pour tester plus rapidement mon programme, j'ai reçu une matrice à LEDs RGB avec quatre afficheurs 7 segments de Sparkfun. | ||
+ | |||
+ | J'ai adapté le code au fonctionnement de ma carte. Il me fallait rajouter rajouter la ligne SPI de sélection des afficheurs 7-segments qui se trouvait au pin 7 du portD : | ||
+ | |||
+ | #define CS_AFFICHEURS 7 | ||
+ | |||
+ | L'initialisation des afficheurs se fait comme celle de la matrice en veillant à ne pas se tromper de port. | ||
+ | |||
+ | void init_afficheurs(void) | ||
+ | { | ||
+ | DDRD |= (1<<CS_AFFICHEURS); | ||
+ | DDRB |= (1<<MOSI)|(1<<SCK); | ||
+ | SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);} | ||
+ | |||
+ | Puis il a fallut une fonction nécessaire à l'envoi de données aux afficheurs. Celle-ci prend en paramètre l'ensemble des données à envoyer aux afficheurs. | ||
+ | |||
+ | |||
+ | void write_led_numbers(uint8_t* tab) | ||
+ | { | ||
+ | cbi(PORTD, CS_AFFICHEURS); //active la ligne de selection des afficheurs en état Low | ||
+ | _delay_ms(1); | ||
+ | int i; | ||
+ | for(i=0; i<4; i++){ | ||
+ | spi_exch(tab[i]);//envoi des données aux afficheurs | ||
+ | } | ||
+ | _delay_ms(1); | ||
+ | sbi(PORTD, CS_AFFICHEURS); //relache la ligne de selection en la remettant en état high | ||
+ | _delay_ms(100); | ||
+ | } | ||
+ | |||
+ | Après avoir testé le code complet, la matrice recevait parfaitement les données et affichait les messages que nous lui envoyions. | ||
+ | |||
+ | Les afficheurs en revanche n'affichaient pas les valeurs attendues. | ||
+ | |||
+ | Au final, les deux périphériques ne se partageaient pas correctement le Bus SPI, en particulier les afficheurs 7-segments qui ne recevaient pas de données via le bus. | ||
+ | |||
+ | <include iframe width="560" height="315" src="https://www.youtube.com/embed/emBLtAz-L1g" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></include> | ||
== Documents == | == Documents == | ||
+ | |||
+ | Les codes sont disponibles dans le fichier suivant : | ||
+ | [[Fichier:Ordo_EC1.zip|center|1000px|thumb|Code]] |
Version actuelle datée du 6 avril 2019 à 21:53
Sommaire
Présentation du projet
Contexte
L'élève continue son semestre S8 à l'école.
Objectif
Le but est de concevoir une partie d'une platine de travaux pratiques pour l'ordonnancement. Il faut aussi programmer le micro-contrôleur intégré.
Description du projet
La platine sera constituée de 3 parties bien distinctes :
- la partie "contrôle" composée d'un ATMega328p, d'un FT232, d'un connecteur USB, de deux LED et de deux boutons, l'ordonnanceur doit être chargé sur ce micro-contrôleur ;
- la partie matrice de LED, il s'agit d'une matrice de 8x8 LED CMS monochromes contrôlées par un ATMega328p et 3 pilotes de LED TLC5947 ;
- la partie afficheur 7-segments, il s'agit de 6 afficheurs 7-segments implantés avec des LED CMS monochromes et contrôlés par un ATMega328p et 2 pilotes de LED TLC5947.
La communication entre la partie "contrôle" et les deux autres parties s'effectue via un bus SPI. Les trois parties sont conçues et réalisées séparément mais doivent s'interconnecter facilement. Les 3 PCB sont rectangulaires et doivent s'assembler aussi sous la forme d'un rectangle. Pour passer les lignes SPI et l'alimentation, des connecteurs doivent être prévus sur les 3 PCB. Vous commencerez par vous mettre d'accord sur les dimensions des PCB et sur l'emplacement des connecteurs. Une première phase de conception des PCB avec placement des composants peut être nécessaire pour cette étape.
Vous êtes chargé de réaliser la partie contrôle. Vous trouverez, sur les Wiki IMA, de nombreux exemples de cartes avec ATMega328p et FT232. Partez de l'un de ces exemples. Utilisez le logiciel Fritzing pour la conception de la carte. N'oubliez pas le connecteur ICSP pour la première programmation du micro-contrôleur.
Une fois la carte fonctionnelle vous adapterez l'ordonnanceur réalisé en TP pour utiliser deux périphériques SPI plutôt qu'un seul. Il est évident qu'un processus utilisant un périphérique SPI ne peut pas prendre le contrôle du bus tant qu'un autre s'en sert.
Matériel nécessaire
Description | Fabricant | Référence Fabricant | Fournisseur | Quantité | Lien fournisseur |
---|---|---|---|---|---|
Atmega328p | Microchip Technology | ATMEGA328P-AN | RS-Online | 1 | Atmega328p |
FT232 | FTDI chip | FT232RL-REEL | Farnell | 1 | FT232 |
Condensateurs 100 nF CMS | KEMET | C0603C104K9RACTU | RS-Online | 5 | Condensateurs 100 nF |
Condensateurs 22 pF CMS | KEMET | C1206C220J5GACTU | RS-Online | 2 | Condensateurs 22pF |
Résistance 10 kOhms CMS | Panasonic | ERA3AEB103V | RS-Online | 3 | Résistance 10 kOhms |
Résistance 1 MOhms CMS | Panasonic | ERJ3EKF1004V | RS-Online | 1 | 1 Résistance MOhms |
Résistance 1 kOhms CMS | RS PRO | RS-Online | 2 | 1 Résistance kOhms | |
Résistance 220 Ohms CMS | Panasonic | ERA8AEB221V | RS-Online | 4 | Résistance 220 Ohms |
LED CMS boitier 0603 | 5 | ||||
Bouton poussoir | 2 | ||||
Quartz | 1 | ||||
Connecteur ICSP | 1 | ||||
Connecteur Femelle 6 ports | 2 |
Planning prévisionnel
Travail effectué
Mon travail se positionne autour de la partie contrôle de l'ensemble de la carte finale attendue. Cette partie devra permettre une communication avec les deux autres parties (Matrice LEDs et Afficheurs 7-Segments) via un unique bus spi.
En vue de cette réalisation, l'ensemble du travail s'axera autour de deux grandes parties : la conception de la carte et sa programmation.
PARTIE CONCEPTION
Avec le logiciel de conception Fritzing, Il a fallut réaliser dans un premier temps le schéma complet de notre carte. Elle est composée essentiellement d'un Atmega328p; d'un module FTDI (FT232) relié à un connecteur USB afin de servir à la fois de biais d'alimentation et de port de programmation; de deux boutons poussoirs; de quelques LEDs, résistances et condensateurs pour le bon fonctionnement de la carte.
De plus, afin de dialoguer plus aisément avec les deux autres parties, il nous a fallut un connecteur ICSP auquel deux autres connecteurs de type femelle 6 ports étaient reliés. Ces derniers fournissaient les différentes liaisons nécessaires à la communication SPI.
À la différence de la partie contrôle, les deux autres parties serviront de périphériques esclaves. Ayant toutes les deux leur comportement propre et devant se partager le bus SPI, il faut en tenir compte et intégrer l'usage de deux sélecteurs de périphérique esclaves (CS1 et CS2) sur ma carte.
L'image suivante illustre les connections qui s’opéreront.
Notons cependant que la ligne MISO, ici, nous est complètement inutile, car nous n'avons pas besoin de recevoir des données en provenance des périphériques esclaves.
Nous avons donc obtenu le schéma suivant :
Le schéma étant terminé et validé, il a donné lieu à un circuit imprimé dont le routage proposé par M. Redon suivant :
La carte regroupant les trois parties a été imprimée et j'en ai reçu un exemplaire afin de souder les composants de ma partie. L'Atméga328p ainsi que le FTDI ont été soudés au préalable par M. Redon et il m'a fourni les composants restants à souder.
Après plusieurs soudures plus ou moins bien réalisées et des corrections suivies directement par des tests, nous avons obtenus une carte complètement fonctionnelle :
Cette partie étant terminée, il a fallut passer maintenant à l'implantation du code.
PARTIE PROGRAMMATION
Le but de cette dernière partie est de réussir à réaliser une communication SPI dont le bus est partagée par deux périphériques. Il faudra donc gérer ce partage afin d'envoyer les données nécessaires aux deux périphériques pour qu'ils puissent les exploiter.
Pour cela, je dois programmer ma carte en mode Maître. Il m'a été suggéré de réutiliser le code du TP d'ordonnancement et de le modifier pour notre application. Et pour tester plus rapidement mon programme, j'ai reçu une matrice à LEDs RGB avec quatre afficheurs 7 segments de Sparkfun.
J'ai adapté le code au fonctionnement de ma carte. Il me fallait rajouter rajouter la ligne SPI de sélection des afficheurs 7-segments qui se trouvait au pin 7 du portD :
#define CS_AFFICHEURS 7
L'initialisation des afficheurs se fait comme celle de la matrice en veillant à ne pas se tromper de port.
void init_afficheurs(void) { DDRD |= (1<<CS_AFFICHEURS); DDRB |= (1<<MOSI)|(1<<SCK); SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);}
Puis il a fallut une fonction nécessaire à l'envoi de données aux afficheurs. Celle-ci prend en paramètre l'ensemble des données à envoyer aux afficheurs.
void write_led_numbers(uint8_t* tab) { cbi(PORTD, CS_AFFICHEURS); //active la ligne de selection des afficheurs en état Low _delay_ms(1); int i; for(i=0; i<4; i++){ spi_exch(tab[i]);//envoi des données aux afficheurs } _delay_ms(1); sbi(PORTD, CS_AFFICHEURS); //relache la ligne de selection en la remettant en état high _delay_ms(100);
}
Après avoir testé le code complet, la matrice recevait parfaitement les données et affichait les messages que nous lui envoyions.
Les afficheurs en revanche n'affichaient pas les valeurs attendues.
Au final, les deux périphériques ne se partageaient pas correctement le Bus SPI, en particulier les afficheurs 7-segments qui ne recevaient pas de données via le bus.
Documents
Les codes sont disponibles dans le fichier suivant : Fichier:Ordo EC1.zip