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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy