Modification E/S Ecran TFT

Bonjour je souhaite savoir s'il est possible de changer l'affectation des broches D0 à D7 sur cet écran http://www.adafruit.com/products/335 car pas très pratique pour mon projet. Je pense que cela est possible en modifiant la librairie "pin_magic.h" https://github.com/adafruit/TFTLCD-Library mais c'est trop compliqué pour moi... :( La librairie fournie permet de connecter les broches D0 à D7 sur broches de 22 à 29 (méga) or j'aimerais pouvoir déplacer ces connections.

Si quelqu'un de compétent veux bien m'aider je prends MDR Merci d'avance

Bonjour,

Donc tu est sur une mega2560 et tu voudrais changer le pinmaping dans la librairie ?
C’est pas très compliqué (enfin si un tout petit peu) :wink:

Regarde ici : TFTLCD-Library/pin_magic.h at master · adafruit/TFTLCD-Library · GitHub
Lignes 111 à 118 :

  #define RD_PORT PORTF
  #define WR_PORT PORTF
  #define CD_PORT PORTF
  #define CS_PORT PORTF
  #define RD_MASK B00000001
  #define WR_MASK B00000010
  #define CD_MASK B00000100
  #define CS_MASK B00001000

Chaque broches de “contrôles” de l’écran est défini ici par un couple port + masque binaire.

Pour les broches D0~D7 c’est aux lignes 120 à 131 :

  #define write8inline(d) { \
   PORTH = (PORTH & B10000111)|(((d) & B11000000)>>3)|(((d) & B00000011)<<5); \
   PORTB = (PORTB & B01001111)|(((d) & B00101100)<<2); \
   PORTG = (PORTG & B11011111)|(((d) & B00010000)<<1); \
   WR_STROBE; }

  #define read8inline() (RD_STROBE, \
   ((PINH & B00011000) << 3) | ((PINB & B10110000) >> 2) | \
   ((PING & B00100000) >> 1) | ((PINH & B01100000) >> 5))
  #define setWriteDirInline() { \
   DDRH |=  B01111000; DDRB |=  B10110000; DDRG |=  B00100000; }
  #define setReadDirInline() { \
   DDRH &= ~B01111000; DDRB &= ~B10110000; DDRG &= ~B00100000; }

Tout ceci c’est de la manipulation de port et du bitwise.
Pour modifier cela tu as besoin de ces trois liens et d’un (gros) cachet d’aspirine :wink:
http://www.arduino.cc/en/Reference/PortManipulation
http://arduino.cc/en/Hacking/PinMapping2560

Si tu t’en sort pas donne moi les numéros de broches “arduino” qui t’intéresse et je te donnerai un coup de main :wink:

Je ne suis pas sûr qu'un seul cachet d'aspirine soit suffisant.... :disappointed_relieved: :disappointed_relieved: Je viens de lire le tuto "bitwise" et je n'y comprends pas grand chose...

Sinon pour les broches voici ce qui pourrait me convenir:

D0 broche 22 (PA0) D1 broche 36 (PC1) D2 broche 24 (PA2) D3 broche 34 (PC3) D4 broche 26 (PA4) D5 broche 32 (PC5) D6 broche 28 (PA6) D7 broche 30 (PC7)

Sinon je veux bien que tu me donnes un petit coup de pouce.

Ben du coup ça m'arrange ton agencement PAx/PCx une fois sur deux 8)

Voila :

  #define write8inline(d) { \
   PORTC = (PORTC & B01010101) | ((d) & B10101010); \
   PORTA = (PORTA & B10101010) | ((d) & B01010101); \
   WR_STROBE; }

  #define read8inline() (RD_STROBE, \
   (PINC & B10101010) | (PINA & B01010101))
   
  #define setWriteDirInline() { \
   DDRC |= B10101010; DDRA |= B01010101; }
   
  #define setReadDirInline() { \
   DDRC &= ~B10101010; DDRA &= ~B01010101; }

A tester mais ça devrait le faire ;)

juste au cas ou je serais em......der avec réalisant mon pcb ( en espérant ne pas trop abuser ) peux tu me donner la même chose en configurant comme suit:

D0 broche 36 (PC1) D1 broche 34 (PC3) D2 broche 32 (PC5) D3 broche 30 (PC7) D4 broche 28 (PA6) D5 broche 26 (PA4) D6 broche 24 (PA2) D7 broche 22 (PA0)

Merci d'avance

Tient :

  #define write8inline(d) { \
   PORTC = (PORTC & B01010101) | (((d) & 1) << 1) | (((d) & 2) << 2) | (((d) & 4) << 3) | (((d) & 8) << 4); \
   PORTA = (PORTA & B10101010) | (((d) & 16) << 2) | (((d) & 32) >> 1) | (((d) & 64) >> 4) | (((d) & 128) >> 7); \
   WR_STROBE; }

  #define read8inline() (RD_STROBE, \
   ((PINC & 2) >> 1) | ((PINC & 8) >> 2) | ((PINC & 32) >> 3) | ((PINC & 128) >> 4) | \
   ((PINA & 64) >> 2) | ((PINA & 16) << 1) | ((PINA & 4) << 4) | ((PINA & 1) << 7))
   
  #define setWriteDirInline() { \
   DDRC |= B10101010; DDRA |= B01010101; }
   
  #define setReadDirInline() { \
   DDRC &= ~B10101010; DDRA &= ~B01010101; }

