Go Down

Topic: Misuratore Ampere / Volt / Continuità per pista Slot (Read 13749 times) previous topic - next topic

MightyPegas

#255
Nov 06, 2018, 12:04 am Last Edit: Nov 06, 2018, 12:06 am by MightyPegas
Quindi il "riempiere un rettangolo" è più veloce del "coloro solo i pixel accesi in quel rettangolo" ?
in questo caso sì, perché ti risparmi tutto il lavoro di creazione del carattere da inviare e un'altra trasformazione float->ascii.

Poi guarda la differenza dei due loop principali della drawChar (richiamata per ogni carattere) e della fillRect (loop che nel nostro caso verrebbe eseguito 7*textSize volte)
Qualcosa mi dice che quello della fillRect sia più veloce :)
Anche perchè la stessa drawChar nel caso textSize sia maggiore di 1 richiama la fillRect per ogni punto del carattere da ingrandire...

Code: [Select]

    for(int8_t i=0; i<6; i++ ) {
      uint8_t line;
      if(i < 5) line = pgm_read_byte(font+(c*5)+i);
      else      line = 0x0;
      for(int8_t j=0; j<8; j++, line >>= 1) {
        if(line & 0x1) {
          if(size == 1) drawPixel(x+i, y+j, color);
          else          fillRect(x+(i*size), y+(j*size), size, size, color);
        } else if(bg != color) {
          if(size == 1) drawPixel(x+i, y+j, bg);
          else          fillRect(x+i*size, y+j*size, size, size, bg);
        }
      }


Code: [Select]

  for (; x0<=x1; x0++) {
    if (steep) {
      drawPixel(y0, x0, color);
    } else {
      drawPixel(x0, y0, color);
    }
    err -= dy;
    if (err < 0) {
      y0 += ystep;
      err += dx;
    }


Quote
Comunque la libreria di suo non cancella il testo precedente, per questo ho fatto funzioni generiche parametriche che chiamo inserendo il colore e da dove prendere i valori, così posso cancellare facilmente i caratteri.
strano... da quel che si vede nel loop che ho postato, lo sfondo viene scritto... a patto che il colore sia impostato diverso da quello di primo piano...

Massimo
Uso quello che ho e quello che non ho lo invento!

MightyPegas

Comunque la libreria di suo non cancella il testo precedente, per questo ho fatto funzioni generiche parametriche che chiamo inserendo il colore e da dove prendere i valori, così posso cancellare facilmente i caratteri.
Credo di aver scoperto il motivo...
Della setTextColor ne esistono due versioni, con uno o due parametri.
Quella che usi tu (1 parametro) imposta lo sfondo e il primo piano allo stesso colore (modalità "trasparente") e quindi ogni volta che scrivi traccia il solo carattere senza toccare lo sfondo...
Dovresti usare la versione a 2 parametri setTextColor (fgcolor, bgcolor) per impostare entrambi i colori...

Massimo
Uso quello che ho e quello che non ho lo invento!

ricki158

Usando la versione a due parametri, vado a rallentare molto la stampata? Comunque interessante, perché a questo punto tutto il lavoro di ottimizzazione del codice non mi serve più e non devo cancellare ogni volta o ad ogni cambio di pagina! Ancora meno righe e forse poso eliminare un po' di funzioni parametriche o parametri di funzione.

MightyPegas

Usando la versione a due parametri, vado a rallentare molto la stampata? Comunque interessante, perché a questo punto tutto il lavoro di ottimizzazione del codice non mi serve più e non devo cancellare ogni volta o ad ogni cambio di pagina! Ancora meno righe e forse poso eliminare un po' di funzioni parametriche o parametri di funzione.
Difficile a dirsi.
Prima in effetti scrivevi solo il carattere invece di tutto il quadretto che lo racchiudeva. Con questo sistema invece scriveresti molti più punti, ma faresti un solo passaggio invece di due e non dovrebbe più esserci il flickering.

Ottimizzando un po' il codice della drawChar per dimensioni >1 evitando di fargli fare call di call di call (sistema che hanno ideato per eventuale override da parte dei driver specifici dei chip ma che con il tuo display non ci sono) su 6 caratteri da scrivere a occhio si potrebbe recuperare 1 mS o più per ogni print...

Se poi fai il bravo, ti regalo un pezzetto di codice estratto dal mio display con il quale potresti ridurre tutte quelle pagine di display a poche righe ;)
Occuperesti però più ram (che in parte recupereresti non dovendo più memorizzare i valori precedenti come fai ora)

Massimo
Uso quello che ho e quello che non ho lo invento!

ricki158

Adesso più che altro devo trovare come mai ci sono questi problemi di sincronia per far funzionare tutto.
Alla fine, come uno stupido, avevo un problema con le periferiche ADC1115 che erano girate al contrario e bloccavano il loop. Girandole nella maniera corretta però funziona comunque male. Com'è possibile che ci siano questi problemi passando da breadboard a basetta finale?

https://youtu.be/XPAlHw_fqUA

MightyPegas

Adesso più che altro devo trovare come mai ci sono questi problemi di sincronia per far funzionare tutto.
Alla fine, come uno stupido, avevo un problema con le periferiche ADC1115 che erano girate al contrario e bloccavano il loop. Girandole nella maniera corretta però funziona comunque male. Com'è possibile che ci siano questi problemi passando da breadboard a basetta finale?
Bé, ma quante modifiche hai fatto sullo sketch?
Ti è rimasta una versione del programma di quando girava sulla breadboard?

Per il display, se puoi scambiare i connettori tra i due intanto puoi vedere se dipende dal display o da altro.
Se il problema si trasferisce da uno all'altro allora ricontrolla il collegamento dei segnali... Le piattine quando si saldano diventano delicate all'attaccatura sulla saldatura, si spezzano facilmente a causa delle piccole incisioni lasciate sui conduttori al momento della spellatura, e i connettori crimpati per le piattine non sono una certezza, può capitare un contatto difettoso...

Gli ADC1115 funzionano ancora entrambi?
Le sincronie se hai moduli o componenti che non rispondono correttamente è facile che vadano a pallino.

Massimo
Uso quello che ho e quello che non ho lo invento!

ricki158

Lo sketch che girava su breadboard è quello attuale, solamente con i #define dei display cambiati e con l'aggiornamento della libreria degli ADC1115.

Gli ADC1115 funzionano entrambi.

Appena mi è possibile controllo i cavi variando i connettori.

ricki158

Ho provato a invertire i cavi. I cavi non hanno problemi, il secondo display fa la neve. Anche se collegato da solo.

MightyPegas

Ho provato a invertire i cavi. I cavi non hanno problemi, il secondo display fa la neve. Anche se collegato da solo.
Se invertendo i cavi la neve resta, sai cosa significa, vero? :(
Uso quello che ho e quello che non ho lo invento!

ricki158

Che ho bruciato un display senza saperne il motivo?

MightyPegas

Forse hai inavvertitamente provocato un corto tra un pin del display e la scheda principale spostando e poggiando il pannello, una cosa simile a quella che ti è capitata nel filmato quando ti si è bloccato tutto...
Ti conviene farti un piccolo supporto (anche di cartone ondulato) per reggere il pannello così che involontariamente non si appoggi sulla scheda principale...

Adesso che ci ripenso... stranamente quando ti si è bloccato entrambi gli schermi son diventati neri, niente più neve sul secondo...
Uso quello che ho e quello che non ho lo invento!

ricki158

... e se collego lo schermo dopo il setup iniziale lo schermo rimane bianco completamente. Questo succede con entrambi gli schermi.

ricki158

Salve a tutti!

Dopo varie peripezie sono riuscito a fare la scatola stampata in 3D. E' venuta molto bene, anche se non ho tenuto conto di alcuni fori impossibili da raggiungere ma nulla di grave. Metterò le foto alla fine.

Ho fatto alcune modifiche al codice dal momento che i convertitori AD sono a 15 bit più il bit del segno. Questo mi portava ad avere valori strani. Ho sistemato tutto.

Il codice ora funziona, è da ottimizzare dal punto di vista dei calcoli (faccio calcoli in virgola mobile, mi piacerebbe calcolare tutto con gli interi e solo alla fine stampare il valore sullo schermo) ed è da ottimizzare dal punto di vista della gestione dei display, mi è stato consigliato di usare dei campi video, cosa che io non so proprio usare e non so nemmeno che cosa siano.

Ma il problema attuale è che i display rimangono bianchi!

Dal PCB che ho creato ho un connettore a 10 poli sul quale si chiude una piattina. La piattina poi si divide nei due display. Tra il connettore e i display c'è poco meno di 14 cm di piattina non schermata. Ma comunque i display funzionavano!

Prima che mi accadesse questo i display avevano soltanto una resistenza da 1 k Ohm tra l'uscita a 5 V di Arduino e il display. Inoltre se delle volte toccavo i contatti i display diventavano bianchi e solo con un reset potevo tornare alle condizioni iniziali. Delle volte i display divenivano bianchi anche senza toccarli.

Adesso proprio i display si accendono e rimangono bianchi.

Così ho provato a fare un partitore con 1 k Ohm in serie tra Arduino e i display e una resistenza da 1 k 8 Ohm dopo quella da 1 k Ohm ma verso GND, tra quella resistenza e i display per capirci.

Sulla breadboard provavo un solo display e funzionava, sia con la resistenza da 1 k, sia con il partitore 1 k / 1 k 8, sia con resistenza da 1 k 2 in serie (ho trovato su questo forum nella sezione inglese qualcuno che ci aveva già sbattuto la testa ed aveva messo questo valore e, non sapendo che pesci pigliare, ho provato come detto da lui). Tutto funziona su breadboard e con un solo display (non ho provato con due, ma funzionava anche con due nei primissimi tentativi) e i display non sono bruciati.

Può essere la lunghezza della piattina che mi da questi problemi? Mi sembra tutto sommato abbastanza corta per un collegamento SPI. Inoltre prima funzionava senza grandi problemi, anche se delle volte succedeva quello che ho già descritto.

Che cosa faccio?

Intanto allego l'ultima versione del software, con controllo della tensione di alimentazione.

Grazie a tutti

Maurotec

Quote
Può essere la lunghezza della piattina che mi da questi problemi? Mi sembra tutto sommato abbastanza corta per un collegamento SPI. Inoltre prima funzionava senza grandi problemi, anche se delle volte succedeva quello che ho già descritto.
Sembrerebbe un problema di capacità distribuita, ma in tal caso abbassando la velocità di trasferimento SPI dovrebbe lavorare senza modifiche. In sostanza più velocemente transitano i dati più corto deve essere il cavo o comunque un cavo afflitto da una capacità minore.

PS: Il materiale isolante si comporta come un dielettrico - Applicazioni.   

Ciao.

ricki158

Mi sembra strano, poiché comunque prima funzionava con la stessa lunghezza.
Vorrei provare a mettere due cavi a 5 poli schermati, un cavo per display. Nel cavo faccio passare RST, DC, RS, CLCK e MISO. La calza la metto a GND lato display.

Non resta che comprare il cavo e provare

Go Up