dott.cicala Inserito: 15 settembre 2018 Segnala Inserito: 15 settembre 2018 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 il pic ha indirizzo 50. C'è ma non si vede. Mentre gli altri invece vengono riconosciuti (2x MCP4725 - 2x TDA8444) Eppure funziona perché nella rasp vado a leggere lo stato del led e lo inverto...il led lampeggia...
ilguargua Inserita: 15 settembre 2018 Segnala Inserita: 15 settembre 2018 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.
dott.cicala Inserita: 15 settembre 2018 Autore Segnala Inserita: 15 settembre 2018 Vado?? Ha fatto un rumore tipo "UUUmzzzzzmmmzzz" e si è abbassata la luce in casa Sono spariti anche gli altri Per recuperarli ciclo l'alimentazione se riprovo va in confusione povera lamponcina
ilguargua Inserita: 15 settembre 2018 Segnala Inserita: 15 settembre 2018 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.
dott.cicala Inserita: 15 settembre 2018 Autore Segnala Inserita: 15 settembre 2018 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€...
ilguargua Inserita: 15 settembre 2018 Segnala Inserita: 15 settembre 2018 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.
dott.cicala Inserita: 15 settembre 2018 Autore Segnala Inserita: 15 settembre 2018 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.
dott.cicala Inserita: 18 settembre 2018 Autore Segnala Inserita: 18 settembre 2018 Eureka! BOEN_bit = 1; ...si va avanti con lo Slave intellig(g)ente!
dott.cicala Inserita: 22 settembre 2018 Autore Segnala Inserita: 22 settembre 2018 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 Raspberry: trasferisco e verifico che funzioni Raspberry: creo un piccolo programma, dichiaro le variabili Raspberry: scrivo il codice 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;) Verifico che funzioni con il logic analyzer: Raspberry scrive al Pic Rasperry legge dal Pic che spettacolo!
gabri-z Inserita: 22 settembre 2018 Segnala Inserita: 22 settembre 2018 Affascinante , sopratutto per un ignorante come me .
Livio Orsini Inserita: 22 settembre 2018 Segnala Inserita: 22 settembre 2018 Bel lavoro Stefano, complimenti.
dott.cicala Inserita: 22 settembre 2018 Autore Segnala Inserita: 22 settembre 2018 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.
Livio Orsini Inserita: 23 settembre 2018 Segnala Inserita: 23 settembre 2018 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.
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora