60 nap alatt Arduino #28 - I2C busz általában

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Avatar
Robert
Elektronbűvölő
Hozzászólások: 9989
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: 60 nap alatt Arduino #28 - I2C busz általában

HozzászólásSzerző: Robert » 2019. október 31. csütörtök, 7:31

A eljáráskönyvtárakkal egy gond van - elrejtik a valódi működést...
Ezért a leckékben csak ha valahol nagyon kell, illetve az az alapmetódus - ott vannak használva.
http://www.tavir.hu - a gazda :)

Avatar
etwg
Pákabűvész
Hozzászólások: 212
Csatlakozott: 2011. február 7. hétfő, 7:00
Tartózkodási hely: Ausztria
Kapcsolat:

Re: 60 nap alatt Arduino #28 - I2C busz általában

HozzászólásSzerző: etwg » 2019. október 31. csütörtök, 7:45

Még egy kérdés.

A Wire.begin()

Ez a parancs, gondolom magára az Arduinora vonatkozik (azon állitja be a paramétereket) és csak egyszer kell, ha több eszköz is van az I2C buson.
Éljenek a vonatok!

http://www.youtube.com/playlist?list=PLF2674BF4E3765682

Avatar
etwg
Pákabűvész
Hozzászólások: 212
Csatlakozott: 2011. február 7. hétfő, 7:00
Tartózkodási hely: Ausztria
Kapcsolat:

Re: 60 nap alatt Arduino #28 - I2C busz általában

HozzászólásSzerző: etwg » 2019. október 31. csütörtök, 7:52

Robert írta:A eljáráskönyvtárakkal egy gond van - elrejtik a valódi működést...
Ezért a leckékben csak ha valahol nagyon kell, illetve az az alapmetódus - ott vannak használva.


Hát igen, bele is botlottam egy ilyesmibe. Van nekik egy olyan parancsuk, hogy
Pcf8574.digitalReadAll();
Ami elvben beolvas mindent, de nem sikerült még rájönnöm, hogy milyen formában. De ugyanigy kiirni már nem tudja. Nekem meg pontosan arra lenne szükségem, hogy az egyik eszközböl beolvasott byteket a másik eszközön jelenitsem meg.
A wire.h-val bytenként probálkozom.
Éljenek a vonatok!

http://www.youtube.com/playlist?list=PLF2674BF4E3765682

Avatar
etwg
Pákabűvész
Hozzászólások: 212
Csatlakozott: 2011. február 7. hétfő, 7:00
Tartózkodási hely: Ausztria
Kapcsolat:

Re: 60 nap alatt Arduino #28 - I2C busz általában

HozzászólásSzerző: etwg » 2019. október 31. csütörtök, 11:05

Az elsö verzio már müködik két eszközzel (2xPCF8574).
A következö kihivás, hogy ugy kell átalakitanom a kodot, hogy az elején definiálom az olvaso és az iro modulokat ( elvben már egy sereg lehet, de minimum 8 lesz) és azok között kell kialakitani a kapcsolatot.
Van még egy aproság, amit meg kell gondolni ( mi lesz egyszerübb) vannak 8574-sek meg 8575-s 16 bites modulok. A cimzett oldalán ( az mind egy helyen van) inkább a 16 biteseket kellene használni, a beolvaso oldalon meg lehet bármilyen. Csak azt kell kitalálni, hogy egy hurokba hogyan tudok mondjuk 2 címröl 2 bytet beolvasni, és egy cimre kiküldeni. (azaz 3 cimmel kell dolgozni) Egyszerübb lenne, az algoritmus, ha mindig csak 2 cimmel kellene dolgozni.
Éljenek a vonatok!

http://www.youtube.com/playlist?list=PLF2674BF4E3765682

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9989
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: 60 nap alatt Arduino #28 - I2C busz általában

HozzászólásSzerző: Robert » 2019. október 31. csütörtök, 14:40

A sima I2C címzés, írás, kiolvasással közvetlen megkapod a kért adatot.
Ha meg library-ban vagy, akkor annak az írójának az elvárásait vagy kénytelen használni...

Wire.begin()
I2C inicializálása.
- belső hardware beállítása,
- lábak beállítása. leválasztás az ADC és az I/O perifériákról (UNO),
- master/slave beállítáa, slave cím megadása.

