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
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
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.
#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
}
#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
//-----------------------------------------------
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;
}
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.
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
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.
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