Normalement c’est bon (sauf si je me suis embrouillé dans mes calculs bien sûr :grin:)

MERCI dès que je reçoit mon écran je test et te tiens au courant si ça fonctionne.

Bon après un essai avec les 2 codes aucuns des 2 ne fonctionne =( =( sinon pour la position définitive des broches DO 22 D1 24 D2 26 D3 28 D4 30 D5 32 D6 34 D7 36

rico37350: Bon après un essai avec les 2 codes aucuns des 2 ne fonctionne =( =(

Haaa :. j'avais pourtant vérifié mes calculs :zipper_mouth_face: Ça marche pas du tout ou ça fait des trucs bizarres sur l'afficheur ? Tu as de quoi tester les sorties (analyseurs logique ou oscilloscope) ?

rico37350: sinon pour la position définitive des broches DO 22 D1 24 D2 26 D3 28 D4 30 D5 32 D6 34 D7 36

C'est l'inverse de l'autre version en gros ... la galère ... Tu peut me donner les correspondances broches / ports (la flemme de chercher :grin:) ?

Quelque soit le code l'afficheur reste vierge rien n'est affiché dessus or configuration initiale D0~D7 >> 22~29. Sinon à par un multimètre rien d'autre pour tester.

D0 broche 22 (PA0) D1 broche 24 (PA2) D2 broche 26 (PA4) D3 broche 28 (PA6) D4 broche 30 (PC7) D5 broche 32 (PC5) D6 broche 34 (PC3) D7 broche 36 (PC1)

Essaye ça mais si ça marche pas je saurait pas te dire pourquoi :~

  #define write8inline(d) { \
   PORTA = (PORTA & B10101010) | ((d) & 1) | (((d) & 2) << 1) | (((d) & 4) << 2) | (((d) & 8) << 3); \
   PORTC = (PORTC & B01010101) | (((d) & 16) << 3) | ((d) & 32) | (((d) & 64) >> 3) | (((d) & 128) >> 6); \
   WR_STROBE; }

  #define read8inline() (RD_STROBE, \
   (PINA & 1) | ((PINA & 2) >> 1) | ((PINA & 4) >> 2) | ((PINA & 8) >> 3)) | \
   ((PINC & 16) >> 3) | (PINC & 32) | ((PINC & 64) << 3) | ((PINC & 128) << 6)
   
  #define setWriteDirInline() { \
   DDRC |= B10101010; DDRA |= B01010101; }
   
  #define setReadDirInline() { \
   DDRC &= ~B10101010; DDRA &= ~B01010101; }

