Go Down

Topic: Rimappaggio pin UTFT per 1284p (Read 928 times) previous topic - next topic

2aza

Salve a tutti, possiedo un 1284p "bobuino" e un TFT 7" 16bit a interfaccia parallela che utilizzo con la libreria UTFT, adesso ho necessità di utilizzare una scheda SD ma i pin MOSI, MISO e SCK sono occupati dal suddetto TFT. Nello specifico ho bisogno di spostare questi pin che si trovano attualmente alle posizioni PB5/6/7 nelle posizioni PD4/7 e PA5. Purtroppo non so come procedere poiché nella libreria avviene una manipolazione diretta delle porte logiche, qualcuno sa come aiutarmi?

Code: [Select]
void UTFT::LCD_Writ_Bus(char VH,char VL, byte mode)
{   
switch (mode)
{

case 16:
cport (PORTD, 0x90);
sport (PORTD, (VH & 0x0F) | ((VL & 0x03)<<5));
PORTB = ((VH & 0xF0)>>4) | ((VL & 0x3C)<<2);
cport (PORTA, 0x3F);
sport (PORTA, ((VL & 0x40)<<1) | ((VL & 0x80)>>1));
pulse_low(P_WR, B_WR);
break;

case LATCHED_16:
cport (PORTD, 0xF0);
sport (PORTD, (VH & 0x0F));
cport (PORTB, 0xF0);
sport (PORTB, (VH & 0xF0)>>4);
cbi(P_ALE, B_ALE);
pulse_high(P_ALE, B_ALE);
cbi(P_CS, B_CS);
cport (PORTD, 0xF0);
sport (PORTD, (VL & 0x0F));
cport (PORTB, 0xF0);
sport (PORTB, (VL & 0xF0)>>4);
pulse_low(P_WR, B_WR);
sbi(P_CS, B_CS);
break;
}
}

void UTFT::_set_direction_registers(byte mode)
{


DDRB =  0xFF;
DDRD |= 0x6F;
DDRA |= 0xC0;


}

void UTFT::_fast_fill_16(int ch, int cl, long pix)
{
long blocks;

cport (PORTD, 0x90);
sport (PORTD, (ch & 0x0F) | ((cl & 0x03)<<5));
PORTB = ((ch & 0xF0)>>4) | ((cl & 0x3C)<<2);
cport (PORTA, 0x3F);
sport (PORTA, ((cl & 0x40)<<1) | ((cl & 0x80)>>1));

blocks = pix/16;
for (int i=0; i<blocks; i++)
{
pulse_low(P_WR, B_WR);
pulse_low(P_WR, B_WR);
pulse_low(P_WR, B_WR);
pulse_low(P_WR, B_WR);
pulse_low(P_WR, B_WR);
pulse_low(P_WR, B_WR);
pulse_low(P_WR, B_WR);
pulse_low(P_WR, B_WR);
pulse_low(P_WR, B_WR);
pulse_low(P_WR, B_WR);
pulse_low(P_WR, B_WR);
pulse_low(P_WR, B_WR);
pulse_low(P_WR, B_WR);
pulse_low(P_WR, B_WR);
pulse_low(P_WR, B_WR);
pulse_low(P_WR, B_WR);
}
if ((pix % 16) != 0)
for (int i=0; i<(pix % 16)+1; i++)
{
pulse_low(P_WR, B_WR);
}
}

2aza

Ho studiato un po'... Ho capito che ddr serve a impostare i pin in IN o in OUT...
Seguendo il pin mapping del 1284p e considerando le modifiche che voglio apportare dovrebbero diventare:
Ddrb |= 0x1f
Ddrd = 0xff
Ddra |= 0xe0

Il resto è buio... Cport? sport?

Nessuno sa darmi una mano?

astrobeed

Non puoi modificare la libreria UTFT per liberare la SPI  del 1284p, case pdid 40, perché ci sono dei vincoli hardware all'uso dei port, ovvero l'uso di quei pin è obbligatorio per il controllo dei display, se ti serve la SPI devi passare ad una scheda basata sul ATMega2560.
Purtroppo quei display richiedono un bus a 16 bit, oltre ad altri 5 bit per i segnali di handshake, che devono obbligatoriamente risiedere su due port 8 bit per intero, solo i segnali di handshake possono stare su pin a piacere, da qui il limite nell'assegnazione dei pin.
Scientia potentia est

2aza

Richiede solo una porta a 8 bit intera....
Poi non capisco perche parli di vincoli hardware, potresti spiegarti meglio?
Per quanto ne so io un interfacciamento parallelo ha bisogno di semplici uscite digitali da un bit ciascuna, le posizioni non dovrebbero essere fondamentali... Sbaglio?

astrobeed

Il bus dati è a 16 bit e servono due porte, intere, a otto bit, non va bene usare bit sparsi su più porte per i problemi di ritardo sulla propagazione dei bit che possono portare ad errori di lettura e/o a grossi problemi di latenza che andrebbero ad impattare sensibilmente sulla velocità di risposta del display.
Se non sei convinto della cosa chiedi direttamente allo sviluppatore della libreria, non pensare che la risposta sarà diversa dalla mia, se vuoi usare la SPI devi usare un Atmega2560.

Scientia potentia est

SukkoPera

#5
Jul 01, 2016, 01:16 pm Last Edit: Jul 01, 2016, 01:17 pm by SukkoPera
Se per la SD usi la SdFatLib, questa supporta una emulazione SPI software che permette di usare qualunque pin.

Su efficacia ed affidabilità di questa soluzione però non mi esprimo: mai usata.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

2aza

Io ho:
2 segnali su PA
8 su PB
6 su PD
Poi ho letto di un utente del forum con il mio stesso identico problema che ne è venuto a capo...

2aza

Se per la SD usi la SdFatLib, questa supporta una emulazione SPI software che permette di usare qualunque pin.

Su efficacia ed affidabilità di questa soluzione però non mi esprimo: mai usata.
Provo e riferisco... Grazie...

2aza

Code: [Select]
In file included from C:\Program Files\Arduino\libraries\SdFat/utility/SoftSPI.h:31:0,

                 from C:\Program Files\Arduino\libraries\SdFat/SdSpi.h:211,

                 from C:\Program Files\Arduino\libraries\SdFat/SdSpiCard.h:29,

                 from C:\Program Files\Arduino\libraries\SdFat/SdFat.h:26,

                 from C:\Program Files\Arduino\libraries\SdFat\examples\SoftwareSpi\SoftwareSpi.ino:7:

C:\Program Files\Arduino\libraries\SdFat/utility/DigitalPin.h:365:2: error: #error Undefined variant 1284, 644, 324, 64, 32

 #error Undefined variant 1284, 644, 324, 64, 32

  ^

Uso la libreria SPI alla versione 1.0 nella cartella: C:\Program Files\Arduino\hardware\MightyCore-master\avr\libraries\SPI
Uso la libreria SdFat nella cartella: C:\Program Files\Arduino\libraries\SdFat (legacy)
exit status 1
Errore durante la compilazione per la scheda ATmega1284.

??  il 1284p é supportato...

Etemenanki

Ma ... e limitarsi a "ricablare" anziche' "rimappare", per fare in modo che i pin corrispondano ? ... vuoi mai che per una volta, la buona vecchia soluzione hardware risolva il problema ? ... ;)
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

2aza

Sono riuscito a fare andare la fatlib e ho assegnato manualmente i pin al soft SPI e sembra che funzioni tutto, chiaramente è più lento rispetto all' hardware HWSPI però fa il suo dovere. Un enorme grazie al consiglio di sukkopera  :)

Go Up