Che dite? attualmente come detto devo mettere in comunicazione 5 PI16F873-04, che per ora fanno il proprio lavoro, e sono tutti sulla stessa schedina doppio europa.
Il plastico avrà necessariamente più di una scheda con più di un micro ogni scheda, magari qualcosa disperso qua e là ...volendo magari connettere tutto in una unica rete e data l'inevitabile allungamento dei cavi di collegamento forse è meglio la 485 dell'I2C, che ho letto essere adatto per connessioni non superiori al metro.
Ho trovato qualcosa in rete, ma voi cosa mi suggerite per iniziare? qualche link sperimentato?
.... Poi dipende dalla velocità che si vuole ottenere, I2C è ovviamente più veloce.
La velocità ora mi interessa poco. Ma supponiamo che io voglia far parlare due o tre micro tra loro.
Trovo da qualche parte una traccia da "riciclare" con XC8?
Quello che mi hai mandato, il primo, è interessante. Unifilare, l'avevo visto qualche anno fa, ma era stato ritenuto poco stabile nell'ambiente in cui sarebbe stato utilizzato, per questo scartato.
Il secondo mi mostra il Maxim, ma che sia di questa p di altre marche poco importa. Per fare delle prove mi accontenterei anche di questo http://www.ti.com/lit/ds/symlink/sn65176b.pdf, che è come quello che già avevo l'altri TI.
Quello che manca è un sorgente funzionante per poter valutare l'I2C e RS485. Poi lo sviluppo da solo, ma per partire ho trovato solo quello che ho messo prima, ma apparentemente non gira.
Ho messo un led ad un certo punto del codice e non ci passa nemmeno vicino.
Per la prima soluzione ho una sporta di integratini, per la seconda li devo comprare, ma posso collegarli alla distanza che voglio, non necessariamente sulla stessa scheda.
Enea Ferriani
picmicro675
postato il: 03.01.2018, alle ore 17:56
Per XC8 non ho trovato molto. Ho trovato questa discussione su MikroElektronika con esempi da scaricare.
http://blog.sina.com.cn/s/blog_574d08530100ih40.html Al simulatore sono alquanto pratici, ma quello che ho provato io mi da un errore che potrebbe essere relativo al 16F873A.
Comunque cerca di interpretare le funzioni di entrambe i compilatori. Come per esempio il primo che già offre le routine in XC8 per dialogare in I2C, poi provi a trasportare il codice di mikroC in quello di XC8, valutando che le routine hanno qualche diversità .
Io ho scritto con mikroC questi:
Per il master
//-----------------------------------------------
//MAIN - (MAIN PROGRAM)
//-----------------------------------------------
// Lcd pinout settings
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;
// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;
I2C1_Init(100000); //Initialize I2C Master with 100KHz clock
Lcd_init(); //Initialize the LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1,0,txt3); // Write text in first row
while(1)
{
I2C1_Start(); //Start condition
I2C1_Wr(0x30); //7 bit address + Write
I2C1_Wr(command); //Write data
I2C1_Stop(); //Stop condition
delay_ms(200);
I2C1_Start(); //Start condition
I2C1_Wr(0x31); //7 bit address + Read
data1 = I2C1_Rd(0); //Read + Acknowledge
I2C1_Stop(); //Stop condition
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Out(0,4,txt1); // Write text in first row
Lcd_Cmd(_LCD_SECOND_ROW);
ByteToStr(data1, txt);
Lcd_Out(1,6,txt);
delay_ms(1000);
}
}
void main()
{
TRISC0_bit = 0; //PORTC0 output led
TRISC1_bit = 1; //PORTC1 input pulsante
PORTC.F0 = 0; //LED OFF
I2C_Slave_Init(SLAVE_ADDRESS); //Initialize I2C slave
while (1)
{
if (address == SLAVE_ADDRESS) { // if the device is our own
PORTC.F0=rxbuffer.F0; // we set the led accordingly first BIT
}
buff=PORTC; // always update the PORTC to the master
}
}
Lo schema:
Ovvio che mikroC si prende cura delle impostazioni dei vari FUSES e qualcosa altro, che invece in XC8 bisogna asserire all' inizio del sorgente.
Quello che fa il programma è di prendere il bit inviato dal master ed accendere il LED, sebbene non ci sono interfacce all' esterno per modificare il valore, questo è fisso. Poi riporta lo stato della PORTC e lo mostra sul display.
Non ho mplabX installato e non posso compilare con XC8. Comunque magari provo.
Stavo scrivendo ieri sera, poi ad un certo punto è andata via la linea e non ho potuto completare il messaggio.
Stavo scrivendo questo.
Non ho ancora guardato i link che hai messo, ma vedo che nel tuo schema c'è un componente I2C. Avevo letto che nella comunicazione tra due pic aventi il modulo I2C a bordo lo si poteva anche omettere.
Sarebbe necessario mettere un I2C su ogni pic per comunicazioni tra più di due pic. Confermi, oppure ho inteso male io?
Voglio dire, ci va sempre o non ci va mai?
Nel caso ci vada il I2C come configuro i tre pin A0, A1, A2 del ic 24LC32?
Enea Ferriani
picmicro675
postato il: 04.01.2018, alle ore 15:01
Il quadratino in basso è uno strumento per il debug del simulatore.
Se non hai abbastanza EEPROM interna e vuoi mettere quella esterna allora ci può essere un paio di soluzioni.
Caso 1: il CI EEPROM è unico, si mette su un unico bus I2C e gli slave si impostano con indirizzi diversi dalla EEPROM. Eventualmente la gestione della memoria deve essere presa in carico dal master a secondo dei codici ricevuti dagli slaves. Quindi si ha un certo periodo di trasferimento dati da master a slaves.
Caso2: ogni slave vuole la sua EEPROM, si deve mettere due bus I2C, uno per la comunicazione tra MCU e uno per salvare i dati locali di ogni MCU, quindi uno sarà da implementare in via software (non so se si trova per XC8). È ovvio che le memorie hanno un solo indirizzo fisso. Non capisco come mai i 225 bytes interni non siano sufficienti.
Se il firmware non supera i limiti di MikroC free, allora consiglio quello, oppure acquistarlo. Utile con le diverse librerie. Mentre per XC8 trovo che è alquanto ostico.
Anno nuovo, forum nuovo.
Mi sa che lascio.
e.ferriani
postato il: 04.01.2018, alle ore 20:09
Quindi gli I2c che ho messo nel mio schema non serono. Basterà colegare data e clock di tutti i pic. Se ho abbastanza memoria lo vedo in mplabx. Se è così provo senza e uso il tuo codice, quando riesco.
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