A setup() részben használt, jellemzően újrainicializálásra nincs szükség.

Ujbóli kiadása oka lehet:
- inicializálás megismétlése (elpiszkált regiszterek, funkciók),
- i2c slave címének újra átdefiniálása.
http://www.tavir.hu - a gazda :)

Avatar
etwg
Pákabűvész
Hozzászólások: 212
Csatlakozott: 2011. február 7. hétfő, 7:00
Tartózkodási hely: Ausztria
Kapcsolat:

Re: 60 nap alatt Arduino #28 - I2C busz általában

HozzászólásSzerző: etwg » 2019. október 31. csütörtök, 18:23

Na már van egy müködö kodom, igaz csak egy párra a többihez még nincs helyem felépiteni. Ez már müködik. A hozzaádás valoszinüleg nem gond (az arrayhoz kell csak a cimeket beirni).

Most azon rágodok, hogy ha 16 Bites PCF-ket is beépitek (az OUTPUT oldalon optimális lenne), hogyan oldjam meg, hogy 2 PCF8574-böl beolvasott 2 Byte egy PCF8575-re menjen ki (16 Bit). Jo lenne valami automatizmus kitalálni, hogy a szerkezet felismerje, hogy milyen modul van hozzákötve.
Gondolkodtam 2 dimezios Arrayon, ahol a cim mellett lenne még egy változo, ami megjelölné hogy 8 vagy 16 bites module van ott. EZ a kod még csak a rágodás állapotában van melyik ut lenne a legegyszerübb.


Jelen állapotában a PCF8574 párokat gondtalanul kezeli.


Köszönök minden ötletet.


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

#include <Wire.h>

/* IIC 72x72 DISPLAY DRIVER, V1

    each Input switches a LED on the output. Behind the
    PCF unit there is an invertin ULN2803 LED driver,
    the inputs should be inverted on the OUTPUT

   Input module PCF8574  addr 0x21
   Output module PCF8574 addr 0x38

   The output is inverted - preparation for ULN2803

*/


#include <Wire.h>

// DEVICE ADDRESS ARRAYS:

int number = 1;   // up to 5 devices on both sides - 10 together
int RDEV[] = {0x21};
int WDEV[] = {0x38}; // the devices in the two rows are paired 0x21==>0x38

int d;        // data
const int i = 0;

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

void loop() {
  for (int i = 0; i < number; i++) {
    inread();
    outgo();
  }

}
void inread() {                           // function to read in the data from all ports

  Wire.requestFrom(RDEV[i], 1);           // read from device 1 byte,// RDEV from ARRAY, d/RDEV= address of the input device
  while (Wire.available()) {
    d = Wire.read();
    delay(100);
  }
}
void outgo() {                          // function for transmit the data to outputs

  Wire.beginTransmission(WDEV[i]);      // parameter: WDEV, d   WDEV address for the output device
  Wire.write(~d);                       // the input PULLDOWN should be inverted on the OUTPUT
  Wire.endTransmission();
}
Éljenek a vonatok!

http://www.youtube.com/playlist?list=PLF2674BF4E3765682

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3320
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: 60 nap alatt Arduino #28 - I2C busz általában

HozzászólásSzerző: kapu48 » 2019. november 5. kedd, 16:59

Szerintem nagy hiba eszköz címeket előjeles számként definiálni!
Hiszen ezek mindig pozitív számok lehetnek, soha nem vehetnek fel mínusz értéket.
Olyan megerőltető lehet odaírni azt a módosító szócskát?

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

unsigned int RDEV[] = {0x21};
unsigned int WDEV[] = {0x38};


De még jobb lenne az:

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

unsigned char RDEV[] = {0x21}; // hiszen ezek 1 bytes címek!
unsigned char WDEV[] = {0x38};

Avatar
etwg
Pákabűvész
Hozzászólások: 212
Csatlakozott: 2011. február 7. hétfő, 7:00
Tartózkodási hely: Ausztria
Kapcsolat:

Re: 60 nap alatt Arduino #28 - I2C busz általában

HozzászólásSzerző: etwg » 2019. november 5. kedd, 23:37

