.: robotitaly.NET :. - la community italiana sulla robotica  

Vai indietro   .: robotitaly.NET :. - la community italiana sulla robotica > Robotica > Robotica Generale

Robotica Generale Questo Forum e' dedicato agli argomenti di Robotica Generale che comprende, quindi, sia la Meccanica che l'Elettronica.

Rispondi
 
Strumenti della discussione Modalità di visualizzazione
  #1  
Vecchio 08-25-2015, 01:22 PM
L'avatar di Emanuele Terrasi
Emanuele Terrasi Emanuele Terrasi non è collegato
Roboter Graduato
 
Registrato dal: Dec 2009
residenza: Palermo
Messaggi: 494
Blog Entries: 15
predefinito Comunicazione con giroscopio elettronico

Vorrei acquistare un modulino con giroscopio elettronico ma poi non vorrei rimanere impantanato nei problemi della comunicazione SPI o I2C con la mia MCU programmata in C o in Basic.
Ho scaricato questo datasheet del chip sensore base che è contenuto nel modulino:
http://dlnmh9ip6v2uc.cloudfront.net/...Axis/17116.pdf
ma mi pare che usi i nomi simbolici dei registri, non gli indirizzi hardware assoluti, perciò all'atto pratico mi chiedo come farò a configurare i registri del sensore, per disabilitare la coda FIFO in uscita o usare varie altre opzioni. Una dritta?
Rispondi quotando
  #2  
Vecchio 08-26-2015, 07:05 AM
L'avatar di guiott
guiott guiott non è collegato
Roboter Graduato
 
Registrato dal: Jan 2008
residenza: Roma
Messaggi: 502
predefinito

Ho dato un'occhiata veloce al DS. Mi sembra che, come la maggior parte dei device I2C, funzioni con lo stesso protocollo delle EEPROM. Se vuoi scrivere su un registro devi iniziare una scrittura ed indicargli il puntatore del registro sul quale vuoi scrivere, i dati successivi saranno quelli da scrivere da quell'indirizzo in poi con un autoincremento del puntatore ad ogni scrittura, fino allo stop.
In modo simile per la lettura. Devi comunque iniziare il protocollo con una scrittura nella quale indichi l'indirizzo del registro iniziale. Poi passi in lettura, ogni lettura autoincrementa il puntatore a partire da quel valore e quindi puoi leggere in sequenza più byte.
__________________
ciao
Guido
-------
www.guiott.com
Rispondi quotando
  #3  
Vecchio 08-26-2015, 02:15 PM
L'avatar di Emanuele Terrasi
Emanuele Terrasi Emanuele Terrasi non è collegato
Roboter Graduato
 
Registrato dal: Dec 2009
residenza: Palermo
Messaggi: 494
Blog Entries: 15
predefinito

Benissimo. Intanto ho scovato questo modulino:
http://www.robot-italy.com/it/adafru...d-lsm9ds0.html
che adopera come sensore un chip forse meglio documentato nel datasheet come indirizzi dei registri, senza bisogno di file descrittori. Ma provare per credere..
Rispondi quotando
  #4  
Vecchio 09-17-2015, 07:50 AM
L'avatar di Emanuele Terrasi
Emanuele Terrasi Emanuele Terrasi non è collegato
Roboter Graduato
 
Registrato dal: Dec 2009
residenza: Palermo
Messaggi: 494
Blog Entries: 15
predefinito

Mi trovo in difficoltà totale ma sono sicuro che mi caverete di impiccio.
Il mio scopo è leggere i dati dalla IMU e metterli in variabili di memoria common, aggiornando i valori in modo automatico tramite ISR in tempo reale con la migliore velocità possibile, affinchè il main possa girare indipendentemente attingendo i valori aggiornati dalle rispettive variabili.
In realtà riesco a leggere dei valori del tutto casuali e non capisco il motivo.
Però riesco a scrivere qualcosa in un registro e poi a rileggerla esattamente, perciò non è che sono poi totalmente fuori strada.
Adesso sto notando che nel datasheet del sensore montato nei modulini Adafruit, recentemente quì acquistati:
http://www.adafruit.com/datasheets/LSM9DS0.pdf
un registro di configurazione del giroscopio: CTRL_REG1_G (20h) ed un registro di configurazione dell'accelerometro: CTRL_REG1_XM (20h) rispettivamente a pag. 41 e pag.55, hanno lo stesso indirizzo hardware (sub address per il protocollo I2C) cioè appunto 20h. E' mai possibile? C'è un errore nel datasheet?
Poi ho tantissimi altri problemi sul protocollo I2C appunto, ma intanto vorrei andare sul sicuro almeno con gli indirizzi.. grazie sempre.

P.S.Chiedo venia, ho capito che i sub-address possono essere uguali perchè i device address sono diversi. Mi rimangono gli altri problemi per cui farò un altro post.

Ultima modifica di Emanuele Terrasi; 09-17-2015 a 03:38 PM Motivo: P.S.
Rispondi quotando
  #5  
Vecchio 09-19-2015, 03:46 PM
L'avatar di Emanuele Terrasi
Emanuele Terrasi Emanuele Terrasi non è collegato
Roboter Graduato
 
Registrato dal: Dec 2009
residenza: Palermo
Messaggi: 494
Blog Entries: 15
predefinito

Bene, non è che sia proprio tutto chiarissimo al 100% comunque la lettura che mi interessava adesso funziona bene, anzi se qualcuno fosse interessato posso postare il codice in C che è monolitico e non richiede librerie.
Rispondi quotando
  #6  
Vecchio 09-21-2015, 02:37 PM
L'avatar di Emanuele Terrasi
Emanuele Terrasi Emanuele Terrasi non è collegato
Roboter Graduato
 
Registrato dal: Dec 2009
residenza: Palermo
Messaggi: 494
Blog Entries: 15
predefinito

Quote:
Originariamente inviata da guiott Visualizza il messaggio
In modo simile per la lettura. Devi comunque iniziare il protocollo con una scrittura nella quale indichi l'indirizzo del registro iniziale. Poi passi in lettura, ogni lettura autoincrementa il puntatore a partire da quel valore e quindi puoi leggere in sequenza più byte.
Se voglio sempre rifare la stessa lettura (magari il valore va cambiando) debbo ogni volta nuovamente mandare start e poi stop, o c'è modo di risparmiare questi passi cioè mandare un solo start all'inizio delle letture?
Rispondi quotando
  #7  
Vecchio 09-30-2015, 03:32 PM
L'avatar di Emanuele Terrasi
Emanuele Terrasi Emanuele Terrasi non è collegato
Roboter Graduato
 
Registrato dal: Dec 2009
residenza: Palermo
Messaggi: 494
Blog Entries: 15
predefinito

Scusa ma mi trovo ancora in difficoltà. Le letture dei dati dagli accelerometri e dai giroscopi vengono continuamente ripetute e funzionano sempre bene, invece la scrittura dei registri di configurazione della IMU, che avviene una volta soltanto all'accensione, ha un comportamento casuale: riaccendendo per tante volte va bene ma qualche volta si blocca e pertanto blocca anche le letture successive.
La scrittura si compone di tanti passi (anche perchè i registri da configurare sono parecchi) che vanno avanti quando ricevono gli interrupt dalla unità I2C master della MCU. Mi è stato consigliato di lasciar perdere gli interrupt e basarmi sul tempo trascorso, ma ancora non sono riuscito e mi pare una soluzione ancora più complicata da programmare in C.
Riporto un passo dal reference manual della MCU che è dsPic33:
The MI2CxIF interrupt is generated on completion of the following master message events:
• Start condition
• Stop condition
• Data transfer byte transmitted or received
• Acknowledge transmit
• Repeated Start
• Detection of a bus collision event.

Dunque dopo aver mandato un dato (anche un address o sub-address?)
dobbiamo aspettarci un interrupt e quindi testare il bit di acknowledge
in un registro della MCU? Sto farneticando?

P.S. Giocando coi timer nella parte iniziale del programma (o usando un interruttore di migliore qualità) pare che il problema non si verifichi più, allora era dovuto a qualche asincronia nelle alimentazioni.. tuttavia non mi dispiacerebbe capire un po' meglio come si deve usare 'sto benedetto protocollo.

Ultima modifica di Emanuele Terrasi; 09-30-2015 a 05:32 PM Motivo: Forse risolto
Rispondi quotando
Rispondi

Segnalibri

Strumenti della discussione
Modalità di visualizzazione

Regole d'invio
Non puoi inserire discussioni
Non puoi inserire repliche
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è attivo
Le smilie sono attive
Il codice IMG è attivo
il codice HTML è disattivato

Salto del forum


Tutti gli orari sono GMT. Attualmente sono le 06:28 PM.


Powered by vBulletin versione 3.8.7
Copyright ©: 2000 - 2018, Jelsoft Enterprises Ltd.