Shield Tuoch screen: incompatibilita' tra Arduino Uno e Mega2560

Salve a tutti, dopo tanti tentativi tutti ovviamente fallimentari, vi chiedo aiuto per far funzionare questa shield su un Mega 2560.
Premetto che su Arduino Uno mi funziona tutto perfettamente, touch lcd e Sd.
Visto che gli indirizzi vanno rivisti, per poter passare direttamente da Uno a Mega e mantenere la piedinatura, ho modificato l'indirizzamento nei due sketch interessati, quello che gestisce l'Lcd e quello del touch.
Per cio' che riguarda la visualizzazione, tutto ok, il display mi funziona sul Mega.
Il touch invece non risponde.
Dei 9 segnali necessari alla shield, 3 sono sul conn. ICSP (SCLK, MISO, MOSI).
3 servono per l'Lcd: (LCD_CS, LCD_BL, LCD_DC)
e i 3 del touch: pin3 (TP_IRQ), pin4 (TP_CS), pin5 (SD_CS).

Questa e' la Libreria da cui sono partito
questo e' lo sketch interessato dal touch

#ifndef __XPT2046_H
#define __XPT2046_H

#include <Arduino.h>
#include <avr/pgmspace.h>
#include <SPI.h>
//#include <SD.h>

#define BIT(__N)  (uint8_t)(1 << (__N))


#if  defined(__AVR_ATmega2560__)

#define __XPT2046_CS_OUT()      DDRG |= 0x20
#define __XPT2046_CS_SET()      PORTG |=  0x20
#define __XPT2046_CS_CLR()      PORTG &=~ 0x20

#define __XPT2046_IRQ_IN()      DDRE &=~ 0x20;PORTE |=  0x20
#define __XPT2046_IRQ_READ()    (PINE & 0x20)

#define __XPT2046_WRITE_BYTE(__DATA)       SPI.transfer(__DATA)
          
#define __SD_CS_DISABLE()       DDRE |= 0x08; PORTE |=  0x08

#else

#define __XPT2046_CS_OUT()      DDRD |= BIT(4)
#define __XPT2046_CS_SET()      PORTD |=  BIT(4)
#define __XPT2046_CS_CLR()      PORTD &=~ BIT(4)

#define __XPT2046_IRQ_IN()      DDRD &=~ BIT(3);PORTD |=  BIT(3)
#define __XPT2046_IRQ_READ()    (PIND & BIT(3))

#define __XPT2046_WRITE_BYTE(__DATA)       SPI.transfer(__DATA)
          
#define __SD_CS_DISABLE()       DDRD |= BIT(5); PORTD |=  BIT(5)

#endif






class XPT
{

public:
	
	inline uint8_t xpt2046_write_byte(uint8_t chData)
	{
		return __XPT2046_WRITE_BYTE(chData);
	}

	uint16_t xpt2046_read_ad_value(uint8_t chCmd)
	{
		uint16_t hwData = 0;
    
	    __XPT2046_CS_CLR();
	    xpt2046_write_byte(chCmd);
	    hwData = xpt2046_write_byte(0x00);
	    hwData <<= 8;
	    hwData |= xpt2046_write_byte(0x00);
	    hwData >>= 4;
	   __XPT2046_CS_SET();
		
		return hwData;
	}
	
#define READ_TIMES  5
#define LOST_NUM    1
	uint16_t xpt2046_read_average(uint8_t chCmd)
	{
		uint8_t i, j;
		uint16_t hwbuffer[READ_TIMES], hwSum = 0, hwTemp;

		for (i = 0; i < READ_TIMES; i ++) {
			hwbuffer[i] = xpt2046_read_ad_value(chCmd);
		}
		for (i = 0; i < READ_TIMES - 1; i ++) {
			for (j = i + 1; j < READ_TIMES; j ++) {
				if (hwbuffer[i] > hwbuffer[j]) {
					hwTemp = hwbuffer[i];
					hwbuffer[i] = hwbuffer[j];
					hwbuffer[j] = hwTemp;
				}
			}
		}
		for (i = LOST_NUM; i < READ_TIMES - LOST_NUM; i ++) {
			hwSum += hwbuffer[i];
		}
		hwTemp = hwSum / (READ_TIMES - 2 * LOST_NUM);

		return hwTemp;
	}
	
	void xpt2046_init(void);
	void xpt2046_read_xy(uint16_t *phwXpos, uint16_t *phwYpos);
	bool xpt2046_twice_read_xy(uint16_t *phwXpos, uint16_t *phwYpos);
};

extern uint8_t g_chXcmd, g_chYcmd;
extern XPT Xpt;

#endif

cosa mi sfugge?
grazie