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:
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:
#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]);
}