Caio a tutti,
volevo fare una semplice applicazione nella quale collegare insieme due pic18 uguali.
Pensavo dovesse essere una cosa abbastanza semplice ma mi sono arenato un un problemino:
Il master invia dei byte allo slave e fino qui tutto ok lo slave li riceve corretti; quando però vado a leggere i byte sul master che in teoria ha inviato lo slave ritrovo gli stessi byte che il master ha inviato.
qualcuno a qualche idea di dove possa essere l'errore.
Grazie mille ciao
connessione SPI tra due PIC18
Moderatore:
Paolino
13 messaggi
• Pagina 1 di 2 • 1, 2
0
voti
Ciao @spivo, non sapendo quel che vorresti realizzare e il risultato da te atteso, io non comprendo quest'affermazione
Saluti
meglio sarebbe se tu fossi più circostanziato.spivo ha scritto:(...) quando però vado a leggere i byte sul master che in teoria ha inviato lo slave ritrovo gli stessi byte che il master ha inviato (...)
Saluti
W - U.H.F.
-

WALTERmwp
30,2k 4 8 13 - G.Master EY

- Messaggi: 8982
- Iscritto il: 17 lug 2010, 18:42
- Località: le 4 del mattino
0
voti
grazie WALTERmwp per la risposta.
Descrivere dettagliatamente l'applicazione è un po' complicato, è un sistema che gestisce alcune funzioni di casa mia.
prima avevo solo un pic18f46k22 collegato a un raspberry i quali si scambiavano continuamente dati e compiti da eseguire, ora per alleviare il peso al primo pic18(master) ne volevo collegare un secondo pic18(slave) uguale che gestisse i soli ingressi e uscite digitali.
Non è la prima volta che utilizzo la connessione SPI ma ora son capisco proprio dove sbaglio, poi provo a mandarvi qualche stralcio del codice se può essere utile.
Per quanto quanto riguarda l'hardwere ho semplicemente collegato i clock, un uscita digitale del master al SS dello slave e incrociato input e output, senza aggiunge componenti.
Descrivere dettagliatamente l'applicazione è un po' complicato, è un sistema che gestisce alcune funzioni di casa mia.
prima avevo solo un pic18f46k22 collegato a un raspberry i quali si scambiavano continuamente dati e compiti da eseguire, ora per alleviare il peso al primo pic18(master) ne volevo collegare un secondo pic18(slave) uguale che gestisse i soli ingressi e uscite digitali.
Non è la prima volta che utilizzo la connessione SPI ma ora son capisco proprio dove sbaglio, poi provo a mandarvi qualche stralcio del codice se può essere utile.
Per quanto quanto riguarda l'hardwere ho semplicemente collegato i clock, un uscita digitale del master al SS dello slave e incrociato input e output, senza aggiunge componenti.
0
voti
Perché non utilizzi un convertitore seriale - parallelo o parallelo - seriale per creare una espansione delle porte digitali e avere più linee di I/O?
Non penso che sia necessario un secondo microcontrollore.
Io lo facevo con i 16F88 e con due o tre pin puoi gestire n*8 ingressi e uscite.
Ciao
Non penso che sia necessario un secondo microcontrollore.
Io lo facevo con i 16F88 e con due o tre pin puoi gestire n*8 ingressi e uscite.
Ciao
600 Elettra
0
voti
si, utilizzo anche dei mcp32s17 che sempre con connessione SPI aggiungo 16 I/O digitali, ma un preferivo il microcontrollore che gestisse le uscite e restituisse gli ingressi raggruppati in maniera corretta
0
voti
Io non ho capito il problema. Dalla tua descrizione sembra tutto corretto.
-

marioursino
5.687 3 9 13 - G.Master EY

