Display TFT 3,2" su ATmega1284P [RISOLTO]

Dopo essere riuscito, con il vostro aiuto, a programmare e interfacciarmi con il 1284P ora mi trovo in difficoltà nel collegare un display TFT 3,2" a 16bit con Touch e SD.
Facendolo lavorare a 3V3 e a 8MHz di clock potrei collegarlo direttamente senza adattatori di livello, sempre da vs. suggerimento.
Il mio problema ora e' nel capire quali I/O e quali porte usa la libreria UTFT (Electronics - Henning Karlsen) interfacciandosi con il 1284P che supporta di suo.
A parte gli I/O che assegno manualmente nell' inizializzazione della libreria (RS,WR,CS,RESET) non so quali sono ad esempio le porte utilizzate per i 16 bit di dati.
Analizzando i vari file .h credo che le porte siano la A e la C con DB0=A0 e a seguire fino a DB15=C7, ma non ne sono sicuro.
Necessito di Vs. aiuto....TNX. :slight_smile:

nessuno e' in grado di aiutarmi?
ho caricato uno sketch demo sulla mcu e controllando con l' oscilloscopio sembra che le porte usate siano soprattutto PB e PD, pero' esce qualcosa anche sulle PA!
non mi trovo...
nessuno puo' leggermi la definizione dei pin nella libreria? vi prego...
grazie

Mettiti di santa pazienza e, con l'aiuto del PDF che ti allego ... vedi se riesci a mappare le corrispondenze ... :wink:

Guglielmo

atmega1284p.pdf (117 KB)

Deltoz:
Il mio problema ora e' nel capire quali I/O e quali porte usa la libreria UTFT (Electronics - Henning Karlsen)

Quella lib non dice espressamente di supportare il 1284P.

Compatibility:
Arduino Duemilanove w/ATmega328
Arduino Uno
Arduino Leonardo
Arduino Mega
Arduino Mega2560
Arduino Due
Bobuino

Andrebbe controllato anche a livello di codice se non fa uso di chiamate specifiche all'HW

leo72:

Deltoz:
Il mio problema ora e' nel capire quali I/O e quali porte usa la libreria UTFT (Electronics - Henning Karlsen)

Quella lib non dice espressamente di supportare il 1284P.

Compatibility:
Arduino Duemilanove w/ATmega328
Arduino Uno
Arduino Leonardo
Arduino Mega
Arduino Mega2560
Arduino Due
Bobuino

Andrebbe controllato anche a livello di codice se non fa uso di chiamate specifiche all'HW

si si lo supporta

v2.7 03 Nov 2013 •  added support Bobuino (ATmega1284P)

infatti nella cartella HardWare c'e' il file HW_ATmega1284P.h

gpb01:
Mettiti di santa pazienza e, con l'aiuto del PDF che ti allego ... vedi se riesci a mappare le corrispondenze ... :wink:

Guglielmo

si il pinout del 1284p ce l' ho, ma la mia difficota' sta' nel capire questa libreria specifica quali I/O utilizza.
dovrebbe essere scritto proprio nel file HW_ATmega1284P.h giusto? io il "C" non lo mastico proprio...
allego il suo contenuto, cosi' potete leggerlo, se non e' lui dove altro potrebbero stare le indicizzazioni?

// *** Hardwarespecific functions ***
void UTFT::_hw_special_init()
{
}

