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:
01.01.2018, alle ore 16:05
Una cosa importante. Io ora sto andando a 4MHz, non ad 8.


Enea Ferriani
e.ferriani





postato il:
03.01.2018, alle ore 08:06
Stavo vedendo un po' in giro ed ho trovato dei transceiver SN65LBC184 per comunicazione RS-485.

http://www.ti.com/product/SN65LBC184?keyMatch=sn65lbc184d&ti…

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?

Grazie.



Enea Ferriani
picmicro675




una ogni 10 livelli


postato il:
03.01.2018, alle ore 13:12
Potrebbe interessarti anche questo
http://jap.hu/electronic/pbus.html
Senza aggiunta di altri CI.
Se vuoi aggiungere integrati allora guarda il MAX483
https://www.maximintegrated.com/en/products/interface/transc…
ed un esempio come questo
http://fritzing.org/projects/pic16-temperature-sensor-with-r…
l'inevitabile allungamento dei cavi di collegamento forse è meglio la 485 dell'I2C

Questo l' avevo fatto notare. Poi dipende dalla velocità che si vuole ottenere, I2C è ovviamente più veloce.



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




una ogni 10 livelli


postato il:
03.01.2018, alle ore 13:41
Se volessi usare ancora I2C, questo
http://www.instructables.com/id/Microchip-PIC-Library-to-Con…
aiuta a trovare la libreria per I2C da scaricare da Microchip.com



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





postato il:
03.01.2018, alle ore 13:57
.... 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




una ogni 10 livelli


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;


void main()
{
  unsigned char data1;
  unsigned char command;
  char txt[4];
  char txt1[] = "Received ";
  char txt3[] = "Slave Test";

  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);
  }
}


Per lo slave:
#define SLAVE_ADDRESS 0x30
unsigned char rxbuffer,address, buff;
unsigned char a1=0;

void I2C_Slave_Init(unsigned char address)
{
  SSPSTAT = 0x80;
  SSPADD = address; //Setting address
  SSPCON1 = 0x36;    //As a slave device
  SSPCON2 = 0x01;
  TRISC3_bit = 1;       //Setting as input as given in datasheet
  TRISC4_bit = 1;       //Setting as input as given in datasheet
  GIE_bit = 1;          //Global interrupt enable
  PEIE_bit = 1;         //Peripheral interrupt enable
  SSPIF_bit = 0;        //Clear interrupt flag
  SSPIE_bit = 1;        //Synchronous serial port interrupt enable
}

void interrupt(){
     if (PIR1.SSPIF){
        PIR1.SSPIF = 0;
        if(!SSPSTAT.R_W & SSPSTAT.D_A & SSPSTAT.BF ){
            a1++;
            if (a1==1){
               address=SSPBUF;
            }
            if (a1==2){
               rxbuffer=SSPBUF;
               a1=0;
            }
            PIR1.SSPIF = 0;
        }

        if( !SSPSTAT.R_W & !SSPSTAT.D_A & SSPSTAT.BF ){
            buff = SSPBUF;
            PIR1.SSPIF = 0;
        }
     }
}

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.



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




una ogni 10 livelli


postato il:
03.01.2018, alle ore 17:59
Scusate il link è sbagliato. Questo è quello del forum
https://forum.mikroe.com/viewtopic.php?f=13&t=8106&start=30



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





postato il:
04.01.2018, alle ore 07:48
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




una ogni 10 livelli


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.


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