Pages: [1]   Go Down
Author Topic: I2C è "bloccante" ?  (Read 433 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

stavo cercando un "qualcosa" che fa comunicare 2 atmega 328   che non blocchi (anche se per poco)
l'esecuzione dello sketc  nel ricevente, 
la seriale ho gia visto che blocca anche le cose che adoperano gli interrupt bloccano

volevo tentare con I2C   e volevo sapere se comunica in maniera "liscia"
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Cosa vuol dire che la seriale "blocca" ? Nelle ultime versioni anche l'invio è interrupt-based.

Gli interrupt bloccano ? O_o

Girovagando ho trovato questi:

http://arduino.cc/en/Tutorial/MasterWriter

http://www.billporter.info/2011/05/30/easytransfer-arduino-library/
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 129
Posts: 9468
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

la seriale ho gia visto che blocca anche le cose che adoperano gli interrupt bloccano

Con un AVR te lo scordi di non bloccare l'esecuzione del programma quando devi gestire i dati in arrivo da un bus, non importa se UART/SPI o I2C, dovrai sempre avere una ISR dedicata che esegue tutte le necessarie operazioni per ricevere il dato dalla periferica e gestirlo come serve.
Solo un processore dotato di DMA può ricevere, senza interrompere l'esecuzione del programma, una certa quantità di dati prima di avvisare la CPU che il pacchetto è pronto, e anche in questo caso il programma si deve fermare per gestire l'evento.
In tutti i casi l'I2C su Arduino è altamente bloccante, addirittura in caso di errori ti pianta letteralmente il micro, questo perché le relative routine sono state scritte basandosi sul polling, tramite while(), di determinati registri della I2C che se per un qualche motivo non raggiungono il valore atteso portano ad un loop di attesa eterno.
La seriale, UART hardware e non l'emulazione software, è il modo migliore per limitare le attese, viene gestita tramite interrupt e la gestione di ogni singola transazione richiede poco più di due us, la velocità media della loop() di Arduino è bassa, dipende molto da cosa contiene, ma anche nella migliore delle ipotesi, ciclo vuoto, richiede diversi us per essere eseguita quindi non vedo dove sta il problema.
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

la seriale ho gia visto che blocca anche le cose che adoperano gli interrupt bloccano
che il pacchetto è pronto, e anche in questo caso il programma si media della loop() di Arduino è bassa, dipende molto da cosa contiene, ma anche nella migliore delle ipotesi, ciclo vuoto, richiede diversi us per essere eseguita quindi non vedo dove sta il problema.

avevo usato 2 atmega uno fa il multiplex per i led 7 segmenti  e funziona benissimo ( amio parere)

e l'altro atmega 328 si occupa  di trovare il numero da visualizzare e di inviarlo (o aggiornarlo se è necessario)  all'atmega che pilota i display
solo che adesso ho visto che piu o meno tutte le volte che il ricevente riceve   si blocca per pochissimo
e spegne i display mentre riceve  creando un effetto fastidioso  sulla visualizzazione che voglio elimare

Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Pages: [1]   Go Up
Jump to: