No termino de comprender PROGMEM...

Buenas tardes...

Estoy utilizando un ATMEGA2560 y el modificador PROGMEM para manejar un Max7219 con el fin de imprimir un texto pasante en una matriz Led 8x8, con tipo de dato unsigned char.

Ejemplo:

const unsigned char CH[] PROGMEM = {
.
.
4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
.
.
};

En este caso, quiero imprimir los caracteres ABC de forma seguida. Los tres caracteres ocupan 4 Bytes (32 bits) de la Matrix 8x8. Hasta ahí todo bien.

El problema surge cuando quiero extender ese rango, a más de 4 Bytes... Directamente el programa se bloquea y me imprime basura en las Matrices Led.

No termino de entender porque no puedo imprimir esto, por ejemplo:

const unsigned char CH[] PROGMEM = {
.
.
6, 8, B01111110, B01111111, B00010001, B00010001, B01111111, B01111110, // A
4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
.
.
};

Agradecería cualquier explicación o ayuda para poder solucionar esta inquietud,
Muchas gracias.

Por favor postea el código usando etiquetas (mira como te he editado tus dos códigos y te envié un mensaje privado con las normas y como editar).

Severus_LIII:
con el fin de imprimir un texto pasante en una matriz Led 8x8, con tipo de dato unsigned char.

Si es que la librería no lo hace (y si es que estás usando una librería), me parece que lo que intentas hacer son fotogramas de una animación. Es una matriz de 8x8; por lo tanto son 8 bytes (8*8 bits) y no 4.

Un fotograma es una imagen estática; pero al cambiarlas en una secuencia, se forma una animación.
Para efectos de la matriz, una imagen estática se compone de algo llamado "mapa de bits"; por eso solo se requieren 8 bytes, porque 8 bytes * 8 bits = 64 bits o pixeles que componen la matriz.

Por lo tanto, para formar una animación, se requiere crear una secuencia de vectores de 8 bytes; así:

const unsigned char frame[][8] PROGMEM = {
{
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000
},

{
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000
},

{
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000
}
};

Observa lo siguiente en estas declaraciones:

const unsigned char frame[][8] PROGMEM = {

El primer [] es el índice de fotograma, no se especifica para que seas libre de crear tantos como sea necesario. El segundo [8] es preferible que sea especificado, ya que si por error dejas un fotograma con más o menos de 8 bytes, lo sabrás en tiempo de compilación.

{
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000
},

Mira que así se visualiza más fácilmente cómo será la imagen. Recuerda que 1 es un pixel iluminado y 0 es un pixel apagado. Si el MAX7219 tomara primero el LSB para dibujar el fotograma, entonces en el código habría que crearlo pero invertido en el eje vertical (como una imagen espejo).