Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

connessione SPI tra due PIC18

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] connessione SPI tra due PIC18

Messaggioda Foto Utentespivo » 1 ago 2021, 15:53

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
Avatar utente
Foto Utentespivo
375 1 12
Frequentatore
Frequentatore
 
Messaggi: 197
Iscritto il: 19 dic 2012, 21:29

0
voti

[2] Re: connessione SPI tra due PIC18

Messaggioda Foto UtenteWALTERmwp » 1 ago 2021, 16:14

Ciao @spivo, non sapendo quel che vorresti realizzare e il risultato da te atteso, io non comprendo quest'affermazione
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 (...)
meglio sarebbe se tu fossi più circostanziato.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[3] Re: connessione SPI tra due PIC18

Messaggioda Foto Utentespivo » 1 ago 2021, 16:35

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.
Avatar utente
Foto Utentespivo
375 1 12
Frequentatore
Frequentatore
 
Messaggi: 197
Iscritto il: 19 dic 2012, 21:29

0
voti

[4] Re: connessione SPI tra due PIC18

Messaggioda Foto Utentestefanopc » 1 ago 2021, 18:30

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
600 Elettra
Avatar utente
Foto Utentestefanopc
13,3k 5 9 13
Master EY
Master EY
 
Messaggi: 5566
Iscritto il: 4 ago 2020, 9:11

0
voti

[5] Re: connessione SPI tra due PIC18

Messaggioda Foto Utentespivo » 1 ago 2021, 19:03

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
Avatar utente
Foto Utentespivo
375 1 12
Frequentatore
Frequentatore
 
Messaggi: 197
Iscritto il: 19 dic 2012, 21:29

0
voti

[6] Re: connessione SPI tra due PIC18

Messaggioda Foto Utentemarioursino » 1 ago 2021, 19:28

Io non ho capito il problema. Dalla tua descrizione sembra tutto corretto.
Avatar utente
Foto Utentemarioursino
5.687 3 9 13
G.Master EY
G.Master EY
 
Messaggi: 1598
Iscritto il: 5 dic 2009, 4:32

0
voti

[7] Re: connessione SPI tra due PIC18

Messaggioda Foto Utentespivo » 1 ago 2021, 20:54

Vi giro un po' di codice

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
Avatar utente
Foto Utentespivo
375 1 12
Frequentatore
Frequentatore
 
Messaggi: 197
Iscritto il: 19 dic 2012, 21:29

0
voti

[8] Re: connessione SPI tra due PIC18

Messaggioda Foto Utentestefanopc » 1 ago 2021, 21:00

Quanti ingressi e quante uscite digitali ti servono complessivamente?
Ciao
600 Elettra
Avatar utente
Foto Utentestefanopc
13,3k 5 9 13
Master EY
Master EY
 
Messaggi: 5566
Iscritto il: 4 ago 2020, 9:11

0
voti

[9] Re: connessione SPI tra due PIC18

Messaggioda Foto Utentespivo » 3 ago 2021, 22:05

ciao Foto Utentestefanopc, 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
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 #-o
Avatar utente
Foto Utentespivo
375 1 12
Frequentatore
Frequentatore
 
Messaggi: 197
Iscritto il: 19 dic 2012, 21:29

1
voti

[10] Re: connessione SPI tra due PIC18

Messaggioda Foto Utentestefanopc » 4 ago 2021, 8:50

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
600 Elettra
Avatar utente
Foto Utentestefanopc
13,3k 5 9 13
Master EY
Master EY
 
Messaggi: 5566
Iscritto il: 4 ago 2020, 9:11

Prossimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti