- Messaggi: 23
- Ringraziamenti ricevuti 0
Interrupt e bus I2C
12 Anni 7 Mesi fa #1
da Scollo
Interrupt e bus I2C è stato creato da Scollo
Salve a tutti,
volevo sottoporre alla comunità una problematica che mi si è presentata durante la costruzione di un prototipo di robot. Premetto che ho preso spunto dal robot presentato in questo sito, il robottino domotico. Il mio sitema è dotato di:
- una coppia di motori con encoder+ ruote;
- un driver con pilotaggio tramite bus I2C;
- un sensore di distanza ad ultrasuoni (SRF08) sempre su bus I2C;
- un servo (+90° -90°) che sostiene il sensore;
- una scheda Freedon II;
- un pacco batterie;
- una struttura meccanica per provare.
Inizalmente ho collegato il sensore in maniera fissa, senza servo, e sono riuscito a fare andare il robot, infatti ogni volta che veniva visto un ostacolo dal sensore, il robot ruotando provvedeva ad evitarlo.
Funzionava in maniera accettabile, anche se bisognava regolare tempi e velocità in base agli ambienti in cui doveva muoversi.
Come avevo anticipato prendendo spunto da robottino domotico, ho comprato un servo, e vi ho montato sopra il sensore ad ultrasuoni. Per far ruoatare il servo ho pensato di usare il timer0 e ad ogni overflow di chiamare l'interrupt, in questo modo regolando il contenuto dei registri TMR0H e TMR0L riesco a gestire la durata degli impulsi e quindi il servo lo posiziono a 0°, 90° e 180°.
Ad ogni posizionamento del servo provvedo a leggere il sensore ad ultrasuoni e a memorizzare i valori letti su tre variabili (dist_F, dist_Dx e dist_SX), infine elaboro con degli IF la situazione delle distanze e provvedo a pilotare il driver dei motori.
E qui le cose cominciano a funzionare male, i motori girano seguendo delle logiche non sempre corrispondenti a quelle impostate.
Faccio presente che motori e sensore più servo in maniera indipendente funzionano correttamente, nella programmazione ho usato le librerie di Laurtec (delay e eepromi2c, quest'ultima adattata perchè nel mio caso sensore e driver hanno un indirizzo ad un solo byte).
Ho il sospetto che se durante l'esecuzione delle funzioni dei comandi I2C si presenta un interrupt del servo il comando I2C, non funzioni correttamente, quindi situazione casuale.
Ho provato ad inibire gli interrupt, durante i comandi I2C, però in questo modo il servo non è controllato regolarmente.
Qualcuno che per caso avesse affrontato un caso simile potrebbe gentilmente darmi qualche consiglio.
Grazie anticipatamente.
volevo sottoporre alla comunità una problematica che mi si è presentata durante la costruzione di un prototipo di robot. Premetto che ho preso spunto dal robot presentato in questo sito, il robottino domotico. Il mio sitema è dotato di:
- una coppia di motori con encoder+ ruote;
- un driver con pilotaggio tramite bus I2C;
- un sensore di distanza ad ultrasuoni (SRF08) sempre su bus I2C;
- un servo (+90° -90°) che sostiene il sensore;
- una scheda Freedon II;
- un pacco batterie;
- una struttura meccanica per provare.
Inizalmente ho collegato il sensore in maniera fissa, senza servo, e sono riuscito a fare andare il robot, infatti ogni volta che veniva visto un ostacolo dal sensore, il robot ruotando provvedeva ad evitarlo.
Funzionava in maniera accettabile, anche se bisognava regolare tempi e velocità in base agli ambienti in cui doveva muoversi.
Come avevo anticipato prendendo spunto da robottino domotico, ho comprato un servo, e vi ho montato sopra il sensore ad ultrasuoni. Per far ruoatare il servo ho pensato di usare il timer0 e ad ogni overflow di chiamare l'interrupt, in questo modo regolando il contenuto dei registri TMR0H e TMR0L riesco a gestire la durata degli impulsi e quindi il servo lo posiziono a 0°, 90° e 180°.
Ad ogni posizionamento del servo provvedo a leggere il sensore ad ultrasuoni e a memorizzare i valori letti su tre variabili (dist_F, dist_Dx e dist_SX), infine elaboro con degli IF la situazione delle distanze e provvedo a pilotare il driver dei motori.
E qui le cose cominciano a funzionare male, i motori girano seguendo delle logiche non sempre corrispondenti a quelle impostate.
Faccio presente che motori e sensore più servo in maniera indipendente funzionano correttamente, nella programmazione ho usato le librerie di Laurtec (delay e eepromi2c, quest'ultima adattata perchè nel mio caso sensore e driver hanno un indirizzo ad un solo byte).
Ho il sospetto che se durante l'esecuzione delle funzioni dei comandi I2C si presenta un interrupt del servo il comando I2C, non funzioni correttamente, quindi situazione casuale.
Ho provato ad inibire gli interrupt, durante i comandi I2C, però in questo modo il servo non è controllato regolarmente.
Qualcuno che per caso avesse affrontato un caso simile potrebbe gentilmente darmi qualche consiglio.
Grazie anticipatamente.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Scollo
- Autore della discussione
- Junior Member
Riduci
Di più
12 Anni 7 Mesi fa #2
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Interrupt e bus I2C
Ciao,
effettivamente il problema che stai incontrando e' tipico.
Tutto funziona quando preso singolarmente ma poi ha problemi con l'integrazione del tutto.
Quando piu' periferiche concorrono per le risorse della CPU devi fare attenzione.
In particolare sfrutta i livelli delle priorita' e disattivale nei punti critici.
Dovrai andare attraverso il programma per trovare la falla...se lo hai scritto bene ed ordinato questo e' il momento per trarne vantaggi.
Non sottovalutare anche bachi e gestione degli errori delle periferiche (controlla i bit degli errori associati alle periferiche).
...perche' non posti una foto del Robot?
Saluti,
Mauro
effettivamente il problema che stai incontrando e' tipico.
Tutto funziona quando preso singolarmente ma poi ha problemi con l'integrazione del tutto.
Quando piu' periferiche concorrono per le risorse della CPU devi fare attenzione.
In particolare sfrutta i livelli delle priorita' e disattivale nei punti critici.
Dovrai andare attraverso il programma per trovare la falla...se lo hai scritto bene ed ordinato questo e' il momento per trarne vantaggi.
Non sottovalutare anche bachi e gestione degli errori delle periferiche (controlla i bit degli errori associati alle periferiche).
...perche' non posti una foto del Robot?
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
12 Anni 7 Mesi fa #3
da Scollo
Risposta da Scollo al topic Re: Interrupt e bus I2C
Ciao Mauro,
qualche giorno fa sono riuscito a risolvere quel problema. Il tutto era dovuto al fatto che il driver dei motori non riceveva comandi I2C in sequenza, infatti inserendo un piccolo ritardo tra i due write il tutto funziona correttamente.
Faccio presente che sono ancora in una fase sperimentale e il prototipo che sto usando è molto rozzo, comunque prometto che prossimamente posterò una foto.
Come al solito grazie della collaborazione e Saluti.
Scollo Giovanni
qualche giorno fa sono riuscito a risolvere quel problema. Il tutto era dovuto al fatto che il driver dei motori non riceveva comandi I2C in sequenza, infatti inserendo un piccolo ritardo tra i due write il tutto funziona correttamente.
Faccio presente che sono ancora in una fase sperimentale e il prototipo che sto usando è molto rozzo, comunque prometto che prossimamente posterò una foto.
Come al solito grazie della collaborazione e Saluti.
Scollo Giovanni
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Scollo
- Autore della discussione
- Junior Member
Riduci
Di più
- Messaggi: 23
- Ringraziamenti ricevuti 0
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.