Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

I2C con PIC16F18323

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] I2C con PIC16F18323

Messaggioda Foto UtenteDeltaElectronics » 6 giu 2019, 0:36

Salve a tutti, sto scrivendo una mia libreria personale di comunicazione I2C, prendendo spunto dal manuale (pag. 293 e segg.) e da questi due tutorial:
https://electrosome.com/i2c-pic-microco ... s_Register
https://www.teachmemicro.com/pic16-i2c/#

Ho quindi scritto il seguente codice
Codice: Seleziona tutto

#define __XTAL_FREQ 4000000

void I2C_Master_Init(const unsigned long speed) {
    SSP1CON1 = 0b00101000;
    SSP1CON2 = 0;
    SSP1ADD = (_XTAL_FREQ/(4*speed))-1;
    SSP1STAT = 0;
    TRISC0   = 1;   //SCL
    TRISC1   = 1;   //SDA
}

void I2C_Master_Wait() {
    while ((SSP1STAT & 0x04) || (SSP1CON2 & 0x1F)); //Transmit is in progress
}

void I2C_Master_Start() {
    I2C_Master_Wait();
    SEN = 1;
    while (SEN);
}

void I2C_Master_Repeated_Start() {
    I2C_Master_Start();
}

void I2C_Master_Stop() {
    I2C_Master_Wait();
    PEN = 1;
    while(PEN);
}

_Bool I2C_Master_Write(unsigned d) {
    I2C_Master_Wait();
    SSP1BUF = d;         //Write data to SSPBUF
    SSP1IF = 0;
//   while (!SSP1IF);
    return ACKSTAT;
}

unsigned short I2C_Master_Read(unsigned short a) {
  unsigned short temp;
  I2C_Master_Wait();
  RCEN = 1;
  I2C_Master_Wait();
  temp = SSPBUF;      //Read data from SSPBUF
  I2C_Master_Wait();
  ACKDT = (a)?0:1;    //Acknowledge bit
  ACKEN = 1;          //Acknowledge sequence
  return temp; 
}
void main(void) {
    OSCCON1 = 0x60;;
    OSCFRQbits.HFFRQ = 0b011;
    TRISC4 =0;
    TRISC3 =0;
    I2C_Master_Init(100000);
    __delay_ms(3000);
    while(1) {
        LATCbits.LATC4 = 1;
        LATCbits.LATC3 = 0;
        I2C_Master_Start();
        I2C_Master_Write(0x3C);
        I2C_Master_Stop();
        __delay_ms(1000);
        LATCbits.LATC4 = 0;
        LATCbits.LATC3 = 1;
        I2C_Master_Start();
        I2C_Master_Write(0x3E);
        I2C_Master_Stop();
        __delay_ms(1000);
    }
}


provandolo sul seguente circuito di prova:


Mentre ho verificato che i due led su RC4 e RC3 blinkano regolarmente, sui PIN RC0 (SCK) e RC1 (SDA) non ho osservato nulla.
E' da un paio di giorni che sono bloccato su questo problema e sarei estremamente grato a chiunque mi volesse aiutare nella sua risoluzione.
DeltaElectronics
Avatar utente
Foto UtenteDeltaElectronics
181 1 2 6
Stabilizzato
Stabilizzato
 
Messaggi: 442
Iscritto il: 27 set 2015, 14:01

0
voti

[2] Re: I2C con PIC16F18323

Messaggioda Foto Utentemarioursino » 30 giu 2019, 11:11

I registri TRIS li scriverei prima della modifica dei registri della periferica (in pratica la prima cosa all’ingresso della funzione di configurazione.

Questo comunque non è il vero problema.. riesci a usare un debugger? Cerca per prima cosa di capire se si è piantato nel while del wait, magari sull’oscilloscopio fai un trigger singolo sul pin di clock per vedere se almeno un byte lo fa uscire.
Avatar utente
Foto Utentemarioursino
3.687 3 9 13
G.Master EY
G.Master EY
 
Messaggi: 1309
Iscritto il: 5 dic 2009, 4:32

0
voti

[3] Re: I2C con PIC16F18323

Messaggioda Foto Utentelelerelele » 1 lug 2019, 8:23

il pin SCK che non da segnali, mi fa pensare ad una cattiva configurazione del modulo, magari manca il clock oppure è configurato come slave.

Magari ti sto srcivendo banalità, (E' un po tanto che non programmo più I2C).

saluti.
Avatar utente
Foto Utentelelerelele
2.191 3 7 8
Expert EY
Expert EY
 
Messaggi: 2493
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

1
voti

[4] Re: I2C con PIC16F18323

Messaggioda Foto UtenteDeltaElectronics » 1 lug 2019, 12:58

Nel frattempo ho risolto...
Posto la mia libreria se qualcuno volesse usufruirne.
Allegato: file i2c.h
Allegati
i2c.rar
(1.39 KiB) Scaricato 8 volte
Avatar utente
Foto UtenteDeltaElectronics
181 1 2 6
Stabilizzato
Stabilizzato
 
Messaggi: 442
Iscritto il: 27 set 2015, 14:01


Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite