IMA4 2018/2019 EC1 : Différence entre versions

De Wiki d'activités IMA
(Travail effectué)
(Travail effectué)
 
(19 révisions intermédiaires par le même utilisateur non affichées)
Ligne 137 : Ligne 137 :
 
L'image suivante illustre les connections qui s’opéreront.
 
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é]]
  
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.
+
 
 +
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

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.

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 :

Schematic


Le schéma étant terminé et validé, il a donné lieu à un circuit imprimé dont le routage proposé par M. Redon suivant :

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 :


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.

Documents

Les codes sont disponibles dans le fichier suivant : Fichier:Ordo EC1.zip