Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Raspberry PI3b+ e PIC12F1840 in I2C


Messaggi consigliati

Inserito:

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

 

 

 


Inserita:

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.

Inserita:

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:

 

Inserita:

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

Inserita:

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

 

Inserita:
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.

Inserita:

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.

 

Inserita:

Eureka!

 

image.png.163e12eb0b758a43332ebda17cdae30b.png

 

image.png.8e06447e3e1216173d59456ab81f6c21.png

 

BOEN_bit    = 1;

 

image.thumb.png.4dabfc31b6a8457c13a5bcc8044f4a73.png

 

...si va avanti con lo Slave intellig(g)ente!

image.png.4bddf2d97f70433c1160aa31638a8d01.png

 

Inserita:

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!

 

 

 

Inserita:

Affascinante :thumb_yello: , sopratutto per un ignorante come me .:clap:

Inserita:

Bel lavoro Stefano, complimenti.

Inserita:

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.

 

Inserita:
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.

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