Forum: Mikrocontroller und Digitale Elektronik Arduino & AS5600 i2C lesen ohne Lib


von Jakob N. (jakob_leeeee)


Angehängte Dateien:

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
}

von EAF (Gast)


Lesenswert?

Jakob N. schrieb:
> Wire.endTransmission(54); // Send restart condition
Der Kommentar ist korrekt, die 54 nicht.

1. Einmal Doku lesen
2. Erflogs- oder Errormeldung des Wire auswerten.

von EAF (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

Seriellen Monitor auf 9600er Baud-Rate eingestellt?

von Jakob N. (jakob_leeeee)


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.

von Jakob N. (jakob_leeeee)


Lesenswert?

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 ?

von Jakob N. (jakob_leeeee)


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
}

von EAF (Gast)


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
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.