Questo che allego è parte del codice per un micro pic18f46k22, il codice dovrebbe fare questo:
Aspettare che un raspberry lo interroghi tramite connessione spi (spi2 nel mio caso particolare), se il primo byte è 0x61 riceve 30 byte e invia i 30 che lui si era preparato.
Quando torna al ciclo infinito se i il primo dei trenta era 0x61 e l'ultimo 0x62 aggirona i dati per il prossimo invio.
- Codice: Seleziona tutto
void main(void)
{
ConfigureOscillator();
ConfigurePort();
ConfigureSPI1();
ConfigureMCPD();
// Visualizza accensione
LEDrosso = 1;
LEDverde = 1;
//CONFIGURAZIONE SPI2 SLAVE
SSP2CON1bits.SSPEN = 1;
SSP2CON1bits.SSPM = 0b0100;
SSP2CON1bits.CKP = 0;
SSP2STATbits.CKE = 1;
SSP2STATbits.SMP = 0;
SSP2BUF = 0;
//CONFIGURAZIONE INTERRUPT
RCONbits.IPEN = 1;
PIE3bits.SSP2IE = 1;
IPR3bits.SSP2IP = 1;
PIR3bits.SSP2IF = 0;
//Prepara le variabili prima dell'avvio
ch_num = 0;
SistemazioneDati();
for (i=0;i<100; i++) __delay_ms(10);
LEDrosso = 0;
LEDverde = 0;
//ATTIVA INTERRUPT
INTCONbits.GIE = 1;
while(1)
{
if (ch_in[0] == 0x61 && ch_in[29] == 0x62){
ch_num = 0;
ch_in[0] = 0;
ch_in[29] = 0;
// invia dati a mm5450 1
MM_5450_1();
// Lampeggio led dopo l'invio dei dati
LEDverde = ~LEDverde;
// Sistemazione dati prima del prossimo invio
SistemazioneDati();
}
// Rilevamento MCP23S17 1
MCPD_1=0; //Indica allo slave che i dati in arrivo
SSP1BUF=0b01000001; //indirizzo + read
while(!SSP1IF);
ch_canc=SSP1BUF;
SSP1IF=0;
SSP1BUF=0x12; //Invio GPIOA
while(!SSP1IF);
ch_canc=SSP1BUF;
SSP1IF=0;
SSP1BUF=0x00;
while(!SSP1IF);
ch_out[3]&=SSP1BUF;
SSP1IF=0;
MCPD_1=1; //Fine comunicazione
MCPD_1=0; //Inizio comunicazione
SSP1BUF=0b01000001; //indirizzo + read
while(!SSP1IF);
ch_canc=SSP1BUF;
SSP1IF=0;
SSP1BUF=0x13; //Invio GPIOB
while(!SSP1IF);
ch_canc=SSP1BUF;
SSP1IF=0;
SSP1BUF=0x00;
while(!SSP1IF);
ch_out[4]&=SSP1BUF;
SSP1IF=0;
MCPD_1=1; //Fine comunicazione
for (i=0;i<2; i++) __delay_ms(1);
LEDrosso = ~LEDrosso;
}
}
void interrupt high_isr(void)
{
if (PIR3bits.SSP2IF)
{
ch_in[ch_num] = SSP2BUF;
SSP2BUF = ch_out[ch_num];
ch_num++;
if (ch_in[0] != 0x61 || ch_num > 30) ch_num = 0;
PIR3bits.SSP2IF = 0; //reset interrupt
}
}
Mentre aspetta di essere inerrogato da raspberry il PIC continua a leggre un mcp23s17 per monitorare degli ingressi digitali e fa lampeggiare freneticamente il LEDrosso.
Prima che inserissi la parte di codice relativa all'mcp23s17 tutto funzionava bene. (raspberry conta se una connessione da errore e in due settimane di connessioni continue non ha mai dato errori)
Con il codice postato, da un centinaio di errori al giorno.
Ho provato anche ad eliminare il lampeggio del LEDrosso, (che avevo inserito all'inizio per sapere se il PIC era acceso). Se elimino questa parte di codice da una marea di errori.
Spero di essermi spiegato, non so nemmeno come intitolare il post, grazie caio Ivo

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)




