Pages: [1] 2   Go Down
Author Topic: Indirizzamento dei pcf8574  (Read 1396 times)
0 Members and 1 Guest are viewing this topic.
Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 380
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti, è il mio primo post,
spero nel vostro aiuto, premetto di essere un principiante e quindi spero anche nella vostra pazienza:

Il mio problema è dovuto alla mia ignoranza, infatti non riesco a capire come si determina un indirizzo dei chip nel titolo,
dal loro datasheet infatti, (pag. 9), non riesco a capire come al variare di a0, a1 e a3, si deteminano poi gli indirizzi che poi in molt1 sketch ho trovato come p.e. 0x38 per la versione AP per esempio quando tutte le A sono a 0, in effetti io ho uasto 0x38 per il mio pcf8574ap interfacciato con un display, usando lo schemino che spesso si vede in giro nel forum, quello con lo sfondo a quadretti per intenderci.

In pratica come si converte?
avete un link dove lo possa studiare e capire possibilmente in italiano?

Poi se voglio mettere ad esempio A0 ad 1, e sufficiente collegarlo ai 5v o serve una resistenza?
E ancora le pull/up su sda e scl sono necessarie molti non le usano altri si e pre valore adottano i 4,7k perché?

La mia idea poi è di usare un secondo pcf per i tasti di imput, questi ultimi quindi li collego ai vari p0, p1, .... con i 5v direttamente per dargli un 1 in entrata o devo usare delle resitenze?

Mi scuso in anticipo per le molte domande, e ringrazio chiunque abbia la pazienza di rispondere e soprattutto tempo da dedicarmi, il fatto è che fino ad ora usavo con successo i tasti collegati direttamente all'arduino, ma ho bisogno di pin liberi e il pcf mi sembrava una buona idea, solo che non ci ho capito molto... smiley-confuse
Logged

Riccardo

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 336
Posts: 23142
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Generalmente i dispositivi I2C hanno un indirizzo composto da una parte fissa e da una variabile, impostabile tramite pin. Il pcf8574a ho visto nel datasheet che "dovrebbe" usa un sistema ad 8 bit: 5 bit fissi e 3 variabili, determinati da A0, A1 e A2.
0111xxx0

Però c'è qualcosa che non torna. Secondo tale formato, per usare il primo indirizzo valido, ossia 01110000, dovresti usare 0x70 e non 0x38. Questo infatti è dato dal binario 00111000, che parrebbe più logico appartenere al primo esempio nel pdf, quello relativo al pcf8574 non "a".
Logged


BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21939
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

sono 7 Bit non 8. l' ottavo Bit é per determainare se la trasmissione é scrivente o per leggere.
Percui i bit 6 a 3 sono fissi 0111 e i bit 2 a 0 sono determinate dalle entrate. Basta collegarli a massa o a +5V.
Se metti A0 a H, A1 e A2 a L l' indirizzo sará 0X39 ecc
Ciao Uwe
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 336
Posts: 23142
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Però lui ha detto di avere il PCF8574AP, che secondo il PDF usa 8 bit indirizzo e non 7....
Logged


BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21939
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

L' indirizzo I2C é sempre a 7 Bit. Hai ragione che sul PDF della Philips viene suggerito che l'A abbia 8 Bit, ma é sbagliato. La differenza é solo la parte fissa del indirizzo perché cosí si possono usare 16 integrati sullo stesso bus. (8 versioni normali e 8 Versioni A)
Comunque se ci sono dubbi sull'indirizzo giusto basta collegare l'integrato e usare il I2C scanner http://todbot.com/blog/2009/11/29/i2cscanner-pde-arduino-as-i2c-bus-scanner/ ( non só perché lo scanner scanerizza solo fino a 100 e non fino 128).
Ciao Uwe
« Last Edit: April 02, 2011, 04:36:13 pm by uwefed » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 336
Posts: 23142
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

L' indirizzo I2C é sempre a 7 Bit.

E' vero, non ci pensavo...  smiley-roll-blue

Quote
non só perché lo scanner scanerizza solo fino a 100 e non fino 128

Bella domanda....
Logged


Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 380
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vi sto leggendo, ma ancora non capisco da dove tirate fuori i numeri, penso all'esempio di uwefed, se la parte fissa è 0111 e come tu dici il seguito è 001, ho un numero binario di 7 posizioni come questo: 0111001.
La domanda è da dove esce 0x39?
E' forse 011=3 e 1001=9
E' lo 0 prima della x che determina la lettura o la scrittura?
Se è così allora 0 scrive quindi i segnali escono dai pin da p0 a p7
e con 1 legge dai pin da p0 a p7?
e se voglio leggere e scrivere con un solo pcf, come faccio?

P.S. Approfitto per ingraziare entrambi, non solo per avermi risposto in questa occasione, ma perché molto di quello che ho imparato fino ad ora, l'ho imparato leggendovi costantemente e giornalmente, grazie infinite davvero. smiley-lol smiley-lol smiley-lol smiley-lol
Logged

Riccardo

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 336
Posts: 23142
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

0111000b=0x38

E' logica binaria  smiley-wink

http://it.wikipedia.org/wiki/Numero_binario
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 336
Posts: 23142
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai letto quella pagina della Wiki? Spiega bene come convertire da binario a decimale, meglio di quanto possa fare io  smiley-lol

Per usare un solo PCF basta mettere a GND i 3 pin A0, A1 e A2 così da creare l'indirizzo 0x38. Se tu avessi 2 PCF, metteresti il secondo a GND, GND, 5V così da creare l'indirizzo 0x39. A questo punto per indicare il primo chip userai l'indirizzo 0x38, per il secondo l'altro. Solo il chip corrispondente si attiverà e riceverà i comandi dall'Arduino.

PS:
0x è una convenzione per indicare che il numero che segue è in notazione esadecimale. Avrei potuto scrivere $38, che è sempre un numero in notazione esadecimale.
Quindi 0x38 equivale a 56: ossia (16*3)+8.
Logged


BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21939
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

E' forse 011=3 e 1001=9
giusto
Quote
E' lo 0 prima della x che determina la lettura o la scrittura?

0x vuol dire Esadecimale
come B01010101 é un numero binario
Se vuoi convertire i numeri puoi anche usare la calcolatrice di Windows in modalitá estesa,basta scrivere il numero e convertirlo in Hex, Dez, Okt o Bin.
Ciao Uwe
Logged

Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 380
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie uwefed, e di nuovo grazie per le infinite risposte e la disponibilità che sempre profondi in lungo e in largo nel forum, persino in tedesco ho visto (ma sei di questo pianeta? o rispondi da chissa dove?)
Ora mi è chiaro come si indirizza, ma ancora non ho avuto risposte sulle altre domande, forse perché le risposte sembrano ovvie per alcuni, ma vi assicuro che per me non lo sono  smiley-sad :

Le resistenze di pull/up su sda e scl sono necessarie molti non le usano altri si e per valore adottano i 4,7k perché?

Vorrei usare un secondo pcf per i tasti di imput, questi ultimi quindi li collego ai vari p0, p1, .... con i 5v direttamente per dargli un 1 in entrata o devo usare delle resitenze per attenuare i 5v?

Grazie in anticipo per il tempo che vorrete dedicarmi  smiley-lol

Riccardo
Logged

Riccardo

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21939
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Le resistenze su sda e scl servono. Il loro valore dipende dalla capacitá di sda e scl verso massa. Spesso con piste corte basta la resistenza pull up interna al Arduino cxhe vengono attivate dalla libreria. Se ne metti 2 da 4,7kOhm non guasta.

Per i pulsanti sul secondo PCF; devi mettere delle resistenza pull up o pull down come su quelle di arduino.
Ciao Uwe
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 336
Posts: 23142
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

PS:
hai visto questo link?
http://arduino.cc/playground/Code/I2CPortExpander8574
Logged


Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 380
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Le resistenze su sda e scl servono. Il loro valore dipende dalla capacitá di sda e scl verso massa. Spesso con piste corte basta la resistenza pull up interna al Arduino cxhe vengono attivate dalla libreria. Se ne metti 2 da 4,7kOhm non guasta.

Per i pulsanti sul secondo PCF; devi mettere delle resistenza pull up o pull down come su quelle di arduino.
Ciao Uwe


Grazie infinite, procedo e se ho ancora problemi, mi dispiace ma dovrò disturbare ancora.

Riccardo
Logged

Riccardo

Rome
Offline Offline
Sr. Member
****
Karma: 9
Posts: 380
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


No non lo avevo mai visto,
brutalizzo Arduino e vi assicuro che nel mio caso è proprio così, da appena tre mesi e malgrado abbia  navigato molto nel playground, su questo link non ero mai capitato, l'ho appena letto ed e molto interessante,
grazie infinite.

Riccardo
Logged

Riccardo

Pages: [1] 2   Go Up
Jump to: