|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
KlemenD Član
Pridružen-a: Sre 18 Maj 2011 15:08 Prispevkov: 188 Aktiv.: 1.20 Kraj: Maribor
|
Objavljeno: Tor Apr 29, 2014 6:01 am Naslov sporočila: Arduino <-> Arduino komunikacija |
|
|
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 |
|
|
KlemenD Član
Pridružen-a: Sre 18 Maj 2011 15:08 Prispevkov: 188 Aktiv.: 1.20 Kraj: Maribor
|
Objavljeno: Tor Apr 29, 2014 6:08 am Naslov sporočila: |
|
|
Č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 |
|
|
int47 Član
Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2066 Aktiv.: 9.30 Kraj: Ljubljana
|
Objavljeno: Tor Apr 29, 2014 7:55 am Naslov sporočila: |
|
|
Č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 |
|
|
KlemenD Član
Pridružen-a: Sre 18 Maj 2011 15:08 Prispevkov: 188 Aktiv.: 1.20 Kraj: Maribor
|
Objavljeno: Čet Maj 01, 2014 4:57 am Naslov sporočila: |
|
|
Hvala za hiter odgovor
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 |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.74
|
Objavljeno: Čet Maj 01, 2014 8:38 am Naslov sporočila: |
|
|
Č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 |
|
|
int47 Član
Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2066 Aktiv.: 9.30 Kraj: Ljubljana
|
Objavljeno: Pon Maj 05, 2014 11:56 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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
|