Ardu? No!PxGraph ≫ Câblage vrilette d'une Mega

Câblage vrilette d'une Mega

Modifier la bibliothèque

Pour que la bibliothèque adope le câblage "Vrillette" au lieu du câblage "Shield", il faut dé-commenter la ligne contennant "vrillette" dans le fichier PxGraph_?????.cpp. Par exemple si il contient:

// Cette bibliothèque est utilisable:
//#define _ILI9341_Shield_ // Pour un shield pour Uno/Mega avec un ILI9341 (340x200)
#define _ST7781_Shield_ // Pour un shield pour Uno/Mega avec un ST7781 (340x200) 
//#define VRILLETTE // Pour un câblage spécial avec une Mega

il faut metre:

// Cette bibliothèque est utilisable:
//#define _ILI9341_Shield_ // Pour un shield pour Uno/Mega avec un ILI9341 (340x200)
#define _ST7781_Shield_ // Pour un shield pour Uno/Mega avec un ST7781 (340x200) 
#define VRILLETTE // Pour un câblage spécial avec une Mega

Pourquoi ce câblage?

J'ai eu besoin d'enfficher sur un même circuit imprimé une Mega, un afficheur, des drivers pour pas à pas... L'afficheur n'étant plus enfiché directement sur la Mega, je pouvais faire le câblage que je voulais. Pour les fils de contrôle je n'avais pas de raison d'en changer. Par contre pour les fils de données, c'était intéressant de modifier le câblage complètement.

Pour une Uno, les données sont sur 8 bits et proviennent de deux ports, le B et le D:

PD7 | PD6 | PD5 | PD4 | PD3 | PD2 | PB1 | PB0

C'est l'écriture dans l'afficheur qui est le plus utilisé. On a la donnée sur 8 BITS qu'il faut découper pour l'envoyer dans les ports B et D. Il ne faut pas modifier les autres bits des ports. Le port D sert à la carte SD et le port B est utilisé par la voie série. Voici comment envoyer la donnée sur les deux ports:

PORTD = (PORTD & B00000011) | (Donnee & B11111100);
PORTB = (PORTB & B11111100) | (Donnee & B00000011);

Il faut, pour calculer quoi envoyer, 4 opérations ET et deux opérations ET.

Pour une Mega, il y a besoin de trois ports:

 PH4 | PH3 | PE3 | PG5 | PE5 | PE4 | PH6 | PH5 

C'est ici beaucoup plus embêtant car les bits ne sont pas au bon endroit et il faut faire des décalages. Voici comment envoyer la donnée sur les deux ports:

PORTE = (PORTE & B11000111) | ((Donnee>>2) & B00001000) | ((Donnee<<2) & B00110000);
PORTG = (PORTG & B11011111) | ((Donnee<<1) & B00100000);
PORTH = (PORTH & B10000111) | ((Donnee>>3) & B00011000) | ((Donnee<<5) & B01100000);

Il faut 5 décalages, 8 opérations ET ainsi que 5 opérations OU.

Sur la Mega, j'ai choisi d'utiliser le portK pour passer les données. Bien sûr on ne peut plus simplement enficher le shield. Pour envoyer la donnée, il suffit de faire:

PORTK = Donnee

C'est beaucoup plus rapide!.

Et si on veut un shield?

Si on veut mettre l'afficheur enfiché sur la Mega, c'est possible en faisant des pontages. Comme on n'utilisera pas les broches de données "Shield", elles seront en INPUT, c'est à dire en haute impédance, et on n'a pas besoin de s'en soucier.

Pontage avec une Mega

Performances

Voici le programme de test que j'ai choisi. Il dessine à l'écarn 100 pavés de 320x240.

#include <PxGraph_ILI9341_Shield.h>

unsigned long depart;

void setup()
{
  Serial.begin(115200); // Mettre aussi la console à 115200 bauds
  setGraphMode(PAYSAGE); // Initialisation de l'écran
  depart=millis(); // Instant de départ
  for (word boucle = 0; boucle < 100; boucle++)
     fillRect(0,0,MAX_X,MAX_Y,boucle); // Dessin de 100 écrans de différentes couleur
  Serial.println(millis() - depart);
}
  
void loop()
{
}

Les temps mesurés sont :
Uno: 24s
Mega: 55s
Mega + vrillette: 17s