Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/ognigiorno.com/wp-content/plugins/math-comment-spam-protection/math-comment-spam-protection.php:1) in /var/www/html/ognigiorno.com/wp-includes/rest-api/class-wp-rest-server.php on line 1673 {"id":245,"date":"2009-03-28T00:08:42","date_gmt":"2009-03-27T23:08:42","guid":{"rendered":"http:\/\/www.ognigiorno.com\/?p=245"},"modified":"2011-03-13T21:28:15","modified_gmt":"2011-03-13T20:28:15","slug":"routine-i2c-per-controllori-pic-implementate-in-c","status":"publish","type":"post","link":"https:\/\/www.ognigiorno.com\/2009\/03\/28\/routine-i2c-per-controllori-pic-implementate-in-c.html","title":{"rendered":"Routine I2C per controllori PIC implementate in C"},"content":{"rendered":"

Lavorando con i PIC possiamo aver bisogno di utilizzare il protocollo I2C dovendolo implementare a basso livello in C o in assembler (bit banging). Questo capita se lavoriamo con un controllore di fascia base che non offre nativamente tale funzionalit\u00e0.<\/p>\n

Purtroppo mi sono trovato in questa necessit\u00e0 e le routine fornite di esempio con il compilatore PICC di Hitech (il compilatore che utilizzo di solito) non sono riuscito a farle funzionare. Non so se perch\u00e9 errate, o se per colpa dell\u2019ottimizzazione che nella versione freeware non \u00e8 garantita.<\/p>\n

<\/p>\n

Lavorando a basso livello \u00e8 infatti avere la massima ottimizzazione.
\nPazienza: dovendo lavorare con il 16F506 per il mio progetto, le ho dovute riscrivere. Il file i2c.h \u00e8 scaricabile qui<\/a> e contiene il codice che implementa le funzioni di base in linguaggio C.
\nVa notato l\u2019utilizzo del registro TRIS. Essendo un registro in sola scrittura nel 16F506, per valorizzarlo ho utilizzato una variabile di appoggio in cui memorizzo il valore (m_TRIS). Con processori differenti \u00e8 necessario modificare la gestione del registro. Per questo motivo nel file si trova nella parte iniziale e modificabile agendo sulle definizioni di SCL_IN, SCL_OUT, SDA_IN e SDA_OUT.
\nEcco un esempio di come utilizzare la libreria:
\ni2c_init();<\/p>\n

i2c_start();
\ni2c_tx(0xA2);
\ni2c_tx(0x02);
\ni2c_tx(0x00);
\ni2c_stop();
\n<\/code>
\nL\u2019esempio riportato mostra come scrivere un valore nella EEPROM. La lettura avviene in modo analogo:
\ni2c_start();
\ni2c_tx(0xA2);
\ni2c_tx(0x02);<\/p>\n

i2c_start();
\ni2c_tx(0xA3);
\n Putch (i2c_rx(1));
\n Putch (i2c_rx(1));
\n Putch (i2c_rx(0));
\ni2c_stop();
\n<\/code>
\nQuesto codice invece legge dalla memoria e trasmette i valori letti sulla seriale utilizzando le librerie RS232
qui descritte<\/a><\/p>\n

Con questa libreria \u00e8 possibile quindi controllare tutti i dispositivi I2C (RTC, memorie EEPROM, \u2026)<\/p>\n","protected":false},"excerpt":{"rendered":"

Lavorando con i PIC possiamo aver bisogno di utilizzare il protocollo I2C dovendolo implementare a basso livello in C o in assembler (bit banging). Questo capita se lavoriamo con un controllore di fascia base che non offre nativamente tale funzionalit\u00e0. Purtroppo mi sono trovato in questa necessit\u00e0 e le routine fornite di esempio con il… Read More »Routine I2C per controllori PIC implementate in C<\/span><\/a><\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":""},"categories":[5],"tags":[31,32,77,64,76,19],"_links":{"self":[{"href":"https:\/\/www.ognigiorno.com\/wp-json\/wp\/v2\/posts\/245"}],"collection":[{"href":"https:\/\/www.ognigiorno.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ognigiorno.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ognigiorno.com\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ognigiorno.com\/wp-json\/wp\/v2\/comments?post=245"}],"version-history":[{"count":0,"href":"https:\/\/www.ognigiorno.com\/wp-json\/wp\/v2\/posts\/245\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.ognigiorno.com\/wp-json\/wp\/v2\/media?parent=245"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ognigiorno.com\/wp-json\/wp\/v2\/categories?post=245"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ognigiorno.com\/wp-json\/wp\/v2\/tags?post=245"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}