Arduino schéma - arduino.sk

Easy Transfer

Programovanie arduina
Obrázok užívateľa
Príspevky: 133
Registrovaný: Štv 06. Nov 2014 12:06:09

Re: Easy Transfer

Poslaťod budvar10 » Štv 22. Jan 2015 16:53:53

Myslis tento riadok? const uint8_t* p = (const uint8_t*)&d;
Na to kompilator urcite nevypise ani varovanie.

OK, toto nie je ten prípad, skôr keď použiješ pretypovanie priamo v príkaze.
Narýchlo mám takýto príklad:
Kód: Vybrať všetko
typedef uint8_t code_t[8];
code_t s[N];
code_t _code;

    if(*(uint64_t *)s[i] == *(uint64_t *)_code) break;

warning: dereferencing type-punned pointer...
S unionom by to bolo v poriadku alebo treba vypnúť -Wstrict-aliasing, ale rozhodne to nie je problém.

Osobne by som sa kodu, kde sa pouzivaju uniony vyhybal. Co si pamatam z praxe, vzdy ked som sa musel uchylit k takej taktike, ci uz vynutenej zo strany Microsoftu, alebo som sa pokusal o ukladanie roznych dat do jedneho pamatoveho miesta, vzdy z toho vyliezal tazko pochopitelny kod, velmi nachylny na zanesenie nejakej chyby.

Neviem na čo konkrétne narážaš, ja s tým bežne robím a nevidím problém. S unionom sa robí analogicky ako so štruktúrou, len všetky položky majú to isté pamäťové miesto. Nemal si náhodou problém so zarovnávaním na určitý počet bajtov? MS má východzie nastavenie 8, takže v štruktúrach vzniká plno prázdneho miesta, tomu sa treba patrične prispôsobiť. Iné ma nenapadá.

Príspevky: 78
Registrovaný: Štv 04. Dec 2014 22:15:58
Bydlisko: Banská Bystrica

Re: Easy Transfer

Poslaťod Robo Ulbricht » Štv 22. Jan 2015 23:15:53

Jaroslav, ako som slubil, prvy priklad komunikacie. Master odosiela na slave. Obaja maju seriovy port, na ktory posielaju vysledky. Master len toci kazdu sekundu cisla od 0-9 a vypisuje, ci sa operacia podarila. Nepodari sa napriklad vtedy, ak nie je druhe Arduino pripojene. Slave Arduino zase vypisuje, kolko bajtov prislo a aky je ich obsah. Vypisovanie v tomto druhom pripade je komplikovanejsie, lebo vo funkcii sme vlastne v preruseni a vtedy sa neda ist na seriovy port. Preto ten signalizacny kod do funkcie loop.

Zapojenie v tomto pripade staci len prepojit oba SDA a SLC. Nie je treba pull-up, lebo Arduino si ho interne zapina. Ale cistejsie riesenie je tam predsa len dat 4K7 rezistory. Doporucujem to testovat tak, ze spustis jedno IDE a potom este jedno IDE (nie otvarat z jedneho oba zdrojaky). A v kazdom z nich si otvoris master a slave. Vtedy sa daju naraz otvorit oba serial monitory naraz.
Prílohy
i2c01.zip
Master to slave communication
(1.9 KiB) 271 krát

Príspevky: 11
Registrovaný: Uto 25. Feb 2014 15:44:32

Re: Easy Transfer

Poslaťod Jaroslav1 » Pia 23. Jan 2015 14:15:42

Robo Ulbricht píše:Jaroslav, ako som slubil, prvy priklad komunikacie. Master odosiela na slave. Obaja maju seriovy port, na ktory posielaju vysledky. Master len toci kazdu sekundu cisla od 0-9 a vypisuje, ci sa operacia podarila. Nepodari sa napriklad vtedy, ak nie je druhe Arduino pripojene. Slave Arduino zase vypisuje, kolko bajtov prislo a aky je ich obsah. Vypisovanie v tomto druhom pripade je komplikovanejsie, lebo vo funkcii sme vlastne v preruseni a vtedy sa neda ist na seriovy port. Preto ten signalizacny kod do funkcie loop.

Zapojenie v tomto pripade staci len prepojit oba SDA a SLC. Nie je treba pull-up, lebo Arduino si ho interne zapina. Ale cistejsie riesenie je tam predsa len dat 4K7 rezistory. Doporucujem to testovat tak, ze spustis jedno IDE a potom este jedno IDE (nie otvarat z jedneho oba zdrojaky). A v kazdom z nich si otvoris master a slave. Vtedy sa daju naraz otvorit oba serial monitory naraz.



ďakujem, podla tohto príkladu prenos smerom k slave ide bez problémov .

Príspevky: 11
Registrovaný: Uto 25. Feb 2014 15:44:32

Re: Easy Transfer

Poslaťod Jaroslav1 » Pia 23. Jan 2015 16:46:07

Eše by som Ťa chcel poprosiť o radu. Podla-tvojich príkladov sa mi to úspešne podarilo rozbehnúť,pridal som aj opačný smer, teda slave---->master, všetko funguje ako má na strane slave prijíma 3-hodnoty, ale na strane master prijme len jednu:
Kód: Vybrať všetko
MASTER

#include <Wire.h>
const byte SLAVE_ADDRESS = 42;
const byte LED = 13;
const byte LED2 = 12;
byte c;
byte d;
//-------------------------------------------------
void setup ()
  {
  Serial.begin(9600);
  Serial.println("I2C Master 01");
  Wire.begin ();
  pinMode (LED, OUTPUT); 
  pinMode (LED2, OUTPUT);   
  }  // end of setup
//---------------------------------------------------
void loop ()
  {
     int sensorValue = analogRead(A0);
     int sensorValue2 = analogRead(A1);
     int sensorValue3 = analogRead(A2);
     int servo=map(sensorValue2,0,1020,0,180);
//------odosielanie----------------------   
    Wire.beginTransmission (SLAVE_ADDRESS);
      Wire.write (sensorValue);//b
      Wire.write (servo);//d
      Wire.write (sensorValue3);//e
   
   if (Wire.endTransmission () == 0)
      {   
      digitalWrite (LED, HIGH);
      }
    else
      {
      Serial.println(" ERROR");
      digitalWrite (LED, LOW);
      }
 
//---------prijimanie------------------------------- 
    Wire.requestFrom(42,2);
       digitalWrite (LED2, HIGH);
       c = Wire.read();
       d = Wire.read();
   Serial.print("prijimam c:");
   Serial.print(c);
   Serial.print(" ");
   Serial.print("prijimam d:");
   Serial.println(d);
   delay (150);
   digitalWrite (LED2, LOW);
}  // end of loop

/////////////////////////////////////////////////////////////
SLAVE

#include <Wire.h>
#include <Servo.h>
Servo ser1;
const byte MY_ADDRESS = 42;
int how;
boolean signal=false;
byte b;
byte d;
byte e;
int led = 13;
int pl;
//------------------------------------------------
void setup ()
{
  ser1.attach(11);
  Serial.begin(9600);
  Serial.println("I2C Slave 01");
  Wire.begin (MY_ADDRESS);
  Wire.onRequest(requestEvent);
  Wire.onReceive (receiveEvent);
 
  pinMode(led, OUTPUT); 

//-------------------------------------------------
void loop()
{
  float voltage = b * (5.0 / 255.0);
if(signal)
  {
    Serial.print("how=");
    Serial.print(how);
    Serial.print(", b=");
    Serial.print(voltage);
    Serial.print(", d=");
    Serial.print(d*4);
    Serial.print(", pl=");
    Serial.print(pl);
    Serial.print(", e=");
    Serial.print(e);
    Serial.println("");
    signal=false;
  }
  ser1.write(d);
}
//----------------------------------------------------------------
void receiveEvent (int howMany)
{
  how=howMany;
    b = Wire.read ();
    d = Wire.read ();
    e = Wire.read ();
   signal=true;
  pl=map((d*4),0,1020,0,180);

//----------------------------------------------------------
void requestEvent()
{
  digitalWrite(led, HIGH);
  int sensorValue = analogRead(A0);
  int sensorValue2 = analogRead(A1);
  Wire.write(sensorValue);
  Wire.write(sensorValue2);
  delay(150);
   digitalWrite(led, LOW);
}









Príspevky: 78
Registrovaný: Štv 04. Dec 2014 22:15:58
Bydlisko: Banská Bystrica

Re: Easy Transfer

Poslaťod Robo Ulbricht » Pia 23. Jan 2015 23:28:01

Druhý príklad. Ten je na odosielanie binárnych údajov. Treba si dobre všimnút, čo vracia operátor sizeof a ako prevádzam štruktúrované dáta na pointer a ako presne pri odosielani používam sizeof na určenie toho, koľko znakov treba preniesť. V oboch programoch musí byť štruktúra definovaná rovnako.

Ku tvojej otázke, prečo to nejde. Nie je byte a int to isté. Skús si dať sizeof na oba typy a uvidíš rozdiely. Myslím že ti to nejde preto, že raz máš dáta typu int, inokedy typu byte. Prenášaš nejaké množstvo a očakávaš zase iné množstvo dát.
Prílohy
i2c02.zip
(2.24 KiB) 266 krát

Príspevky: 11
Registrovaný: Uto 25. Feb 2014 15:44:32

Re: Easy Transfer

Poslaťod Jaroslav1 » Sob 24. Jan 2015 12:46:01

Ešte raz veľmi pekne ďakujem za objasnenie, teraz mi to už ide ako má.

Predchádzajúci

Späť na Software