Go Down

Topic: Comunicazione arduino pic tramite seriale (Read 1 time) previous topic - next topic

enrico88

Salve a tutti, ho collegato un PIC16f887 ad un Arduino mega 2560 tramite seriale (uart),quindi usando solo i piedini Rx e Tx.Ho problemi con lo scambio d'informazioni tra i due; ho scritto il codice ma ho problemi con la sincronizzazione.
Le operazioni sono le seguenti:

1)Arduino......  invia 3 dati
2)Pic.............leggi i 3 dati
3)Pic.............invia 4 dati
4)Arduino......  ricevi 4 dati

ho provato in tanti modi mettendo istruzioni di controllo(if while) ma niente.....ho bisogno necessariamente di qualche segnale aggiuntivo?
Di seguito è postato il codice con qualche piccolo commento.
Ringrazio anticipatamente chi volesse aiutarmi, dandomi qualche suggerimento.

CODICE ARDUINO:
Code: [Select]
int id=3;
int letto=0;
unsigned int myInt[2]={4,2};; // 1 int 2 bytes
unsigned int k [4] = {0,2,3,4};
int buffer;
int volte=0;
byte LSB,MSB,LSB1,MSB1;
byte b[4]={0,0,0,0};
int c=0;
char buf[3];
void setup()
{
    Serial.begin(9600);
}


void encrypt (unsigned int* v, unsigned int* k) {
    unsigned int v0,v1, sum, i;
    unsigned int delta;
    unsigned int k0, k1, k2, k3;   /* chiave */
    delta=3;
    v0=v[0];
    v1=v[1];
    sum=0;
    k0=k[0];
    k1=k[1];
    k2=k[2];
    k3=k[3];
    for (i=0; i < 32; i++) {
        sum += delta;
        v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
    }
    v[0]=v0;
    v[1]=v1;
}

void loop()
{
  //MANDO I 3 DATI AL PIC CIOE' id,myInt[0],myInt[1]
        Serial.println(id,DEC);
         delay(1000);
        Serial.println(myInt[0],DEC);
         delay(1000);
        Serial.println(myInt[1],DEC);
         encrypt(myInt,k);
          LSB = myInt[0] & 0xff;
          MSB = (myInt[0] >> 8) & 0xff;
          LSB1 = myInt[1] & 0xff;
          MSB1 = (myInt[1] >> 8) & 0xff;
         
       
//leggo 4 dati dal PIC         
if (Serial.available())
    {     
               b[0]=Serial.read();
           delay(100);
                b[1]=Serial.read();
          delay(100);
              b[2]=Serial.read();
           delay(100);
             b[3]=Serial.read();
                delay(100);
          //se le codifiche sono uguali fai suonare un cicalino
          if ((LSB==b[0])&&(MSB==b[1])&& (LSB1==b[2])&&(MSB1==b[3]))
           {
         for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=2)
        {
         analogWrite(9, fadeValue);         
          delay(15);
        }               
           }
           }
}



CODICE PIC:

Code: [Select]
#include "built_in.h"
unsigned int myInt[2];
unsigned buffer[4];
unsigned int k [4] = {0,2,3,4};
int ident=0;

void encrypt (unsigned int* v, unsigned int* k) {
    unsigned int v0,v1, sum, i;
    unsigned int k0, k1, k2,k3;
    unsigned int delta;
    v0=v[0]; v1=v[1]; sum=0;
    delta=3;
    k0=k[0]; k1=k[1]; k2=k[2]; k3=k[3];
    for (i=0; i < 8; i++) {
        sum += delta;
        v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
    }
    v[0]=v0;
    v[1]=v1;
}

void main()
{
      //LEGGE identificativo e dati mandati dall'arduino
     ident=UART1_Read();
     Delay_ms(100);
     myInt[0]=UART1_Read();
     Delay_ms(100);
     myInt[1]=UART1_Read();
     Delay_ms(100);

encrypt(myInt,k);
buffer[0] = Lo(myint[0]);
buffer[1] = Hi(myint[0]);
buffer[2] = Lo(myint[1]);
buffer[3] = Hi(myint[1]);
//mando 4 dati all'arduino
UART1_Write(buffer[0]);
Delay_ms(100);
UART1_Write(buffer[1]);
Delay_ms(100);
UART1_Write(buffer[2]);
Delay_ms(100);
UART1_Write(buffer[3]);
}

pelletta

Non ho mai usato i pic, comunque vedendo il codice non ho trovato il parametro del baud rate...
assicurati che anche il pic legge a 9600bps
Ciao e scusami se non sono stato di aiuto

enrico88

figurati grazie lo stesso :)...anche il baud rate per il Pic è fissato a 9600..scambiano correttamente informazioni ma non so ad esempio come far aspettare il pic...deve leggere i dati dopo che l'arduino li ha scritti

cece99

devi mettere un carattere di inizio trasmissione e uno di fine  ;) tipo /\
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

Madwriter

e un caratteri di procedi,ti conviene inviare un dato alal volta lo elabori e poi tramite un carattere speciale dici ad arduino di mandare il prossimo cosi non rischi di perderti qualcosa  :smiley-mr-green:
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

enrico88

grazie mille per le risposte :)....mi potreste x favore fare un esempio di codice che implementa il protocollo con i caratteri di sincronizzazione...ho difficoltà nell'implementare quanto mi avete detto...grazie ancora

PaoloP

La Mega2560 ha 4 seriali hardware. Potresti spostare la connessione al PIC sulla seconda seriale [Serial1 sui pins 19 (RX) and 18 (TX)] e usare la prima per il debug tramite serial monitor.

C'è anche la possibilità, dell'IDE 1.0, e quindi anche con la 1.0.1 di usare la funzione Serialevent() --> http://arduino.cc/en/Tutorial/SerialEvent (http://arduino.cc/en/Reference/SerialEvent) però solo per leggere i dati, non per inviarli.

Nota: [font=Verdana]Le seriali sul Mega sono Serial, Serial1, Serial2 e Serial3. La seconda è la Serial1  [/font]:smiley-mr-green:

Code: [Select]
void setup()
{
Serial.begin(9600); // Collegamento al Serial Monitor
Serial1.begin(9600); // Collegmaneto al PIC - 18 tx - 19 rx
}

ecc.. ecc..

Go Up