-
AutorePost
-
9 Aprile 2020 alle 14:42 #8037
Picmicro675
PartecipanteCiao 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.10 Aprile 2020 alle 10:35 #8041theremino
Amministratore del forumCiao 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.0I 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-sheetPer 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?12 Aprile 2020 alle 17:01 #8067Picmicro675
PartecipanteCiao 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 3 anni, 8 mesi fa da
Picmicro675.
-
Questa risposta è stata modificata 3 anni, 8 mesi fa da
Picmicro675.
12 Aprile 2020 alle 19:16 #8070theremino
Amministratore del forumLa 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…13 Aprile 2020 alle 5:50 #8074Picmicro675
PartecipanteGrazie 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.13 Aprile 2020 alle 9:25 #8079theremino
Amministratore del forumPurtroppo 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 IotHALCi 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%20LibraryE da qui si scaricano le nostre due applicazioni
https://www.theremino.com/downloads/foundations#arduhal
https://www.theremino.com/downloads/foundations#iothal22 Aprile 2020 alle 15:11 #8392Picmicro675
Partecipante> 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….22 Aprile 2020 alle 18:45 #8394theremino
Amministratore del forumIn 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 programmingQuindi, 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. -
Questa risposta è stata modificata 3 anni, 8 mesi fa da
-
AutorePost
- Devi essere connesso per rispondere a questo topic.