Itt semmi reakcio nem volt, én meg tovább dolgoztam, már 5 pár PCF müködik és köszönöm jol vannak. Most már máson dolgozom, pl azon, hogy hogyan lehetne automatikusan párositani a ki és a bemeneteket függetlenül attol, hogy 1 vagy két bytes a másik oldal, azaz az array egy másik dimenziot is kap, de ez még nem müködik ugy ahogy szeretném.
Éljenek a vonatok!

http://www.youtube.com/playlist?list=PLF2674BF4E3765682

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3320
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: 60 nap alatt Arduino #28 - I2C busz általában

HozzászólásSzerző: kapu48 » 2019. november 6. szerda, 13:48

Példa tömb létrehozására:

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

// structuraTomb.ino
// tömb ellemek felsorolása
struct tomb {
   char cim;
   char szam;
   char byte1;
   char byte2;
};
#define NSZO  10
 // tömb létrehozása
struct tomb tombTab[NSZO]={  // tömb feltöltése
    0x10, 1, 123, 0,
    0x11, 2, 25, 200,
    //... NSZO * ismételve
    0,0,0,0,
    0,0,0,0,
    0,0,0,0,
    0,0,0,0,
    0,0,0,0,
    0,0,0,0,
    0,0,0,0,
    0,0,0,0
  };

void setup() {

}

void loop() {

  // olvasás a tömbböl
  char Tcim = tombTab[0].cim;
  char Tszam = tombTab[0].szam;
  char Tbyte1 = tombTab[0].byte1;
  char Tbyte2 = tombTab[0].byte2;
  // irás a tömbbe
  tombTab[0].byte2 = Tbyte1;
 
}

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3320
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: 60 nap alatt Arduino #28 - I2C busz általában

HozzászólásSzerző: kapu48 » 2019. november 6. szerda, 15:47

Magyarázat hozzá: 6.3. Struktúratömbök
http://lidi.uw.hu/krc/files/06.html#6.3.

Avatar
etwg
Pákabűvész
Hozzászólások: 212
Csatlakozott: 2011. február 7. hétfő, 7:00
Tartózkodási hely: Ausztria
Kapcsolat:

Re: 60 nap alatt Arduino #28 - I2C busz általában

HozzászólásSzerző: etwg » 2019. november 6. szerda, 17:15

Biztos vagy benne, hogy ez Arduino nyelven van? Egy másik Arduino kurzuson ( parallel csinálom a Tavirral) egész más formák vannak és hiánytalanul müködnek. Már sok feladatot megcsináltam mind müködött az ottani leirás szerint. Egyelöre nekem az elég.
Éljenek a vonatok!

http://www.youtube.com/playlist?list=PLF2674BF4E3765682

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3320
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: 60 nap alatt Arduino #28 - I2C busz általában

HozzászólásSzerző: kapu48 » 2019. november 6. szerda, 19:08

Biztos! Mivel ez szabvány C nyelv, és az arduino is ezt használja.
És a példám is *.ino kiterjesztésű.
És még ráadásul le is fordítottam, hogy ne legyen benn hiba.
És persze már számtalan változatban használtam, én is meg mások is.

Különben nekem mindegy, csinálsz amit akarsz! :mrgreen:
Ez után többet nem zavarlak a tanácsaimmal!
Ja a tavir leckéken túlmutató kérdéseket teszel fel ismételten, miért? :lol:

Avatar
etwg
Pákabűvész
Hozzászólások: 212
Csatlakozott: 2011. február 7. hétfő, 7:00
Tartózkodási hely: Ausztria
Kapcsolat:

Re: 60 nap alatt Arduino #28 - I2C busz általában

HozzászólásSzerző: etwg » 2019. november 6. szerda, 21:13

Bocs, én semilyen kérdést nem tettem fel, azon kivül, hogy ötletet kértem a 8 meg a 16 bites port extenderek speciális kezelésére. Te vitted el a beszélgetést az arrayokra és azok használatára. Az egyáltalán nem volt kérdés.
Ennek ellenére köszönöm, hogy egy ujabb kezelési modot is beirtál. Ilyet eddig sem itt, sem máshol nem láttam. (Viszont más fajtát egy sereget, amiket ki is probáltam és müködtek).
Éljenek a vonatok!

http://www.youtube.com/playlist?list=PLF2674BF4E3765682


Vissza: “60 nap alatt Arduino - Házi feladatok”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég