Scritte scorrevoli su lcd grafico

Voglio fare scorrere questa scritta " sab 8 dic 2012 00:03:09" sul display grafico displaytech 64128N e sto usando questa libreria Google Code Archive - Long-term storage for Google Code Project Hosting. che non è dotata di funzioni per traslare una porzione di buffer grafico. Allora ho pensato di fare in modo tradizionale (vedi codice). Il risultato è più o meno quello che segue:

sab 8 dic 2012 00:03
sab 8 dic 2012 00:03:
ab 8 dic 2012 00:03:0
b 8 dic 2012 00:03:09
8 dic 2012 00:03:09
8 dic 2012 00:03:09 s
dic 2012 00:03:09 sa

La cosa funziona ma, come dire girano gli occhi osservando la striscia che scorre a circa 1 secondo a carattere, sembra che il display non sia sufficientemente veloce. Ora mi chiedo è colpa del display lento o della lib che usa un protocollo software ISP, voi avete provato a fare scorrere una scritta? con quale codice? da qualche parte c'è un video? sarebbe più veloce se scrivessi codice che opera sul frame buffer?

Codice:

void scroll_string(const char * s, char *dest_s)
{

    static uint8_t i = 0;                                // viene incrementato ad ogni chiamata 
    uint8_t end_idx = i;
    uint8_t idx = 0;
    while (idx < 22) {                                  // copia in dest_s[] 21 caratteri presi da s[]
        dest_s[idx] = s[end_idx];
        idx++;
        end_idx++;
        if (end_idx > 23 )                              //  dopo il 23 esimo carattere si riparte da 0
            end_idx = 0;
    }
    dest_s[21] = '\0';                                  // aggiungo il fine riga
    i++;                                                      // se i supera il limite si riparte da 0
    if (i > 23)
        i = 0;
}

Chiamata:

char date_time[22];
scroll_string(" sab 8 dic 2012 00:03:09", date_time);

Ovviamente " sab 8 dic 2012 00:03:09" non sarà una costante in quanto varia con il tempo in base all'RTC che al momento non ho.

Ciao.

Sinceramente non ho mai usato un display grafico ma solo i classici LCD.
Ti posso solo dire che il metodo che usi è lo stesso che uso anche io (aggiungo: da sempre, fin da quando avevo il mio C16 :wink: ).
Ti chiedo una cosa, visto che non hai messo la porzione di codice che usi per scrivere: non puoi posizionare il testo per pixel invece che per carattere? Ad esempio, la lib per lo shield 3310 che ho a casa aveva un metodo per scrivere il testo accettando la posizione per caratteri ma, analizzandola, vedevo che in realtà la posizione orizzontale la trovava facendo una semplice moltiplicazione per 8 dato che il 3310 è un display grafico a tutti gli effetti per cui creandomi un metodo tutto mio potevo posizionare le scritte in orizzontale con spostamenti di 1 solo pixel per volta in modo semplicissimo.

La funzione che uso e quella della lib per scrivere una stringa e quindi come dici tu posso posizionare la scritta con risoluzione di 1 pixel, ma credo che sia peggio traslare di un pixel per volta perchè dovrei aumentare la velocità per avere una scritta sufficientemente veloce, già così ci mette circa 14 secondi per scorrerla tutta e se aumento la velocità si pasticcia tutto. Proverò comunque a traslare una scritta a velocità elevata, anche se già il demo mostra la lentezza, per di più sono con il 644a a 20MHz, quindi mi sa che devo implementare l'ISP hardware o l'interfaccia paralella per vedere se le cose migliorano.

// scrive data e ora
u8g_DrawStr(&u8g, 0, 58, date_time);

Ho provato la lib di ladyada ma anche sistemando il codice (non compilava) la demo non va avanti.

Ciao.

Ma sei sicuro che usi un'implementazione sofware della SPI?
Gli ho dato un'occhiata veloce ma vedo che ci sono dei file in cui si usano i pin dell'SPI (MOSI/MISO/SCK).
Non è che forse è il display che è lento a rispondere?

Si sono abbastanza sicuro o almeno quello che scrivo nel codice mi fa pensare che si tratti di ISP software (vedi codice)

// u8g_dev_st7565_64128n_sw_spi è il tipo da passare alla funzione, per altri display c'è sia u8g_dev_xxxx_sw_spi che u8g_dev_xxxx_hw_spi
// nota hw al posto di sw.
u8g_InitSPI(&u8g, &u8g_dev_st7565_64128n_sw_spi, PN(1, 7), PN(1, 5), PN(1, 2), PN(1, 1), U8G_PIN_NONE);

Comunque anche io uso i pin della isp hardware così da poter fare lo switch senza cambiare collegamenti.

Hai notato che c'è anche la versione per arduino?
io uso la versione AVR.

Ciao.

MauroTec:
Si sono abbastanza sicuro o almeno quello che scrivo nel codice mi fa pensare che si tratti di ISP software (vedi codice)

// u8g_dev_st7565_64128n_sw_spi è il tipo da passare alla funzione, per altri display c'è sia u8g_dev_xxxx_sw_spi che u8g_dev_xxxx_hw_spi

// nota hw al posto di sw.
u8g_InitSPI(&u8g, &u8g_dev_st7565_64128n_sw_spi, PN(1, 7), PN(1, 5), PN(1, 2), PN(1, 1), U8G_PIN_NONE);

OK.

Comunque anche io uso i pin della isp hardware così da poter fare lo switch senza cambiare collegamenti.

Hai notato che c'è anche la versione per arduino?
io uso la versione AVR.

Ciao.

Sì, avevo visto.