Stai visualizzando 8 post - dal 1 a 8 (di 19 totali)
  • Autore
    Post
  • #8037
    Picmicro675Picmicro675
    Moderatore

    Ciao forum,
    Sto facendo degli esperimenti per ricavare la lettura di una cella di carico. Ho il modulino con HX711 e non sono riuscito bene a ricavare dati sicuri.
    Il maggior problema è cominciare un programma con un PIC. Ho tirato fuori un 16F877A e direi che dovrei ricevere i dati con uno shift seriale. Al momento ho qualcosa fatto tramite bit bang e dovrei mandare il clock per 24 volt e mettere il risultato in una variabile a 32 bit. Il foglio dati mi dice che si deve clockare per un numero di volte da 25 a 27, a secondo della gamma scelta.
    Allora non sono ancora sicuro come sia il risultato. Magari Theremino ha qualche asso nella manica. Del resto tutte i sorgenti sono scritti per arduino e non ho avuto la fortuna di trovare per un 16F. Perché infatti i programmatori vogliono starci larghi e usano matrici da 32bit e/o float per i loro calcoli.
    Le MCU a 14bit della Microchip non sono tagliate per queste cose, dato che non si può usare una memoria a banchi.
    Allora visto che di solito scrivo con il Proton Basic, l’unica libreria che si potrebbe tentare di convertire dovrebbe essere questa.
    Se avete dei lumi da aggiungere al mio oscuro percorso, ben volentieri a condividere il caso.

    #8041
    Avatartheremino
    Amministratore del forum

    Ciao Picmicro675,
    se non riesci a leggere l’ADC, questo non è dovuto ai bit del micro insufficienti, ma a qualche errore,
    noi leggiamo un ADC a 24 bit con un PIC a 16 bit e ci abbiamo messo mesi a farlo funzionare bene, ma non per i bit mancanti.

    Purtroppo il nostro ADC è un AnalogDevice, quindi completamente diverso, per cui il nostro codice ti servirà a poco
    comunque dovesse esserti utile si scarica da questa pagina:
    MasterFirmware_V5.0

    I problemi che si hanno a leggere questi cosi sono dei tipi seguenti:
    1) Errate impostazioni iniziali
    2) Temporizzazioni durante la lettura
    3) Errori hardware
    4) Errori di comprensione di quel che dice il data-sheet

    Per cui ti consiglio di rileggere con grande attenzione il trafiletto “Serial Interface” a pagina 4
    tradurlo in italiano e cercare di capirlo bene, parola per parola,
    se non riesci a leggere probabilmente fai qualcosa di diverso da quello che è scritto li
    (che effettivamente è piuttosto confuso, l’ho letto più volte e ancora non riesco a capire alcune frasi)

    Ho visto che a pagina 8 del data-sheet c’è un esempio in C e dovrebbe essere abbastanza semplice tradurlo in Proton-basic.
    Hai provato a scriverlo e vedere cosa fa?

    #8067
    Picmicro675Picmicro675
    Moderatore

    Ciao Ther
    > Hai provato a scriverlo e vedere cosa fa?
    Tradotto l’ho anche tradotto. Ho migliorato anche il caso che si blocca ad aspettare che il DOUT (dato pronto) non cambia. Ho messo il timeout almeno se ci sono errori sconosciuti ci si riesce a venirne via.

    Sub readHX711
        Clear timed_out                 ' reset the flag
        Clear avrg                      ' average variable counter
        Clear cnti                      ' reset value
        Clear ADSK                      ' lowering the clock pin
        ' next instruction gives a little delay before reading the input
        Clear cntn                      ' reset value
        Repeat                          ' loop over the wanted samples
          While ADDO = 1                ' probing the data pin to wait the start
            If cnti < 250 Then          ' counting a time-out in case the cell fails
              DelayUS 50                '  for one round
            Else                        ' if exceeds
              Set timed_out             ' flag a no ready signal
              Return                    ' leave the subroutine
            End If
            Inc cnti                    ' keep counting track
          Wend                          ' end of wait ADD0
          Clear coun                    ' resetting the variable for the result
          Clear cnti                    ' reset the counter
          Repeat                        ' counting for 24 bits
            Set ADSK                    ' ticking the serial clock
            coun = coun << 1            ' shift left the variable
            Clear ADSK                  ' reset the clock
            coun.0 = ADDO
            Inc cnti                    ' keep counting track
          Until cnti > 23               ' loop for the next bit
          Clear ADSK                    ' reset the clock (ending communication)
          @Nop                          ' a small delay
          Set ADSK                      ' reset the clock high
          avrg = avrg + coun - offset   ' sum the sample to the average value
          Inc cntn
        Until cntn >= MAXSAMPLES
        coun = avrg / MAXSAMPLES        ' calculate the average
    EndSub
    

    Per la cronaca eccola qui. Ho aggiunto anche una media che si definisce nella testata del programma quanti cicli fare (al momento ne ho dati 40, ma abbiamo la possibilità di andare fino a 255).
    Tenuto conto che l’ offset è da calcolare il punto di zero che include il valore di tara. In maniera teorica lo zero è a VCC/2 e sarebbe 2^23. Per quello meno di quello sarà negativo.
    Ancora non ho fatto le prove fisiche, solo una simulazione e non ho idea esattamente se sono valori razionali. Sarei curioso di capire cosa si può fare con il GAIN che poi non è letto durante i 25 bit, credo. Piuttosto dovrebbe dare l’informazione per il ciclo successivo.
    Ad ogni modo ho il PIC e arduino per fare delle prove, manca solo la voglia di mettere insieme un prototipo. Andrò un po per le lunghe.

    Ho visto qualcosa del sorgente e si vede l’uso dell’SPI per la comunicazione. Per quello che sto facendo si usa solo un bit banging (come in arduino del resto) e si sta bene con una frequenza se tenuto il clock nei limiti descritti dal foglio dati. Poi il resto dei componenti e come l’esempio dei fogli dati e ho preso il modulino.

    Grazie delle informazioni…

    Devo solo mettermi alla prova

    • Questa risposta è stata modificata 5 mesi, 1 settimana fa da Picmicro675Picmicro675.
    • Questa risposta è stata modificata 5 mesi, 1 settimana fa da Picmicro675Picmicro675.
    #8070
    Avatartheremino
    Amministratore del forum

    La frase “Ho il modulino con HX711 e non sono riuscito bene a ricavare dati sicuri” mi aveva ingannato e pensavo non riuscissi a leggere per qualche errore.
    Invece (spero stavolta di aver capito giusto) stai mettendo insieme il firmware ma non lo hai ancora provato.

    Riguardo al firmware gli ho dato una occhiata e mi sembra tutto OK.
    Hai fatto attenzione anche ai particolari e probabilmente quando lo proverai funzionerà.

    Se ci saranno problemi scrivili qui e cercherò di aiutarti,
    ma non sperare troppo su di me perché non conosco quei moduli e nemmeno il PIC che usi
    e poi è difficile fare queste cose a distanza, senza vedere i segnali ecc…

    #8074
    Picmicro675Picmicro675
    Moderatore

    Grazie per il tuo supporto.
    Come PIC, non ci sono limiti, si può spaziare con una vasta gamma di modelli. Si fa uso solo di software e non implica altro che due pin. Dovrei magari verificare se i tempi di comunicazione sono nei limiti dei 60 uS dopo il fronte di salita del clock, altrimenti si spegne il dispositivo.
    Per questo ci potrebbe essere anche uno sviluppo per Theremino e farne una piccola routine da utilizzare con questa interfaccia. Senza contare invece quella NAU 7802 che ha una interfaccia I2C. Comunque quest’ultima è sempre a 24bit.
    Forse ci si può avvicinare con interfaccia SPI, con un uS di spazio per un bit, si arriva al massimo a 500 Kbit/s.

    #8079
    Avatartheremino
    Amministratore del forum

    Purtroppo aggiungere componenti del genere al nostro sistema richiederebbe anche di modificare l’HAL e sarebbe un lavoro troppo lungo rispetto ai vantaggi. Abbiamo già impiegato mesi per collegare l’Adc24 di Analog Device, che ha 16 canali, e che oltre alle celle di carico può fare di tutto..

    Comunque è possibile utilizzare sia lo HX711 che il NAU 7802 con il sistema theremino, in modo semplice ed economico:
    – Prima soluzione – Programmare un Arduiino Nano con l’IDE di Arduino e collegarlo al PC con la nostra applicazione ArduHAL
    – Seconda soluzione (wireless) – Programmare un ESP32 con l’IDE di Arduino e collegarlo al PC con la nostra applicazione IotHAL

    Ci sono librerie già pronte sia per il Nano che per lo ESP32
    https://www.arduinolibraries.info/libraries/hx711-arduino-library
    https://platformio.org/lib/show/7083/Adafruit%20NAU7802%20Library

    E da qui si scaricano le nostre due applicazioni
    https://www.theremino.com/downloads/foundations#arduhal
    https://www.theremino.com/downloads/foundations#iothal

    #8392
    Picmicro675Picmicro675
    Moderatore

    > Abbiamo già impiegato mesi per collegare l’Adc24 di Analog Device, che ha 16 canali,
    Beh, direi che il modulo fa lo stesso lavoro. Una uscita speciale per spegnere la cella di carico, quando non si usa, ma poi due canali ADC da 24bit. Lo zero si pone a 12bit, in pratica un valore che metà sarà considerato negativo.
    Allora per il vostro lavoro, lasciando stare il modulino, si potrebbe anche usare ADC vostro. Con un risultato di tutto rispetto. Poi sono da vedere se ci sono particolari accorgimenti per la stabilità e/o reiezione ai rumori.

    Un’altra curiosità:
    Ho utilizzato, per la prima volta, un 16F877A, mi sembra che non funziona. Però ho il sospetto che il MCLR ci vuole tenuto alto. Non mi sembra che ci sia nella configurazione il modo di disabilitarlo. Dico bene?
    Vabbé, poi faccio le prove….

    #8394
    Avatartheremino
    Amministratore del forum

    In tutti i PIC il MCLR va tenuto alto, altrimenti si resettano di continuo.
    Di solito lo si tiene alto collegandolo al positivo con un resistore in modo da poterlo anche abbassare all’occorrenza.
    Sembrerebbe però che si possa disabilitare la funzione MCLR e usare il PIN 3 come Digital I/O.

    A pagina 144 del datasheet scrivono:
    REGISTER 14-1: CONFIGURATION WORD (ADDRESS 2007h)(1)
    bit 7 LVP: Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit
    1 = RB3/PGM pin has PGM function; low-voltage programming enabled
    0 = RB3 is digital I/O, HV on MCLR must be used for programming

    Quindi, se ho capito bene, basterebbe abbassare a zero il BIT 7 del registro di configurazione per disabilitarlo.

    Abbassare a zero il BIT 7 del registro di configurazione va fatto durante la programmazione
    con il programmatore che conosco (PicKit2) si disabiliterebbe il “LowVoltage Programming”
    con altri programmatori dovrebbe esserci una voce simile.

Stai visualizzando 8 post - dal 1 a 8 (di 19 totali)
  • Devi essere connesso per rispondere a questo topic.