- Messaggi: 1598
- Iscritto il: 5 dic 2009, 4:32
0
voti
Vi giro un po' di codice
Configurazione e comunicazione del Master:
codice dello Slave:
Come dicevo i dati passano dallo master allo slave, ma non il contrario
Configurazione e comunicazione del Master:
- Codice: Seleziona tutto
// configurazione spi1 come Master
SSP1STAT=0b01000000;
SSP1CON1=0b00100010;
//connessione a Slave
DOM_DIGIT_1 = 0; //Indica allo slave che i dati in arrivo
SSP1BUF=0x40; //Invio primo uscita
while(!SSP1IF); //Attesa e reset
ch_out[2]=SSP1BUF; //Ricevo primo in ingresso
SSP1IF=0;
SSP1BUF=ch_in[1]; //Invio
while(!SSP1IF); //Attesa e reset
ch_out[3]=SSP1BUF;
SSP1IF=0;
SSP1BUF=ch_in[2]; //Invio
while(!SSP1IF); //Attesa e reset
ch_out[4]=SSP1BUF;
SSP1IF=0;
SSP1BUF=ch_in[3]; //Invio
while(!SSP1IF); //Attesa e reset
ch_out[5]=SSP1BUF;
SSP1IF=0;
SSP1BUF=ch_in[4]; //Invio
while(!SSP1IF); //Attesa e reset
ch_out[6]=SSP1BUF;
SSP1IF=0;
SSP1BUF=ch_in[5]; //Invio
while(!SSP1IF); //Attesa e reset
ch_out[7]=SSP1BUF;
SSP1IF=0;
SSP1BUF=ch_in[6]; //Invio
while(!SSP1IF); //Attesa e reset
ch_out[8]=SSP1BUF;
SSP1IF=0;
SSP1BUF=ch_in[7]; //Invio
while(!SSP1IF); //Attesa e reset
ch_out[9]=SSP1BUF;
SSP1IF=0;
SSP1BUF=ch_in[8]; //Invio
while(!SSP1IF); //Attesa e reset
ch_out[10]=SSP1BUF;
SSP1IF=0;
SSP1BUF=0x41; //Invio ultimo uscita
while(!SSP1IF); //Attesa e reset
ch_out[11]=SSP1BUF; //Ricevo ultimo in ingresso
SSP1IF=0;
DOM_DIGIT_1 = 1; //Fine comunicazione
codice dello Slave:
- Codice: Seleziona tutto
//CONFIGURAZIONE SPI2 SLAVE
SSP2CON1bits.WCOL = 0;
SSP2CON1bits.SSPOV = 0;
SSP2CON1bits.SSPEN = 1;
SSP2CON1bits.CKP = 0;
SSP2CON1bits.SSPM = 0b0100;
SSP2STATbits.CKE = 1;
SSP2STATbits.SMP = 0;
SSP2BUF = 0;
//CONFIGURAZIONE INTERRUPT
RCONbits.IPEN = 1;
PIE3bits.SSP2IE = 1;
IPR3bits.SSP2IP = 1;
PIR3bits.SSP2IF = 0;
// INTERRUPT SU SLAVE
void interrupt high_isr(void)
{
if (PIR3bits.SSP2IF)
{
ch_in[ch_num] = SSP2BUF;
SSP2BUF = ch_out[ch_num];
ch_num++;
PIR3bits.SSP2IF = 0; //reset interrupt
}
}
Come dicevo i dati passano dallo master allo slave, ma non il contrario
0
voti
ciao
stefanopc, scusa credevo di averti risposto ma probabilmente non ho inviato la risposta
Mi servono circa 20 uscite e 20 ingressi, però questi ultimi siccome sono dei fotoisolatori su AC devono essere letti molte volte consecutivamente.
facendo vari tentativi sono riuscito a fare qualcosa inserendo delle pause tra una connessione e l'altra
e così funziona, non sono molto contento di inserire dei dalay per fermare il codice, ma almeno so che l'hardwere funziona
però vorrei trovare una soluzione più pultita
Mi servono circa 20 uscite e 20 ingressi, però questi ultimi siccome sono dei fotoisolatori su AC devono essere letti molte volte consecutivamente.
facendo vari tentativi sono riuscito a fare qualcosa inserendo delle pause tra una connessione e l'altra
- Codice: Seleziona tutto
SSP1BUF=ch_in[1]; //Invio
while(!SSP1IF); //Attesa e reset
ch_out[3]=SSP1BUF;
SSP1IF=0;
DOM_DIGIT_1 = 1; //Fine comunicazione
__delay_ms(1);
DOM_DIGIT_1 = 0; //Indica allo slave che i dati in arrivo
SSP1BUF=ch_in[2]; //Invio
while(!SSP1IF); //Attesa e reset
ch_out[4]=SSP1BUF;
SSP1IF=0;
DOM_DIGIT_1 = 1; //Fine comunicazione
__delay_ms(1);
DOM_DIGIT_1 = 0; //Indica allo slave che i dati in arrivo
SSP1BUF=ch_in[3]; //Invio
while(!SSP1IF); //Attesa e reset
ch_out[5]=SSP1BUF;
SSP1IF=0;
DOM_DIGIT_1 = 1; //Fine comunicazione
e così funziona, non sono molto contento di inserire dei dalay per fermare il codice, ma almeno so che l'hardwere funziona
però vorrei trovare una soluzione più pultita

1
voti
Agli optoisolatori puoi filtrare l'uscita con un condensatore così non c'è il problema di campionare un segnale AC.
Per il numero di ingressi e uscite io ho sempre risolto con i 74hc165 e 74hc166.
Ciao
Per il numero di ingressi e uscite io ho sempre risolto con i 74hc165 e 74hc166.
Ciao
600 Elettra
13 messaggi
• Pagina 1 di 2 • 1, 2
Torna a Realizzazioni, interfacciamento e nozioni generali.
Chi c’è in linea
Visitano il forum: Nessuno e 7 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