void UTFT::LCD_Writ_Bus(char VH,char VL, byte mode)
{   
	switch (mode)
	{
	case 1:
		if (display_serial_mode==SERIAL_4PIN)
		{
		if (VH==1)
			sbi(P_SDA, B_SDA);
		else
			cbi(P_SDA, B_SDA);
		pulse_low(P_SCL, B_SCL);
		}
		else
		{
		if (VH==1)
			sbi(P_RS, B_RS);
		else
			cbi(P_RS, B_RS);
		}

		if (VL & 0x80)
			sbi(P_SDA, B_SDA);
		else
			cbi(P_SDA, B_SDA);
		pulse_low(P_SCL, B_SCL);
		if (VL & 0x40)
			sbi(P_SDA, B_SDA);
		else
			cbi(P_SDA, B_SDA);
		pulse_low(P_SCL, B_SCL);
		if (VL & 0x20)
			sbi(P_SDA, B_SDA);
		else
			cbi(P_SDA, B_SDA);
		pulse_low(P_SCL, B_SCL);
		if (VL & 0x10)
			sbi(P_SDA, B_SDA);
		else
			cbi(P_SDA, B_SDA);
		pulse_low(P_SCL, B_SCL);
		if (VL & 0x08)
			sbi(P_SDA, B_SDA);
		else
			cbi(P_SDA, B_SDA);
		pulse_low(P_SCL, B_SCL);
		if (VL & 0x04)
			sbi(P_SDA, B_SDA);
		else
			cbi(P_SDA, B_SDA);
		pulse_low(P_SCL, B_SCL);
		if (VL & 0x02)
			sbi(P_SDA, B_SDA);
		else
			cbi(P_SDA, B_SDA);
		pulse_low(P_SCL, B_SCL);
		if (VL & 0x01)
			sbi(P_SDA, B_SDA);
		else
			cbi(P_SDA, B_SDA);
		pulse_low(P_SCL, B_SCL);
		break;
	case 8:
		cport (PORTD, 0xF0);
		sport (PORTD, (VH & 0x0F));
		cport (PORTB, 0xF0);
		sport (PORTB, (VH & 0xF0)>>4);
		pulse_low(P_WR, B_WR);
		cport (PORTD, 0xF0);
		sport (PORTD, (VL & 0x0F));
		cport (PORTB, 0xF0);
		sport (PORTB, (VL & 0xF0)>>4);
		pulse_low(P_WR, B_WR);
		break;
	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 |= 0x0F;
	DDRD |= 0x0F;
	if (mode==16)
	{
		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);
		}
}

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

	cport (PORTD, 0xF0);
	sport (PORTD, (ch & 0x0F));
	cport (PORTB, 0xF0);
	sport (PORTB, (ch & 0xF0)>>4);

	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);
		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);pulse_low(P_WR, B_WR);
		}
}

considerate che il mio display e' un 16bit, quindi al primo "switch" dovrebbe corrispondere il "case: 16".

Credo di aver trovato. Il 1284P e' utilizzato dal Bobuino, quindi credo che la corrispondenza sia quella nella tabella, in riferimento del Bobuino:

gpb01:
Mettiti di santa pazienza e, con l'aiuto del PDF che ti allego ... vedi se riesci a mappare le corrispondenze ... :wink:

Guglielmo

Considerando quanto ho gia' detto sopra e considerando che il Bobuino utilizza un pinout diverso da questo da te postato(che e' quello che uso io con l' implementazione del 1284P come da guida di Leo72 / mighty), quale devo prendere in considerazione?
Che poi devo comunque cambiare perche' mi serve liberare una seriale (per comunicare con altro) e la SPI (per la comunicazione con la SD Card).
quindi il dilemma ora e'(unendosi alle altre difficoltà): modificare la libreria? o crearmi un nuovo PinOut fatto ad hoc per le mie esigenze?
forse piu' facile la seconda (per me).

Ad ogni modo aspetto votri consigli.
Vi ringrazio.

In quel file vengono usate le costanti predefinite della toolchain Atmel per indirizzare i pin quindi bisognerebbe mettersi di santa pazienza e vedere la corrispondenza dei pin. Ad esempio:

cport (PORTD, 0xF0);

Premetto che non so cosa faccia cport, ma a rigor di logica dovrebbe voler dire "clear port", quindi spenge dei pin agganciati ad una porta (immagino), PORTD è il registro che controlla la porta logica "D", che gestisce i pin da PD0 a PD7. $F0 in binario è 11110000 quindi va a disattivare i pin da PD7 a PD4. Sempre supponendo.
Oppure fa l'inverso, spengendo i pin da PD3 a PD0? Boh.
Magari aiutati con lo schema di collegamento fornito sul sito.

Poi vedo P_SDA/P_SCL e B_SDA/B_SCL, immagino che siano i pin dell'I2C (B_SDA/B_SCL) sulla corrispondente porta. Ma non vedo mappature ulteriori, non li ho mai usati, andrebbe preso la toolchain nei file dove fa le definizioni di queste costanti e controllato.

E' troppo complicato per me, va oltre le mie conoscenze sofware, ci vorrebbe un programmatore con i "cosi" d' acciaio, che sa il fatto suo. Tra l' altro ho postato nell' area sbagliata, e' piu' un problema software che hardware.

E se facessi il contrario? se modifico il file pins_arduino.p in modo da riassegnare i pin digitali corrispondenti alle porte che voglio usare io? pero' ho il dubbio (forse confermato da quei comandi sport...cport ecc) che la libreria lavorando con comandi diretti in assembly se ne frega del pinout assegnato dal compilatore.
Che ne pensate?
In qualche modo devo risolvere, aiutatemi, altrimenti butto al vento tutto il lavoro fatto finora.

Deltoz:
la libreria lavorando con comandi diretti in assembly se ne frega del pinout assegnato dal compilatore.

Ci puoi scommettere :wink:

Deltoz:
In qualche modo devo risolvere, aiutatemi, altrimenti butto al vento tutto il lavoro fatto finora.

Se hai la mappatura dei pin per la Bobduino, ti prendi lo schema della Bobduino e verifichi le corrispondenze con i pin del 1284P. Non penso sia impossibile.

leo72:
Se hai la mappatura dei pin per la Bobduino, ti prendi lo schema della Bobduino e verifichi le corrispondenze con i pin del 1284P. Non penso sia impossibile.

gia' fatto, la corrispondenza ce l' ho...ma il problema e' che io devo liberare una seriale e la SPI per altri utilizzi.
Questa libreria utilizza proprio quelle porte.
Quindi l' unica cosa da fare e' modificare la libreria, che pero' per me e' impossibile.
Mi indicate qualcuno che possa aiutarmi?

Deltoz:
gia' fatto, la corrispondenza ce l' ho...ma il problema e' che io devo liberare una seriale e la SPI per altri utilizzi.

La seriale ... puoi creartela su una coppia qualsiasi di pin liberi usando la SoftwareSerial mentre la SPI ... cosa vorresti liberare ??? :astonished:

SPI è un bus, tutti i devices vanno collegati in parallelo ... decidi poi con chi parlare in base al pin di select (CS) che hanno i devices SPI !

Guglielmo

Edit: Atroce dubbio ... ma quel modulo usa i pin SPI non per collegarsi in SPI ??? Ovvero ... li usa come normali pin digitali ??? Se è così è un bel guaio ...

Esatto Guglielmo, usa il canale SPI come uscita digitale per il bus a 16 bit, quindi non posso usarli, lo so come funzina la SPI.
E per la seriale vorrei usare quella hardware. Magari se era solo per la seriale ci poteva stare, ma visto che devo comunque modificare la libreria per la SPI a questo punto libero anche la seriale HW.
Bel casotto....

Deltoz:
Bel casotto....

Vero ... :grin: :grin: :grin:

Ma ... emmm ... comprare una Mega 2560 no ??? ... così la lib è già compatibile, di pin ne hai in abbondanza e di porte seriali pure e ... alla fine ti costa meno che stare giorni e giorni ad impazzire per risolvere il problema ...

Guglielmo

il mega ce l'ho gia', anche un DUE, i il software l' ho gia' sviluppato e funziona su entrambi. il fatto e' che voglio creare un pcb specifico per le mie esigenze, pulito, senza shield e altro.
ecco perche' ho voluto usare il 1284P.
devo necessariamente modicare quella libreria.... :sweat_smile:

Deltoz:
devo necessariamente modicare quella libreria.... :sweat_smile:

Ah .. ok .. buon lavoro allora XD

Guglielmo

Si ma con il vostro aiutooooooooooo......... =( =( =(
possibile non ci sia nessuno che possa darmi una mano?
un buon programmatore? a chi posso chiedere aiuto?

Qui siamo tutti "volontari in ferma breve" :wink:
Nel senso che siamo qui a donare un pò di aiuto nel tempo perso che abbiamo, io personalmente non ho il tempo per fare questa cosa. Altri non so.

Certo, lungi da me pretendere qualcosa....
ho studiato un po' la situazione, forse ho trovato il modo, piu' tardi faro delle prove e vi faccio sapere.

Ci sono riuscito.
Ho modificato la libreria e riassegnato i pin dove volevo io! collegato e funziona alla grande.
Grazie dell' aiuto!