Go Down

Topic: Ultrathin 16x32 (Read 184 times) previous topic - next topic

micro65

Salve ragazzi
ho da chiederVi una cortesia con la speranza che qualcuno abbia lavorato con queste matrici.
http://www.seeedstudio.com/depot/Ultrathin-16x32-Red-LED-Matrix-Panel-p-1582.html
Ho utilizzato come codice di prova quello disponibile sul sito e devo dire che non ce ne sono di problemi sino a che utilizzo due moduli in cascata ma se ne utilizzo 3 in modo da ottenere una matrice di 96x16 il tremolio dei led si nota perchè aumemta il numero di led per il refresh.
Nel codice non c'è nessun ritardo inserito tra i dati shiftati e il clock e l'enable finale però mi sembra strano che abbia di questi problemi se viene venduto come modulo ampliabile.
Sto utilizzando arduino uno rev 3 per le prove.
Il codice utilizzato è quello su github https://github.com/Seeed-Studio/Ultrathin_LED_Matrix
Grazie

astrobeed

sino a che utilizzo due moduli in cascata ma se ne utilizzo 3 in modo da ottenere una matrice di 96x16 il tremolio dei led si nota perchè aumemta il numero di led per il refresh.
La loro libreria usa la digitalWrite per scrivere su i pin, è una istruzione comoda però è molto lenta, da 1.5 a 3 us, dipende da varie condizioni, per scrivere un pin, se devi aggiornare oltre 1500 led è normale che non riesci ad ottenere un refresh invisibile all'occhio umano.
Soluzione modificare la libreria, meglio ancora scrivere una funzione dedicata, che aggiorna i pin direttamente tramite i registri del 328 invece di usare la digitalWrite, preferibilmente utilizzando pin posti sullo stesso port del 328, in questo modo la modifica dei pin richiede solo 125 ns.
Usare il GOTO in C è ammettere la propria sconfitta come programmatore

micro65

Quindi mi dici di utilizzare direttamente l'asm per gestire i PORT?
Io vengo dal mondo microchip e con il compilatore della CCS l'inserimento di linee asm era molto semplice (forse perchè ho sempre lavorato con le mcu della microchip) ma in Arduino non sono riuscito a trovare nulla d'immediato che mi permetta di gestire in asm i vari I/O.
Qualche dritta?
Grazie per i consigli

astrobeed

Quindi mi dici di utilizzare direttamente l'asm per gestire i PORT?
Non ti serve l'ASM, anche con gli AVR si fa come con i PIC, basta che scrivi direttamente sul PORT e lo fai in C :)
Qui trovi una spiegazione, abbastanza sintetica, della cosa con esempi (segui i link) per la manipolazione diretta dei PORT su Arduino.
Usare il GOTO in C è ammettere la propria sconfitta come programmatore

micro65

Ok, grazie per le dritte.
Agendo solo sul clk  senza il digitalwrite è già diventato perfetto.

micro65

Un altra cosa
a livello di bit senza usare mask (con | & ...) sull'intero PORT sempre in asm come si fa?
Grazie

micro65

Scusate ragazzi, sto cercando di velocizzare un pò il refresh ma non riesco con le istruzioni che seguono ad agire direttamente sul port bypassando l'ins digitalWrite

digitalWrite(a, (row & 0x01));
digitalWrite(b, (row & 0x02));
digitalWrite(c, (row & 0x04));
digitalWrite(d, (row & 0x08));

Grazie per i suggerimenti

micro65

Ok alla fine......
digitalWrite(a, (row & 0x01)); =
boolean b = (bool)(row & 0x01);
   if (b)
   {
      PORTD |= B00010000;
   }
   else
   {
      PORTD &= B11101111;
   }
...... e così a seguire.
a è il bit 4 di PORTD.
Ma non vedo grossi miglioramenti.
Naturalmente non è che sia così marcato il refresh ma orrizontalmente un occhio attento lo nota.

Go Up