Go Down

Topic: MCP23S17 per comandare dei relay (Read 4 times) previous topic - next topic

gamby

Di nuovo alle prese con il famoso MCP23S17...
Ormai è passato parecchio tempo da quando avevo fatto svariate prove con SPI e Slave Select. Avevo compreso abbastanza a fondo il funzionamento del comando di slave select della libreria con l'assegnazione tramite PORTB. Sfruttando il pin 53 del mega come Slave Select (appunto il pin SS predefinito) avevo ottenuto un funzionamento corretto e stabile. Avevo anche eseguito un buon numero di test con i vari comandi messi a disposizione dalla libreria ottenendo risultati positivi.

Ora per proseguire il progetto ho bisogno di spostare il pin di Slave Select di questo MCP su un altro pin, poichè il 53 è occupato dalla shield di uno schermino LCD.
Ho scelto per ora il "Digital pin 4" che sul ATMEGA 2560 corrisponde a PG5...

Detto fatto: ho sostituito nella libreria le due assegnazioni per abilitare e disabilitare il pin 5 della porta G:
PORTB &= 0b11111110   -->   PORTG &= 0b11011111
PORTB |= 0b00000001   -->   PORTG |= 0b00100000

Così facendo però il mio MCP non funziona correttamente, ho degli scatti "random" sui relay, stessa situazione che si era creata quando non avevo impostato correttamente PORTB nei primi tentativi... Ma cosa sbaglio in questo caso???

leo72

In questa maniera cambi lo stato di tutti i pin della porta G, non solo del pin PG5, però.
Inoltre non imposti la direzione del pin prima, nel senso che all'avvio tutti i pin sono INPUT per cui mettendo su HIGH il pin non fai altro che attivare la pull-up interna.

Tu invece devi mettere il pin in OUTPUT prima, per cui devi scrivere 1 sul bit PG5 della porta G.
Code: [Select]
DDRG |= (1<<5); //imposta il pin come OUTPUT
PORTG &= ~(1<<5); mette il pin a LOW


Per riportarlo su HIGH:
Code: [Select]
PORTG |= (1<<5);

MauroTec

Purtroppo quel codice è pessimo, ma è gia una base su cui lavorare.
Io non posso occuparmene, o meglio se chiedi e spieghi nel dettaglio come deve gestire il pin SS lo possiamo fare modificabile e gestito meglio di come è adesso, qui le competenze non mancano, (manca il tempo) ma come vedi non bastano perchè è necessario capire il protocollo.
Io non ho indagato più di tanto sul protocollo, mi sono accorto per caso di quella #define non usata nel codice.

Però se ti metti a studiare il protocollo e vuoi una mano, dillo entro domani, perchè farò una altra settimana full-immersion tra IFace, IPlugin, IObserve ecc, ma nelle pause per riprendermi posso dedicarti tempo.

Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

gamby

Ringrazio entrambi per i consigli e la disponibilità. Purtroppo anche per me il tempo è poco, sto approfittando di un paio di giorni di ferie e del brutto tempo per riprendere in mano il progetto, ma in queste poche ore a disposizione preferisco completare la parte hardware, di cui mi manca veramente poco, dopodichè proseguire con calma con test vari e un software fatto bene.
Ora mi interessava appunto capire se fosse possibile e come spostare questo benedetto pin SS per poi fare tutti gli altri collegamenti del caso e testare il funzionamento dell'hardware... Senza dubbio mi metterò più avanti a capire meglio il protocollo e proverò sicuramente a migliorare qualcosa.

Nel frattempo mi devo limitare alle piccole modifiche suggerite... Tornando appunto al discorso "PORTG" io mi sono limitato a seguire la logica della libreria originale, che appunto usava gli operatori &= e |= per assegnare il valore al pin richiesto, ma assegnando comunque gli 8 bit.
Non avevo invece assolutamente calcolato il problema di settare PG5 come output, e non conoscevo il comando DDR... Ora mi sto leggendo la guida sul port manipulation dal sito di Arduino, e più tardi farò qualche test con queste modifiche...

Nel frattempo grazie a tutti, mi farò sentire spero con buone notizie!

leo72

Il pin SS è un pin di abilitazione per cui puoi usare qualsiasi pin dell'Arduino.

Per la manipolazione delle porte, ti suggerisco anche questo mio articolo, in italiano  ;)

Go Up