Pages: 1 2 3 [4]   Go Down
Author Topic: MCP23S17 per comandare dei relay  (Read 4141 times)
0 Members and 1 Guest are viewing this topic.
Italy
Offline Offline
Jr. Member
**
Karma: 1
Posts: 56
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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???
Logged

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

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:
DDRG |= (1<<5); //imposta il pin come OUTPUT
PORTG &= ~(1<<5); mette il pin a LOW

Per riportarlo su HIGH:
Code:
PORTG |= (1<<5);
Logged


0
Offline Offline
Faraday Member
**
Karma: 31
Posts: 2908
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

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

Italy
Offline Offline
Jr. Member
**
Karma: 1
Posts: 56
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

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

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  smiley-wink
Logged


Italy
Offline Offline
Jr. Member
**
Karma: 1
Posts: 56
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ottimo! Grazie per il suggerimento, lo leggo molto volentieri!
Logged

Italy
Offline Offline
Jr. Member
**
Karma: 1
Posts: 56
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma non è possibile!!!

Ho provato poco fa ad effettuare le modifiche alla libreria, e subito ha funzionato tutto alla perfezione...
Quindi sono passato alla fase successiva, cioè scrivere un semplice programma che alla pressione di un tasto abilita, una per volta, le uscite del mio expander.
Nulla di più semplice, se non fosse per il fatto che adesso non so per quale strano motivo, senza aver toccato nulla e senza aver modificato le impostazioni dell'IDE, non esegue più l'upload!!!

Sotto windows funziona tutto perfettamente, mentre sotto mac osx (il mio sistema operativo principale) non c'è verso di flashare anche il più misero sketch...
Mi da il seguente errore:

Code:
avrdude: Version 5.11, compiled on Sep  2 2011 at 18:52:52
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch

         System wide configuration file is "/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/etc/avrdude.conf"
         User configuration file is "/Users/michele/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/tty.Bluetooth-PDA-Sync
         Using Programmer              : wiring
         Overriding Baud Rate          : 115200
avrdude: wiring_open(): releasing DTR/RTS
avrdude: wiring_open(): asserting DTR/RTS
avrdude: Send: . [1b] . [01] . [00] . [01] . [0e] . [01] . [14]
avrdude: ser_recv(): programmer is not responding
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: Send: . [1b] . [01] . [00] . [01] . [0e] . [01] . [14]
avrdude: ser_recv(): programmer is not responding
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: Send: . [1b] . [01] . [00] . [01] . [0e] . [01] . [14]
avrdude: ser_recv(): programmer is not responding
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: Send: . [1b] . [01] . [00] . [01] . [0e] . [01] . [14]
avrdude: ser_recv(): programmer is not responding
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: Send: . [1b] . [01] . [00] . [01] . [0e] . [01] . [14]
avrdude: ser_recv(): programmer is not responding
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: Send: . [1b] . [01] . [00] . [01] . [0e] . [01] . [14]
avrdude: ser_recv(): programmer is not responding
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer

avrdude done.  Thank you.

Ripeto che con Windows funziona tutto correttamente, quindi escludo un problema alla scheda, in più anche scollegando l'usb non chiede più come prima di scegliere la porta, ma da lo stesso identico errore.
Ho anche provato a cancellare e ri-installare l'IDE, cancellare la cartella delle mie librerie e dei miei progetti, ma nulla. Non ho nemmeno trovato altri files di configurazione sparsi.

Sicuramente è un problema banalissimo, ma non riesco a venirne a capo! Metto apposto un tassello e se ne rompe un altro!!!  smiley-confuse
Logged

Italy
Offline Offline
Jr. Member
**
Karma: 1
Posts: 56
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ARGGHHHH... Come non detto...

Ho scoperto che si era creato un duplicato del modem USB nelle impostazioni di rete del sistema operativo, praticamente erano comparso oltre a "Arduino Mega 2560" anche un "Arduino Mega 2561". Una volta eliminati e reinstallato quello corretto è tornato tutto a funzionare...

... Questa me la segno per la prossima volta

  smiley-cool
Logged

Pages: 1 2 3 [4]   Go Up
Jump to: