Arduino & AS5600 i2C lesen ohne Lib

OP #7318003
Lesenswert?

Guten Tag,

ich beschäftige mich derzeit mit i2C. Ich möchte mit dem AS5600 den Winkel eine Welle auslesen, klappt auch sowit alles über die Lib für den AS5600. Allerdings möchte ich weg von der Lib und selber alles über i2c machen. Mit dem Hintergrund, dass ich später das auf einen PIC o.Ä. machen möchte.

Nun, versteh ich nicht so richtig, wie ich mir jetzt Daten aus einen bestimmten Register besorge. Ich hab etwas gesucht und auch gefunden allerdings erwarte ich eigentlich einen Wert. Derzeit möchte ich mich alles über den Monitior ausgeben lassen.

Zu sehen ist aber nur : ⸮⸮.

Wo liegt mein denk Fehler :/

1
#include <Wire.h>
2

3
void setup() {
4
  Wire.begin();        // join i2c bus (address optional for master)
5
  Serial.begin(9600);  // start serial for output
6
  Wire.beginTransmission(54); // select device with "beginTransmission()" || 0x36
7
  Wire.write(13); // select starting register with "write()"
8
  Wire.endTransmission(54); // 
9
}
10

11
void loop() {
12

13
  Wire.beginTransmission(54); // Start communication with slave address 85
14
  Wire.write(13); // Write pointer register to 13 || 0x0D
15
  Wire.endTransmission(54); // Send restart condition
16
  Wire.requestFrom(54, 2);    // request 2 bytes from slave device 0x36
17

18
  while (Wire.available()) { // slave may send less than requested
19
    char c1 = Wire.read(); // receive a byte as character
20
    char c2 = Wire.read(); // receive a byte as character
21
    Serial.print(c1);         // print the character
22
    Serial.print(c2);         // print the character
23
  }
24

25
  delay(500);
26
}
Angehängte Dateien:
OP #7318107
Lesenswert?

EAF schrieb:

Jakob N. schrieb:

Zu sehen ist aber nur : ⸮⸮.

Vermutlich möchtest du byte lesen und nicht char.

Jakob N. schrieb:

while (Wire.available()) { // slave may send less than requested

Prüfe das, was da im Kommentar steht.

if(2 == Wire.available()) { // slave may send less than requested

Jap ._. jetzt bekomme ich Werte. Lese byte aus.

1
void Lesen(){
2
  Wire.beginTransmission(0x36); // Start communication with slave address 85
3
  Wire.write(0x0C); // Write pointer register to 13 || 0x0D
4
  Wire.endTransmission(0x36); // Send restart condition
5
  
6
  Wire.requestFrom(54, 1);    // request 6 bytes from slave device #8
7

8
  while (Wire.available()) { // slave may send less than requested
9
    byte c1 = Wire.read(); // receive a byte as character
10
    //byte c2 = Wire.read(); // receive a byte as character
11
    Serial.println(c1);         // print the character
12
    //Serial.print(c2);         // print the character
13
  }
14
}

bekomme jetzt Werte, aber Sinn ergeb Sie noch nicht so richtig.

OP #7318135
Lesenswert?

Jakob N. schrieb:

Also was ich möchte ist, einfach den Winkel als Wert bekommen. Dafür gibt es ja die zwei Register. Sieht jemand da, eine Abruffunktion ?

Hab mal die Lib auseinander gefrickelt, so bekomme ich ein Wert der 360 wiederspiegelt, aber irgendwie verwirrt mich das. Sieht das richtig aus ?

1
void Lesen(){
2
  Wire.beginTransmission(0x36); // Start communication with slave address 85
3
  Wire.write(0x0E); // Write pointer register to 13 || 0x0D
4
  Wire.endTransmission(0x36); // Send restart condition
5
  
6
  Wire.requestFrom(0x36, (uint8_t)2);    // request 6 bytes from slave device #8
7

8
  while (Wire.available()) { // slave may send less than requested
9
   uint16_t c1 = Wire.read(); // receive a byte as character
10
   c1 <<= 8; // receive a byte as character
11
   c1 += Wire.read();
12
   c1 = (c1 & 0x0FFF)/11.38 ;
13
    Serial.print(c1);         // print the character    
14
    Serial.println(); 
15
  }
16
}
Gast #7318143
Lesenswert?

Jakob N. schrieb:

Wire.endTransmission(0x36); // Send restart condition

Der Kommentar ist richtig, aber die 0x36 nicht. Ich rate dir dringend die Wire Doku zu lesen!

Fehlerprüfungen vermisse ich weiterhin.

Zudem solltest du den Raw Wert richtig zusammen setzen.

Ungetestet, aus meiner Wühlkiste auf die Schnelle zusammen gesetzt.

1
#include <Wire.h>
2

3
#include <Streaming.h> // die Lib findest du selber ;-)
4
Print &cout = Serial; // cout Emulation für "Arme"
5

6
constexpr int AS5600adr {0b0110110};// Notation, wie im Datenblatt
7
constexpr byte rawAdr {0x0D};// Notation, wie im Datenblatt
8

9
void wireError(byte error)
10
{
11
  switch(error)
12
  {
13
    case 0: cout << "success/noerror" << endl; break;
14
    case 1: cout << "data too long to fit in transmit buffer" << endl; break;
15
    case 2: cout << "received NACK on transmit of address" << endl; break;
16
    case 3: cout << "received NACK on transmit of data" << endl; break;
17
    case 4: cout << "other error" << endl; break;
18
    case 5: cout << "timeout" << endl; break;
19
  }
20
}
21

22

23
unsigned getRaw()
24
{
25
  byte error;
26
  Wire.beginTransmission(AS5600adr); // Start communication with slave
27
  Wire.write(rawAdr); // Write pointer register 
28
  error = Wire.endTransmission(true); // Send restart condition
29
  if(error) 
30
  {
31
    wireError(error);
32
    return 0xFFFF; // error
33
  }
34
  error = Wire.requestFrom(AS5600adr,2); // request 2 bytes from slave
35
  if(error) 
36
  {
37
    wireError(error);
38
    return 0xFFFF; // error
39
  }
40
     
41
  if(2 == Wire.available()) { // slave may send less than requested
42
    unsigned rawHi = Wire.read();
43
    rawHi &= 0x0f;
44
    rawHi <<= 8;
45
    unsigned rawLo = Wire.read();
46
    return  rawHi | rawLo; // erfolg
47
  }else
48
  {
49
    cout << "zu wenig Daten" << endl;
50
    return 0xFFFF; // error
51
  }
52
}
53

54
void setup() 
55
{
56
  Serial.begin(9600);
57
  Wire.begin(); 
58
  cout << F("Start: ") << F(__FILE__) << endl;
59
}
60

61
void loop() 
62
{
63
  cout << endl;
64
  unsigned raw = getRaw();
65
  cout << "raw = " << raw << endl;
66
  delay(1000);
67
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren