home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


PORTA analogica in PIC16F873A
     
Autore Messaggio opzioni
e.ferriani





postato il:
31.12.2017, alle ore 17:48
Allora, eccomi qua. A piccolissimi passi riesco a fare qualcosa.
Di seguito lo schema di come vorrei provare la comunicazione.
Per ora direi che si potrebbero tranquillamente tralasciare tutti i componenti relativi allo SLAVE2, ed anche i tre I2C, collegando solamente MASTER, SLAVE1, il pulsante TEST-SLAVE1 su Slave1, il led TEST-SLAVE1 sul Master e le due resistenze di pullup sulla comunicazione.



Chiedo agli esperti.
Potrebbe andare bene o manca qualcosa?
In seguito, i tre I2C, vanno bene collegati come da schema riportato?

Adesso da dove comincio?
Quello che vorrei fare per ora è accendere il led test su Master premendo il pulsante sullo Slave1.



Enea Ferriani
picmicro675




una ogni 10 livelli


postato il:
01.01.2018, alle ore 01:31
Io direi di usare il bus IC2 per la comunicazione Master-Slaves e una soft-I2C se devi usare le EEPROM Seriali. Almeno per capire quale dei due BUS ha maggior traffico.
Se ritieni conveniente lo schema attuale, fai delle prove per vedere se la comunicazione va a buon fine.
Comunque nel BUS mancano le resistenze di pullup, sebbene sia una implementazione software serve comunque rispettare le specifiche del I2C. Poi dipende dalla distanza il valore delle resistenze va da 1K a 10 KOhm.



Anno nuovo, forum nuovo.
Mi sa che lascio.
e.ferriani





postato il:
01.01.2018, alle ore 11:54
picmicro675:
Io direi di usare il bus IC2 per la comunicazione Master-Slaves e una soft-I2C se devi usare le EEPROM Seriali. Almeno per capire quale dei due BUS ha maggior traffico. Se ritieni conveniente lo schema attuale, fai delle prove per vedere se la comunicazione va a buon fine.


Quindi non useresti quei pin che ho messo io? Per ora ho collegato solamente il master allo slave1 con un doppino di una decina di centimetri, pin to pin, senza i die I2C.

picmicro675:
Comunque nel BUS mancano le resistenze di pullup, sebbene sia una implementazione software serve comunque rispettare le specifiche del I2C. Poi dipende dalla distanza il valore delle resistenze va da 1K a 10 KOhm.


Ci sono. Sono indicate vicino all'I2C del master, rivolte in basso e non verso l'alto, ma sono dei pullup di 4K7.

Io ho usato il primo dei due link che mi hai messo un paio di messaggi fa.
La differenza sta nel micro, io uso degli 873-04, e negli ingressi/uscite indicati nello schema.
Io ho collegato per ora solo un led nello slave su RC0 ed un pulsante nel master su RC0. Adattando il codice alle mie esigenze mi spetto di vedere accendere il led sullo slave alla pressione del pulsante sul master.
E' corretto?



Enea Ferriani
picmicro675




una ogni 10 livelli


postato il:
01.01.2018, alle ore 12:22
e.ferriani:
Ci sono. Sono indicate vicino all'I2C del master, rivolte in basso e non verso l'alto, ma sono dei pullup di 4K7.

Mi è sembrato che fossero per segnalare i segnali, visti i LEDs. Ma se sono per l' I2C, meglio farlo come per le memorie EEPROM.

e.ferriani:
Adattando il codice alle mie esigenze mi spetto di vedere accendere il led sullo slave alla pressione del pulsante sul master.
E' corretto?


A parte a non mettere i LEDs, direi che basta provare. Al limite potresti fare una prova con il simulatore per vedere se ci sono errori di software. Ma a livello hardware dovresti come minimo avere una seriale RS232-TTL da vedere al computer i passi del programma. Così potresti indagare in diversi punti i valori aspettati e presentarli sulla seriale.

Poi meglio se ci mostri il codice, che si possa dare ulteriori consigli.



Anno nuovo, forum nuovo.
Mi sa che lascio.
e.ferriani





postato il:
01.01.2018, alle ore 15:09
Ad ogni modo questo è il codice che ho adattato. avrò certamente sbagliato io, ma non funziona niente, ovvero, il led non cambia di stato alla pressione del pulsante 0->5V.

Questo quello che ho caricato nel master:


//-----------------------------------------------
//FUNZIONAMENTO ()
//----------------------------------------------- 

//  premendo il pulsante in RC1 del master si deve accendere il led in RC0 dello slave

//-----------------------------------------------
// CONFIGURATION
//-----------------------------------------------

#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF// Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)


#define _XTAL_FREQ  4000000UL


//-----------------------------------------------
// INCLUDE
//-----------------------------------------------

#include "xc.h"
#include "pic16f873.h"


//-----------------------------------------------

 
void I2C_Master_Init(const unsigned long c)
{
  SSPCON = 0b00101000;
  SSPCON2 = 0;
  SSPADD = (_XTAL_FREQ/(4*c))-1;
  SSPSTAT = 0;
  TRISC3 = 1;        //Setting as input as given in datasheet
  TRISC4 = 1;        //Setting as input as given in datasheet
}

void I2C_Master_Wait()
{
  while ((SSPSTAT & 0x04) || (SSPCON2 & 0x1F));
}

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

void I2C_Master_RepeatedStart()
{
  I2C_Master_Wait();
  RSEN = 1;
}

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

void I2C_Master_Write(unsigned d)
{
  I2C_Master_Wait();
  SSPBUF = d;
}

unsigned short I2C_Master_Read(unsigned short a)
{
  unsigned short temp;
  I2C_Master_Wait();
  RCEN = 1;
  I2C_Master_Wait();
  temp = SSPBUF;
  I2C_Master_Wait();
  ACKDT = (a)?0:1;
  ACKEN = 1;
  return temp;
}


//-----------------------------------------------
//MAIN - (MAIN PROGRAM)
//-----------------------------------------------


void main()
{
  nRBPU = 0;                    //Enable PORTB internal pull up resistor
  TRISC1 = 0;                   //PORTC1 in ? pulsante
  I2C_Master_Init(100000);      //Initialize I2C Master with 100KHz clock
  while(1)
  {
    I2C_Master_Start();         //Start condition
    I2C_Master_Write(0x30);     //7 bit address + Write
    I2C_Master_Write(RC0);      //Write data
    I2C_Master_Stop();          //Stop condition
    __delay_ms(200);
    I2C_Master_Start();         //Start condition
    I2C_Master_Write(0x31);     //7 bit address + Read
    RC1 = I2C_Master_Read(0);   //Read + Acknowledge
    I2C_Master_Stop();          //Stop condition
    __delay_ms(200);
  }
}



Questo quello dello slvae1



//-----------------------------------------------
//FUNZIONAMENTO ()
//----------------------------------------------- 

//  premendo il pulsante in RC1 del master si deve accendere il led in RC0 dello slave

//-----------------------------------------------
// CONFIGURATION
//-----------------------------------------------

#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF// Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)


#define _XTAL_FREQ  4000000UL


//-----------------------------------------------
// INCLUDE
//-----------------------------------------------

#include "xc.h"
#include "pic16f873.h"


//-----------------------------------------------

short z;
void interrupt I2C_Slave_Read()
{
  if(SSPIF == 1)
  {
    SSPCONbits.CKP = 0;

    if ((SSPCONbits.SSPOV) || (SSPCONbits.WCOL))
    {
      z = SSPBUF;           // Read the previous value to clear the buffer
      SSPCONbits.SSPOV = 0; // Clear the overflow flag
      SSPCONbits.WCOL = 0;  // Clear the collision bit
      SSPCONbits.CKP = 1;
    }

    if(!SSPSTATbits.D_nA && !SSPSTATbits.R_nW)
    {
      z = SSPBUF;
      while(!BF);
      RC0 = SSPBUF;
      SSPCONbits.CKP = 1;
    }
    else if(!SSPSTATbits.D_nA && SSPSTATbits.R_nW)
    {
      z = SSPBUF;
      BF = 0;
      SSPBUF = RC1 ;
      SSPCONbits.CKP = 1;
      while(SSPSTATbits.BF);
    }

    SSPIF = 0;
  }
}

void I2C_Slave_Init(short address)
{
  SSPSTAT = 0x80;
  SSPADD = address;
  SSPCON = 0x36;
  SSPCON2 = 0x01;
  TRISC3 = 1;   //Setting as input as given in datasheet
  TRISC4 = 1;   //Setting as input as given in datasheet
  GIE = 1;
  PEIE = 1;
  SSPIF = 0;
  SSPIE = 1;
}


//-----------------------------------------------
//MAIN - (MAIN PROGRAM)
//-----------------------------------------------


void main()
{
  
  nRBPU = 0;            //Enables PORTB internal pull up resistors
  TRISC0 = 0;           //PORTD0 out ? led
  TRISC1 = 1;           //PORTD1 in ? pulsante
  RC0 = 0;              //All LEDs OFF
  
  I2C_Slave_Init(0x30); //Initialize as a I2C Slave with address 0x30
  while(1);
  
  
}





Enea Ferriani
picmicro675




una ogni 10 livelli


postato il:
01.01.2018, alle ore 15:34
Devi fare attenzione, perché stai impostando l' hardware per l' I2C sui pin naturali dove esistono i regstri hardware, mentre dallo schema vorresti usare dei piedini diversi. Quindi le impostazioni dell' I2C è solo via software, senza implementare i registri, che da schema saranno usati per le EEPROM,

Comunque il master potresti anche usare lo stesso bus della EEPROM, basta che assegni un indirizzo diverso per gli slaves, che non coincide con l' indirizzo della 24LC32.

Se usi XC8, non riesco a trovare la libreria per un softI2C, cosa che si trova facile con mikroC, al prezzo di scrivere solo 2 Kwords, nella versione gratis.



Anno nuovo, forum nuovo.
Mi sa che lascio.
picmicro675




una ogni 10 livelli


postato il:
01.01.2018, alle ore 15:35
Devi fare attenzione, perché stai impostando l' hardware per l' I2C sui pin naturali dove esistono i regstri hardware, mentre dallo schema vorresti usare dei piedini diversi. Quindi le impostazioni dell' I2C è solo via software, senza implementare i registri, che da schema saranno usati per le EEPROM,

Comunque il master potresti anche usare lo stesso bus della EEPROM, basta che assegni un indirizzo diverso per gli slaves, che non coincide con l' indirizzo della 24LC32.

Se usi XC8, non riesco a trovare la libreria per un softI2C, cosa che si trova facile con mikroC, al prezzo di scrivere solo 2 Kwords, nella versione gratis.



Anno nuovo, forum nuovo.
Mi sa che lascio.
picmicro675




una ogni 10 livelli


postato il:
01.01.2018, alle ore 15:36
Doppione


Anno nuovo, forum nuovo.
Mi sa che lascio.
e.ferriani





postato il:
01.01.2018, alle ore 16:02
Lo schema originale da cui sono partito è questo,



la parte tutto il resto della mercanzia direi che i pin sono gli stessi che ho messo io nel mio.



Enea Ferriani
e.ferriani





postato il:
01.01.2018, alle ore 16:03
Come detto io per ora ho collegato solo i pin SDA SCL fra loro oltre ai pullup da 4k7, il led ed il pulsante. Per ora niente I2C.


Enea Ferriani
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale