www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Arduino <-> Arduino komunikacija

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
KlemenD
Član
Član



Pridružen-a: Sre 18 Maj 2011 15:08
Prispevkov: 188
Aktiv.: 1.20
Kraj: Maribor

PrispevekObjavljeno: Tor Apr 29, 2014 6:01 am    Naslov sporočila:  Arduino <-> Arduino komunikacija Odgovori s citatom

Pozdravljeni,
iz arduina A na arduno B, bi mogel (na zahtevo B-ja) posredovati par vrednosti. Operacija (od zahteve B-ja do prejema informacij) mora biti čim krajša, vsaj manj kot 100 mikro sekund... odlično bi bilo če lahko spravim na <50 mikroS.

Poskusil sem z I2C komunikacijo kot je prikazano tukaj LINK vendar ne vem, kako naj v ''enem''' pošljem vse vrednosti, pa sem se znašel takole

PREJEMNIK
Koda:

#include <Wire.h>

int G;
int M;
void setup()
{
  Wire.begin();     
  Serial.begin(9600);
}

void loop()
{
  Wire.requestFrom(2, 1);   
  while (Wire.available())   
  {
     M = Wire.read();
  }
 
  Wire.requestFrom(2, 1);   
  while (Wire.available())   
  {
     G = Wire.read();
  }
  Serial.println(M);
  Serial.println(G);
  delay(500);

}


POŠILJATEL
Koda:

#include <Wire.h>
int k;
int M;
int G;
void setup() {
  Wire.begin(2);               
  Wire.onRequest(requestEvent);
}

void loop() {
  //ostala koda
}

void requestEvent(){
 if(k == 0){
  Wire.write (M);
  k = 1;}
  else if(k == 1){
     Wire.write (G);
     k = 0;}

  }



Vendar vzame to preveč časa (okoli 400 mikro sekund) da prejemnik prejme vrednosti G,M (pri projektu bom rabil več vrednosti kot samo G in M... in za vsako vrednost, ki jo dodam zraven k prikazani kodi, se čas poveča za 200 mikro sekund)


Kako bi lahko to izvedel hitreje ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
KlemenD
Član
Član



Pridružen-a: Sre 18 Maj 2011 15:08
Prispevkov: 188
Aktiv.: 1.20
Kraj: Maribor

PrispevekObjavljeno: Tor Apr 29, 2014 6:08 am    Naslov sporočila:   Odgovori s citatom

Če koga zanima kako sem izmeril čas:
kodo prejemnika sem spremenil takole:

Koda:

#include <Wire.h>

int G;
int M;
int a;
int b;
void setup()
{
  Wire.begin();     
  Serial.begin(9600);
}

void loop()
{
  a = micros();
  Wire.requestFrom(2, 1);   
  while (Wire.available())   
  {
     M = Wire.read();
  }
 
  Wire.requestFrom(2, 1);   
  while (Wire.available())   
  {
     G = Wire.read(); // receive a byte as character
  }
  b = (micros() - a);
  Serial.println(b);

}
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
int47
Član
Član



Pridružen-a: Pon 15 Dec 2003 0:10
Prispevkov: 2066
Aktiv.: 9.30
Kraj: Ljubljana

PrispevekObjavljeno: Tor Apr 29, 2014 7:55 am    Naslov sporočila:   Odgovori s citatom

Če pogledaš tale PDF, da je I2C v ATmega328 omejen na 400kHz.
Na hitro v Arduino wire knjižnici ne najdem načina, kako se nastavlja hitrost I2C.

Pri 400kHz za prenos enega byte-a porabiš cca 8/400k = 20us.
request: naslov + min 1 byte = 2 byta = cca 40us
response: 2 byta = cca 40us
Pri 400kHz hitrosti vodila skupaj porabiš vsaj 80us +start/stop+ potreben čas za obdelavo.

Predlagam kaj hitrejšega, recimo SPI lahko deluje do fclk/4 = 16MHz/4 = 4MHz.
Tudi HW serijski vmesnik gre do fosc/(UBRRn+1), s tem da je tu lahko omejitev hitrost MAX232, če je uporabljen.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
KlemenD
Član
Član



Pridružen-a: Sre 18 Maj 2011 15:08
Prispevkov: 188
Aktiv.: 1.20
Kraj: Maribor

PrispevekObjavljeno: Čet Maj 01, 2014 4:57 am    Naslov sporočila:   Odgovori s citatom

Hvala za hiter odgovor Smile

Da, tudi sam sem si to poračunal, preden sem se odločil za I2C in z 100us bi še lahko preživel. Vendar sem potem vseeno še probal izmerit čas, ki ga dejansko porabi... in sem dobil 200 us... a si toliko časa vzame za obdelavo ?

Pa prosil bi za nasvet, kako naj popravim kodo, da bo delovala takole;

request za 2 byta
response (vrednosti G in M)

ker trenutno deluje tako:

request za 1 byte
response (vrednost M)

request za 1 byte
response (vrednosti G)

Kar vzame še več časa kot je potrebno

Atmega čipa imam potem namen vzet iz arduino borda in ju vgradit v vezje, ki ga sestavljam. Zato se mi predvsem dopade I2C, ker vem da ne potrebujem nobenega vmesnega IC-ja.
SPI- ja pa ne poznam tako dobro, vendar sklepam, da pri tem potrebijem še nek vmesnik ?

Hvala
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 19.74

PrispevekObjavljeno: Čet Maj 01, 2014 8:38 am    Naslov sporočila:   Odgovori s citatom

Če imaš dovolj tac na razpolago lahko celoten port povežeš med obema, na ta način boš vseh 8 bitov prenesel v enem ciklu...
_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
int47
Član
Član



Pridružen-a: Pon 15 Dec 2003 0:10
Prispevkov: 2066
Aktiv.: 9.30
Kraj: Ljubljana

PrispevekObjavljeno: Pon Maj 05, 2014 11:56 pm    Naslov sporočila:   Odgovori s citatom

KlemenD je napisal/a:
Vendar sem potem vseeno še probal izmerit čas, ki ga dejansko porabi... in sem dobil 200 us... a si toliko časa vzame za obdelavo ?

Zelo verjetno I2C ne deluje na 400kHz.
Poskusi po inicializaciji direktno v ustrezen I2C register vpisat pravo vrednost za 400kHz pri uporabljenem kristalu.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group