Vai al contenuto
PLC Forum


Raspberry PI3b+ e PIC12F1840 in I2C


dott.cicala

Messaggi consigliati

Il PIC12F1840 come molti altri, integra in hardware anche una MSSP usabile come SPI- I2C sia Master che Slave.

Il problema che mi assilla è che non riesco a capire perché nonostante tutto funzioni a dovere, non risponde alla I2cdetect -y 1

image.png.7ee1a2fcf73e888ff7e8134900b53e6e.png il pic ha indirizzo 50. C'è ma non si vede.

Mentre gli altri invece vengono riconosciuti (2x MCP4725 - 2x TDA8444)

image.png.43053bec53f9b6c263f4d1d601f9d690.png

image.png.ef261d9cb40697a38bd3f634856fd91a.png

Eppure funziona perché nella rasp vado a leggere lo stato del led e lo inverto...il led lampeggia... 

 

 

 

Link al commento
Condividi su altri siti


Hai già provato ad aggiungere -a ?

 

-a
    Force scanning of non-regular addresses. Not recommended. 

Non è molto chiaro cosa intenda con "non-regular addresses", ma essendo un tool principalmente dedicato all'hardware dei PC o simili forse evita alcuni indirizzi che possono causare problemi al sistema.

 

Ciao, Ale.

Link al commento
Condividi su altri siti

image.png.016e9cde4a2c713fcbfad32f7146b0da.png

 

Vado?? :blink:

 

image.png.63f9c08f4ef43a048df2331580841639.png

 

Ha fatto un rumore tipo "UUUmzzzzzmmmzzz"  e si è abbassata la luce in casa :superlol:

Sono spariti anche gli altri :roflmao:

Per recuperarli ciclo l'alimentazione

image.png.d3e7a3898d100ee02f8937a83ad146a6.png

se riprovo va in confusione povera lamponcina :toobad:

 

Link al commento
Condividi su altri siti

:superlol:

Ok, a questo punto se sei curioso non ti resta che usare un analizzatore del bus per vedere cosa accade di preciso, anche sembra abbastanza chiaro che è il PIC che per suoi (strani) motivi non manda l'ack alla richiesta dell'i2cdetect. Potresti anche provare a compilare sul Raspberry l' i2c scanner di Arduino, ma il risultato mi sembra scontato, visto che quando lo interroghi da programma risponde.

 

Ciao, Ale.

Link al commento
Condividi su altri siti

Pensavo che essendo MSSP hardware, certe cose le facesse da sé...anche perché  il 18F45K22  risponde e leggendo le rispettive specifiche sembra che non ci siano differenze....a meno che non mi sia sfuggito qualcosa.

 

Il mio analizzatore logico è, come si dice a Bologna, un bagaglio da 15€, niente realtime e autotrig, va a fortuna.

D'altronde l'originale costava più di 500€...

 

Link al commento
Condividi su altri siti

1 ora fa, dott.cicala scrisse:

a meno che non mi sia sfuggito qualcosa.

Mi arrendo qui perchè non conosco assolutamente i PIC, quindi non so se ad esempio stai usando una libreria tipo la wire di Arduino (che ovviamente discrimina tra i diversi hardware) o fai tutto a basso livello tramite registri. Nel primo caso un'occhiata ai sorgenti forse potrebbe aiutare.

 

Ciao, Ale.

Link al commento
Condividi su altri siti

Ho provato sia con  MPLAB XC8 compiler che con MikroC for PIC direttamente agendo sui registri. Ora provo con le librerie

Con la Raspberry sto usando Codesys for raspberry.

 

Link al commento
Condividi su altri siti

In pochi passi, come far comunicare in I2C

una raspberry(master) programmata in CodeSys

un PIC(slave) programmato in MikroC

 

Raspberry: Inserisco il Master I2c

image.thumb.png.1d9cca358a164030bd939f04364c7840.png

Raspberry: trasferisco e verifico che funzioni

image.png.eee7dd54471151de3c1f0779345ac922.png   

Raspberry: creo un piccolo programma,  dichiaro le variabili

image.png.f7c79c520f26186c0802e13de9efcbc3.png

Raspberry: scrivo il codice

image.thumb.png.3471b6ea7b552e3e5630484720fd5391.png

PIC: scrivo il codice e programmo il pic

//******************************************************************************
//     Raspberry PI3b+  I2C Send & Receive Test
//     PIC12F1840
//******************************************************************************
//******************************************************************************
// GLOBAL VARIABLES
//******************************************************************************
   unsigned char I2C_ADDR, read_buffer, Counter;
   sbit D_nA    at SSP1STAT.B5;
   sbit Rd_nWr  at SSP1STAT.B2;
void main() {
//******************************************************************************
// GLOBAL SETTINGS
//******************************************************************************
   OSCCON      = 0b11110000;    // Int Osc 32MHz 4xPLL On
   TRISA       = 0b00001110;    // RA1, RA2, RA3=Input
   PIE1        = 0b00001000;    // PERIPHERAL INTERRUPT ENABLE REGISTER 1
   PIR1        = 0b00001000;    // PERIPHERAL INTERRUPT REQUEST REGISTER 1
   INTCON.PEIE = 1;             // Peripheral Interrupt Enable bit(2)
   INTCON.GIE  = 1;             // Global Interrupt Enable bit
//******************************************************************************
// MASTER SYNCHRONOUS SERIAL PORT MODULE
//******************************************************************************
   I2C_ADDR    = 0x50;          // MSSP1 ADDRESS
   SSP1ADD     = I2C_ADDR << 1; // MSSP1 ADDRESS AND BAUD RATE REGISTER (I2C)
   SSP1MSK     = I2C_ADDR << 1; // MSSP1 MASK ADDRESS
   SSP1CON1    = 0x36;          // SSP1EN,Enable clock,I2C Slave, 7-bit address
   SSPSTAT     = 0x00;          // All bits must be cleared
   BOEN_bit    = 0;             // Buffer Overwrite Enable bit
   SEN_bit     = 1;             // Start Condition Enable/Stretch Enable bit
   AHEN_bit    = 0;             // Address Hold Enable bit
   DHEN_bit    = 0;             // Data Hold Enable bit
//******************************************************************************
// Diag
//******************************************************************************
   Counter = 0;
 }
//##############################################################################
//                        Interrupt Routine
//##############################################################################
void interrupt()
 {
    if (SSP1IF) 
      {
    //*****************************************************************
    // overflow
    //*****************************************************************
        if(SSPOV_bit || WCOL_bit)
          {
           SSPBUF = SSPBUF;
           SSPOV_bit = 0;
          }
    //*****************************************************************
    // ricevo dati dal master
    //*****************************************************************
        if(S_bit &!Rd_nWr)
          {
            SSP1IF_bit=0;
            read_buffer = SSPBUF;
            CKP_bit=1;
          }
    //*****************************************************************
    // trasmetto dati al master
    //*****************************************************************
       if(S_bit &Rd_nWr &!BF)
          {
           SSPBUF = ++Counter;
           CKP_bit=1;
          }
    //*****************************************************************
       SSP1IF_bit=0;
    }
 }

Preparo un'interfaccia grafica per la Raspberry

(i dati ricevuti continuano a cambiare a causa di questaistruzione nel pic  SSPBUF = ++Counter;)

image.png.872221b511f77f3b9e2dd32d76ac8945.png

 

Verifico che funzioni con il logic analyzer: Raspberry scrive al Pic

image.png.8e61e8f9d63ded0e99375371d05d9a26.png

 

Rasperry legge dal Pic

image.png.e6f5badef2d6817bb512a6a6abdd1e88.png

che spettacolo!

 

 

 

Link al commento
Condividi su altri siti

Vi ringrazio per l'apprezzamento.

E' un insieme di argomenti di cui si trova poco in rete, specialmente volendo usare la Raspberry per realizzare strumenti di misura e non le solite cose, per di più programmata in Codesys for Raspberry, ambiente bellissimo ma incredibilmente carente di documentazione.

 

Anche il PIC che è usatissimo in I2C, è quasi sempre usato come master tanto che le librerie dei vari IDE vanno sempre in questa direzione.

 

Link al commento
Condividi su altri siti

11 ore fa, dott.cicala scrisse:

Anche il PIC che è usatissimo in I2C, è quasi sempre usato come master tanto che le librerie dei vari IDE vanno sempre in questa direzione.

 

Si ricordo quando ho provato per la prima volta a connettere 2 pic in I2C, circa 20 anni fa, ho incontrato diversi problemi anche per carenza di documentazione.

Ora c'è molta documentazione, ed esempi, su queste connessioni con arduino.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...