collapse

* Links de Robótica

* Posts Recentes

Ajuda Projecto IR / RF por Njay
[Hoje às 00:03]


Recomendação de um opamp para um DAC r2r por jm_araujo
[Ontem às 23:05]


Ideias para construir um quadrúpede simples por dropes
[Ontem às 22:43]


Ajuda com TRIAC por senso
[17 de Novembro de 2017, 18:00]


TV LG White Screen por almamater
[15 de Novembro de 2017, 08:37]


Pergunta sobre prototipagem ( Pesquisa ) por luisjustin
[14 de Novembro de 2017, 23:22]


Medir Agua que está no Poço por Njay
[14 de Novembro de 2017, 13:28]


Amplificador audio por beirao
[12 de Novembro de 2017, 23:43]


Power_OK Enermax por edeweld
[12 de Novembro de 2017, 17:15]


Driver motor por beirao
[11 de Novembro de 2017, 17:40]

Autor Tópico: Arduino ajuda  (Lida 1035 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline filmarvit

  • Mini Robot
  • *
  • Mensagens: 4
Arduino ajuda
« em: 08 de Novembro de 2011, 18:18 »
Estou a tentar comunicar com 2 arduinos  utilizando  o protoc Spi. quando tento enviar mais de 8 bits do lado do Master tudo seguido eu nao consigo tenho de fazer um delay entre cada transmissao.. Depois quando o slave responde ao Master a um pedido do lado do Master nao esta a receber nada nao sei se tenho de por o Slave em modo de Master?


code  Master
#include <avr/io.h>
#include <util/delay.h>   // delay eg _delay_ms(6);
#include <stdio.h>

void setup()
{
   Serial.begin(9600);
   /* SETTING CLOCK PRESCALER TO 1 */
   CLKPR = 0x80;    // Enable change to prescaler
   CLKPR = 0x00;    // Set clock prescaler to 1

   /* SETTING UP PORT DIRECTIONS */
   DDRB = 0b11101111;   // All output except MISO (PB4)

   /* SETTING UP SPI */
   SPCR = 0x50;   // Enable SPI in MSB-first mode, disable SPI interrupt and set SPI clock prescaler to 4
//   SPSR |= 0x01;   // Enable double speed (f_spi-clk = f_clk/2)
   SPSR &= 0xFE;   // Disable double speed
}
   

void SPI_MasterTransmit(unsigned char data_byte)
{
   SPDR = data_byte;
   PORTB &= 0xFB;   // Pull SS low to enable the slave

   while(!(SPSR & (1<<SPIF)));
   PORTB |= 0x04;   // Pull SS high to disable the slave
}


void loop()
{
  int data;
   //setup();   // Set registers for interrupts to run etc
   delay(5000);
   
   SPI_MasterTransmit('l');
    delay(10);
   SPI_MasterTransmit('c');

   SPI_MasterTransmit('d');
   
   
 
 
   
   data= SPI_SlaveReceive();
  Serial.println(data);
   
}
unsigned char SPI_SlaveReceive()
{
  while(!(SPSR & (1<<SPIF)));
  return SPDR;
}


code Slave
#include <stdio.h>
#include <avr/io.h>
#include <SPI.h>
#define MOSI 11
#define MISO  12
#define SCK  13
#define SS 10

int array [3];
int array2[] = {108,99,100};
unsigned char data = 2;
unsigned char scrap;
int counter = 0;

void setup()
{

  int i=0;
  pinMode(MOSI, INPUT);
  pinMode(MISO, OUTPUT);
  pinMode(SCK,INPUT);
  pinMode(SS,INPUT);
  SPI.begin();
  Serial.begin(9600);
  Serial.println("Enabling SPI in slave mode");
  SPCR = 0x40;  // Enable SPI in slave mode
  delay(500);
  Serial.println("Initialisation complete.");

  for(i=0;i<3;i++){
   
 
  array= SPI_SlaveReceive();
   Serial.println(array);
 
  //Serial.println(data);
  }
}
 int i;
void loop()
{
 
int  da;
  /*i++;
  data=0;
  Serial.print("loop");
 
 
 
  Serial.println(i);
  data = SPI_SlaveReceive();
  Serial.println(data);
 
 for(i=0;i<11;i++){
 da=array;
 Serial.println(data,DEC);
 delay(1000);
 }
  */
 
 if (array_cmp(array, array2, 3, 3) == true){
   // do this if they are equal
   da=5;

   digitalWrite(SS,LOW);
   SPI.transfer(da);
   digitalWrite(SS,HIGH);
      Serial.println("Entrou7777777");
       Serial.println(da,HEX);
   }else{
      // do this if they are different
   }
 
}

unsigned char SPI_SlaveReceive()
{
  while(!(SPSR & (1<<SPIF)));
  return SPDR;
}


void SPI_SlaveTransmit(unsigned char data_byte)
{
   SPDR = data_byte;
   PORTB &= 0xFB;   // Pull SS low to enable the slave

   while(!(SPSR & (1<<SPIF)));
   PORTB |= 0x04;   // Pull SS high to disable the slave
}

boolean array_cmp(int *a, int *b, int len_a, int len_b){
   int n;
          Serial.println("Entrou");
   // if their lengths are different, return false
   if (len_a != len_b) return false;

   // test each element to be the same. if not, return false
   for (n=0;n<len_a;n++) if (a[n]!=b[n]) return false;

   //ok, if we have not returned yet, they are equal :)
   return true;
}
« Última modificação: 15 de Janeiro de 2012, 16:37 por Psycop »

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.401
  • Helpdesk do sitio
Re: Arduino ajuda
« Responder #1 em: 08 de Novembro de 2011, 18:45 »
Não queres fazer mais nenhum tópico?
Acho que 3 já chegam....

Primeira coisa, tens noção que o SPi funciona basicamente como um shift register e que são trocados ao mesmo tempo dados entre o master e o slave, é que tens funções separadas para master e para slave, quanto a duvidas, a Atmel tem AppNotes sobre isso e com código, que provavelmente terás de portar por ser para Iar ou coisa parecida, se não tiver, pelo menos a datasheet ajuda um bom bocado.
Outra coisa, provavelmente queres um deles a ler os dados na transição ascendente e outro na transição descendente do clock, e mais outra, o slave se não for por interrupções bem que podes esquecer isso.
« Última modificação: 08 de Novembro de 2011, 18:49 por senso »
Avr fanboy

Offline filmarvit

  • Mini Robot
  • *
  • Mensagens: 4
Re: Arduino ajuda
« Responder #2 em: 08 de Novembro de 2011, 18:50 »
Pus três tópicos porque estou mesmo apertado em relação a esta comunicação entre o Arduino e o protocolo SPI, mas agradeço pelo aviso.