Olá Alejandro, DQ e demais colegas,
Pois é. Estive pesquisando sobre isso por causa do desenvolvimento da biblioteca para o PSG e foi inconclusivo.
** (Explicação para quem quiser entender essa discussão mais no final deste bookmail).
Até onde entendi, os pinos das portas dos microcontroladores Atmega 1280 e 2560 são não sequenciais no pinout do Arduino, para manter funcionalidades nas mesmas posições dos Arduinos "normais" (Diecimila, Duemilanove, Uno etc).
Um exemplo são os pinos digitais 0 a 7 de um Arduino "normal", que são a porta D, bits 0 a 7, enquanto que num Arduino Mega, são bits diversos das portas E, G e H:
PORT D - bits 0 a 7 = mapeamento físico e de software dos chips Atmega 8/168/328;
PORTs E, G e H - bits variados = mapeamento físico e de software dos chips Atmega 1280/2560.
E/S digital 1 = PORT D - bit 1 = PORT E - bit 1
E/S digital 2 = PORT D - bit 2 = PORT E - bit 4
E/S digital 3 = PORT D - bit 3 = PORT E - bit 5
E/S digital 4 = PORT D - bit 4 = PORT G - bit 5
E/S digital 5 = PORT D - bit 5 = PORT E - bit 3
E/S digital 6 = PORT D - bit 6 = PORT H - bit 3
E/S digital 7 = PORT D - bit 7 = PORT H - bit 4
Ainda não testei na prática pra saber se a "variável" PORTD aciona os mesmos pinos do Arduino Mega256 através de alguma abstração da biblioteca do ambiente de desenvolvimento do Arduino.
** Explicando para quem não entendeu nada:
No meu caso (biblioteca para acionar o chip de som PSG) e no caso do Alejandro (biblioteca para acionar cartão de memória - é isso, né Alejandro?), temos problemas com tempo (componentes eletrônicos tem especificações de tempo para que um grupo de sinais elétricos sejam acionados).
No caso do chip de som, eu tenho 50uS (micro segundos) para acionar dois terminais para dizer quais informações ele vai receber. Normalmente, em Arduino, fazemos assim:
digitalWrite (pinoX, valorX);
digitalWrite (pinoY, valorY);
O problema, neste caso, é que o tempo de execução entre um comando e outro é maior que os tais 50uS. Então a solução que encontrei no Arduino "normal" é ler o conteúdo de toda a porta (os 8 bits), mudar o que me interessa, e devolver os 8 bits, numa cacetada só, assim:
byte meuByte;
...
meuByte = PORTD; // Essa variável "PORTD" é automaticamente mapeada direto nos 8 bits (0 a 7) de E/S digital.
bitWrite(meuByte, pinoX, valorX); // Ajusta o bit pinoX (0 a 7) com o valorX (LOW ou HIGH).
bitWrite(meuByte, pinoY, valorY); // Ajusta o bit pinoY (0 a 7) com o valorY (LOW ou HIGH).
PORTD = meyByte; // "Manda" os 8 bits (bits 0 a 7) de volta pra porta D numa cacetada só (apenas com os 2 bits mudados).
Como foi tudo de uma vez, o tempo de mudança entre um bit e outro foi ZERO!!!
O problema dos Arduinos Mega128 e Mega256 é que os pinos digitais 0 a 7 estão distribuídos em portas diversas dos microcontroladores Atmega1280 e Atmega2560, como mostrei na tabela lá no começo deste bookmail.
PS2: Se alguém tiver alguma experiência com isso e puder ajudar, gratidão eterna e ainda pago uma breja ou refri no Garoa!