Ne fonctionne pas non plus =( =( =( je vais devoir donc trouver une autre solution afin de modifier mon pcb =( Merci quand même de ton aide.

rico37350:
Ne fonctionne pas non plus =( =( =( je vais devoir donc trouver une autre solution afin de modifier mon pcb =(
Merci quand même de ton aide.

Keep calm, on est peut être passé à côté de quelque chose.

Quelles broches utilises tu pour les lignes RD/WR/CD/CS ?

Essaye aussi cette version modifié pin_magic.h en pièce jointe.

pin_magic.h (4.59 KB)

Pour ce qui est du câblage des broches:

define LCD_RD A0 // LCD Read goes to Analog 0

define LCD_WR A1 // LCD Write goes to Analog 1

define LCD_CD A2 // Command/Data goes to Analog 2

define LCD_CS A3 // Chip Select goes to Analog 3

sinon ta version modifiée ne marche pas non plus...

rico37350:

define LCD_RD A0 // LCD Read goes to Analog 0

define LCD_WR A1 // LCD Write goes to Analog 1

define LCD_CD A2 // Command/Data goes to Analog 2

define LCD_CS A3 // Chip Select goes to Analog 3

Pourquoi tu fait des define pour ça ? C'est dans le fichier pin_magic.h que tu choisis ces broches ... Bref, c'est bien PF0/1/2/3 donc normalement ça devrait marcher ...

rico37350: sinon ta version modifiée ne marche pas non plus...

Elle compile ? Tu est sûr du bon fonctionnement de ton code (qu'on cherche pas un bug dans la librairie alors que c'est ton code qui plante) ? Tu est sûr de ton câblage ?

Bon sinon met une led sur RD/WR/CD/CS pour voir si il y a de l'activité, l'idéal ce serait un coup d'analyseur logique mais si tu en a pas tant pis.

#define LCD_RD    A0 // LCD Read goes to Analog 0
#define LCD_WR    A1 // LCD Write goes to Analog 1
#define LCD_CD    A2 // Command/Data goes to Analog 2
#define LCD_CS    A3 // Chip Select goes to Analog 3
#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

Suis obliger de définir pour initialiser l'écran " Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);"

Sinon aucun soucis de compilation du code.

Aucuns problèmes de fonctionnements si j'utilise les broches D0~D7 >> 22~29 avec les librairies non modifiées

rico37350: Suis obliger de définir pour initialiser l'écran " Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);"

Test avec juste "Adafruit_TFTLCD tft;", ça devrait rien changer puisque que sans le #define toute la partie registre est supprimé.

Le seul truc que je vois qui peut poser problème c'est le reset sur D5 par défaut. https://github.com/adafruit/TFTLCD-Library/blob/master/Adafruit_TFTLCD.cpp ligne 308

Si je retire les #define et que je mets juste “Adafruit_TFTLCD tft;” j’ai plus rien qui s’affiche…MDR

Moi ce qui me chagrine c’est l’assignation des broches dans la librairies pin_magic.h

#define write8inline(d) { \
   PORTH = (PORTH & B10000111)|(((d) & B11000000)>>3)|(((d) & B00000011)<<5); \
   PORTB = (PORTB & B01001111)|(((d) & B00101100)<<2); \
   PORTG = (PORTG & B11011111)|(((d) & B00010000)<<1); \
   WR_STROBE; }
  #define read8inline() (RD_STROBE, \
   ((PINH & B00011000) << 3) | ((PINB & B10110000) >> 2) | \
   ((PING & B00100000) >> 1) | ((PINH & B01100000) >> 5))
  #define setWriteDirInline() { \
   DDRH |= B01111000; DDRB |= B10110000; DDRG |= B00100000; }
  #define setReadDirInline() { \
   DDRH &= ~B01111000; DDRB &= ~B10110000; DDRG &= ~B00100000; }

alors que :
D0 = PA0, D1 = PA1, D2 = PA2, D3 = PA3, D4 = PA4, D5 = PA5, D6 = PA6, D7 = PA7 et que PAx est défini comme PORTH, PORTB, PORTG …??

La je comprends pas … !!!

rico37350:
Si je retire les #define et que je mets juste “Adafruit_TFTLCD tft;” j’ai plus rien qui s’affiche…MDR

Il faut que USE_ADAFRUIT_SHIELD_PINOUT soit défini dans le .h principal.
Pour le constructeur utilise celui sans argument.

rico37350:
Moi ce qui me chagrine c’est l’assignation des broches dans la librairies pin_magic.h
(…)
alors que :
D0 = PA0, D1 = PA1, D2 = PA2, D3 = PA3, D4 = PA4, D5 = PA5, D6 = PA6, D7 = PA7 et que PAx est défini comme PORTH, PORTB, PORTG …??

Heu … j’ai oublié de copié/collé le morceau qui va bien :sweat_smile:
Nouveau fichier en pièce jointe.

pin_magic.h (4.62 KB)

Ne marche pas MDR mais viens de voir un truc dans ton pin_magic.h

#define write8inline(d) { \
   PORTA = (PORTA & B10101010) | ((d) & 1) | (((d) & 2) << 1) | (((d) & 4) << 2) | (((d) & 8) << 3); \
   PORTC = (PORTC & B01010101) | (((d) & 16) << 3) | ((d) & 32) | (((d) & 64) >> 3) | (((d) & 128) >> 6); \
   WR_STROBE; }

  #define read8inline() (RD_STROBE, \
   (PINA & 1) | ((PINA & 2) >> 1) | ((PINA & 4) >> 2) | ((PINA & 8) >> 3)) | \
   ((PINC & 16) >> 3) | (PINC & 32) | ((PINC & 64) << 3) | ((PINC & 128) << 6)

Pas bon car tu as inversé les 2 ports

PORTA = (PORTA & B10101010) PORTA = (PORTA & B01010101) PA0, PA2, PA4, PA6 (D0, D1, D2, D3)
PORTC = (PORTC & B01010101) PORTA = (PORTC & B10101010) PC7, PC5, PC3, PC2 (D4, D5, D6, D7)

donc:

 #define write8inline(d) { \
  PORTA = (PORTA & B01010101) | (((d) & B01000000) >> 3) | (((d) & B00010000) >> 2)
  | (((d) & B00000100) >> 1) | ((d ) & B00000001) ; \
  PORTC = (PORTC & B10101010) | (((d) & B10000000) >> 3) | ((d) & B00100000) |
  (((d) & B00001000) << 3) | (((d) & B0000010) << 5) ; \
  WR_STROBE; }

 #define read8inline() (RD_STROBE, \
  (((d) & B00001000) << 3) | (((d) & B00000100) << 2)  | (((d) & B00000010) << 1) | ((d ) & B00000001) ; \
  (((d) & B00010000) << 3) | ((d) & B00100000) |  (((d) & B01000000) >> 3) | (((d) & B1000000) >> 5)
  
  #define setWriteDirInline() { \
   DDRC |= B10101010; DDRA |= B01010101; }
   
  #define setReadDirInline() { \
   DDRC &= ~B10101010; DDRA &= ~B01010101; }