I2C 7 byte adat feldolgozás / DS18B20 konverziós idő kérdés

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

I2C 7 byte adat feldolgozás / DS18B20 konverziós idő kérdés

Hozzászólás Szerző: broland »

Szervusztok

Szeretnék segítséget kérni a következő kérdésekben:

1: adott egy I2C-s master / slave kommunikáció, a master 1 másodpercenként kér a slave-től 7 byte adatot. Ebből a 7 byte-ból az adott pozicióban lévő (adott számú) byte adatait kell kiértékelni. Pl: byte1 a keret tipusa, byte 3 hőfok érték stbstbstb. Ez a része, egészen a kiküldésig az I2C buszra működik. Viszont a teszteléshez kellene egy master program, ami átmenetileg a soros portra írja ki az adatokat, mellyel nem jutok egyről a kettőre. A 7 byte-ot a requestFrom(8,7) parancsal kérem le, de nem tudom, hogy darabonként (byte1, byte2), vagy akár vesszővel elválasztva formázva, ezt a 7 byte-ot hogy tudom a soros portra kiiratni. Ezen nagyon elvéreztem.

2: a rendszerben, ill a protokollban van egy "érdekes" csavarás. A rendszer a hőfokot egy byte-on ábrázolja a 0=-40fok, 255=215fok. Mivel nekem csak 1 byte-on kell a kerek hőfokot kiküldenem gondolom a konverziós időt lehetne csökkenteni. Ha 9 bitesre állítom a felbontást, és nem parazitával hajtom meg, akkor mennyi lesz a konverziós idő? Van erről Nektek valós tapasztalatotok? (mert igazából 1 másodperc alatt kellene 4 db-ot kiértékelnem, és még egy két funkciót elvégeznem.)

"Röviden" ennyi lenne :)

Előre is köszönöm.
ÜDv ROland
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

A legfontosabbat nem írtad! Mi az Interpreter (Arduino)?
Különben az Első lecke mindenűt a „Helo Word”!
:lol:

Ilyenkór a kérdéses program részlet közlése sokat segítene, a kérdés megértésében! :?
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. június 1. péntek, 12:10-kor.
Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

Hozzászólás Szerző: broland »

Hello

Bocs, erre kicsit később gondoltam csak. Az interpreter arduino, a kódból pedig részletek:

Van egy a követelményeknek megfelelő tömböm

Kód: Egész kijelölése

char data[8][7] = { 
{0x11, 0xAF, 0x00, 0x2D, 0x00, 0x00, 0x11},
{0x12, 0x00, 0x2C, 0x2C, 0x2E, 0x25, 0x12}, 
{0x13, 0x18, 0x01, 0xD4, 0x22, 0x28, 0x13},
{0x14, 0x00, 0x00, 0x00, 0x00, 0x28, 0x14},
{0x15, 0x00, 0xFF, 0x01, 0xFE, 0x01, 0x15},
{0x16, 0x3C, 0x04, 0x1D, 0x00, 0x00, 0x16},
{0x17, 0x00, 0x99, 0x06, 0x28, 0x28, 0x17},
{0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18}
}; 
Aminek az adatait a megfelelő i2c cím megszólításakor kiküldök a masternek

Kód: Egész kijelölése

void Send_Data(){

    static unsigned char msgId = 0;

    if (TWAR != (0x08 << 1))
        return;

    Wire.send((uint8_t *) data + msgId * 7, 7);

    msgId++;

    msgId %= 8;

}
A masternek a requestFrom(8,7) parancs után valahogy a soros porton az első lekérdezéskor ezt kellene kiírnia:
0x11, 0xAF, 0x00, 0x2D, 0x00, 0x00, 0x11
az 1 másodperc múlva bekövetkező lekéréskor ezt
0x12, 0x00, 0x2C, 0x2C, 0x2E, 0x25, 0x12

és így tovább :)

Előre is köszi.

Üdv ROland
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Valami ilyesmi?:

Kód: Egész kijelölése


int j = 0  // tömb sorszám (Tömb elérési
Indexelt tömbök nulla, azaz, utalva a fenti tömb inicializálás, az első eleme a tömb index a 0, tehát)


for (int i=0; i <= 6; i++){  // 7 tömb oszlopok
     Serial.Print(Data[j][i]);
   }
  Serial.Println() ; // Sorvége
  j++ ;
  If (j > 7) { j = 0)};
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Közben volt időm kicsit utána nézni a témának!
Javítottam a zárójelezésen!

Nem értem ilyenkor hól vannak az erős emberek, akik majdnem meg vertek, amiért nem preferáltam ezt a nyelvet.
Meg mutathatnák, ők mit is tudnak!?
Vagy, ezt csak olyanok használják, akik csak ráteszik a mások által meg írt alkalmazást?
:wink:
Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

Hozzászólás Szerző: broland »

Szia Kapu48

Na ezzel beszxxtam.

Igaz, hogy csak szimulátorban próbáltam, de semmi nem megy.
Ez egy adott "rendszer", amit személyre lehet szabni bizonyos eszközökhöz.
A kapott részforrás a leírások alapján megy az eszközön, de nekem a szimulátorban nem :evil:

Megyek vissza a hello word i2c-n részre, aztán kiderül, hogy a szimulátor, vagy én vagyok a gyengébb :oops:

Köszi addig is.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

És min Szimulálod? :?:
Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

Hozzászólás Szerző: broland »

Na megjöttünk!

Az alap hello word sem megy i2c-n.
Még holnap adok neki egy lehetőséget, hátha én néztem be valamit a sim-ben.
A részletek a sim-ről privátban mentek.

Üdv Roland
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Azt hiszem nem jól értem a problémádat!
Először ezt irtad:” A masternek a requestFrom(8,7) parancs után valahogy a soros porton az első lekérdezéskor ezt kellene kiírnia:”
...

Most meg már:” Az alap hello word sem megy i2c-n.”
:?: :?: :?: :?

Valószínű a szimulátorod tréfál meg!
Mért nem élesben Tesztelsz?
:?:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Nálam az alap demó 2*DS18x20demo beolvasás mükxik.
Ezt akarod kiegészíteni soros ki írással?
:?
Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

Hozzászólás Szerző: broland »

Jajjj nagyon rosszul írtam le a problémát.

Most nem bántanak a frontok, úgyhogy bővebben leírom:

Slave kód:

Kód: Egész kijelölése


#include <Wire.h>

#define i2c_address  0x08

char data[8][7] = { 
{0x11, 0xAF, 0x00, 0x2D, 0x00, 0x00, 0x11}, 
{0x12, 0x00, 0x2C, 0x2C, 0x2E, 0x25, 0x12},
{0x13, 0x18, 0x01, 0xD4, 0x22, 0x28, 0x13},
{0x14, 0x00, 0x00, 0x00, 0x00, 0x28, 0x14},
{0x15, 0x00, 0xFF, 0x01, 0xFE, 0x01, 0x15},
{0x16, 0x3C, 0x04, 0x1D, 0x00, 0x00, 0x16},
{0x17, 0x00, 0x99, 0x06, 0x28, 0x28, 0x17},
{0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18}
};

void setup(){
    Wire.begin(i2c_address);
    Wire.onRequest(send_data);
}

void loop(){}

void send_data(){

    static unsigned char msgId = 0;

    if (TWAR != (i2c_address << 1))
        return;
                 
    Wire.send((uint8_t *) data + msgId * 7, 7);
    msgId++;
    msgId %= 8;
}


Master kód:

Kód: Egész kijelölése


#include <Wire.h>

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

void loop(){
  Wire.requestFrom(8, 7);

  while(Wire.available()){
    char c = Wire.read();
    Serial.print(c);
  }

  delay(2000);
}

Na ebből a slave kód biztos hogy megy, mert másnak működik élőben. De vagy a kiolvasás hibás, bár próbáltam tömbbe is rendezve, vagy a szimulátor f0s.

Na ezt próbáltam ki a szimulátorban úgy, hogy a slave csak a "hello " 6 byte-ot küldi ki a masternek, az meg csak 6 byte-ot vár, de nem működött.

Mindez csak egy egyszerű I2C kapcsolásban.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Most akkor neked 1 I2C vonalon van 3 eszköz?
:?:
Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

Hozzászólás Szerző: broland »

Nemnem

Van egy slave eszk?z?m ami majd ha m?r rendesen ki tudom olvasni szimul?torban a master-el az ?ltala k?ld?tt adatokat, akkor kezd el kommunik?lni 4db 1Wire Ds18x20-al.
Nem szeretn?m az ?j procit sz?jjel flash-elni :)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Feladom!

Most még zavarosabb, mint előtte volt!

Mi a Slave és, mi a Master?

A Slave és a Master min van összekötve?

:? :cry:

Mit jelent, hogy széjjel Flashelni?
Én már évek óta nyúzok 1 M64-est mindig az a kísérleti nyúl.
Mikor Tesztelek, valami programot naponta 10-20 szór, újra írom.
– Write/Erase cyles: 10,000 Flash/100,000 EEPROM
Még ilyen használat mellet is 1000 napig kellene Flashelned mire elege lenne !
:lol: :lol:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Az én tippem:
1wiremaster-i2cslave atjaro.....



Vázlatrajz?
Működési elképzelés?
Rendszerfelépítés?
Kapcsolási rajz?

http://avr.tavir.hu/modules.php?name=Fo ... opic&t=828

"Ugyancsak nem informatív, sem címben, sem leírásban a "Print nem működik".
TE ülsz az áramkör előtt, TE látod mi zajlik, mi van ott. Mi csak a leírásodat látjuk....
Szóval inkább legyen terjengős, mint nem követhető. "
Válasz küldése