Forum: Mikrocontroller und Digitale Elektronik I2C Unterwasserroboter


von Sebastian Schuhmann (Gast)


Lesenswert?

Es soll die Tiefenregelung eines Unterwasserroboters in C programmiert 
werden.
Aktor (M)
Tiefensensor (T)
beide werden über ein I2C bus angesteuert.

Details:
Geräte:       I2C Adresse(7bit)    Register     Zugriffstyp 
Wertebereich
Motor M       0x10                  0xD          schreibend  0-255 
Kommandos
Sensor T      0x02                  0x01          lesend     0-255 tiefe 
cm

um auf die geräte zugreifen zu können nützen Sie die Methoden:
int twi_writeregister(uint8_t twi_addr, uint8_t reg, uint8_t data)
int twi_readregister(uint8_t twi_addr, uint8_t reg, uint8_t* data)
Implementieren sie folgendes Verhalten in C für einen ATmega
Dabei werden die ausgaben bei jedem Betreten des Zustands an den Motor 
gesendet:

Startzustand:
sonst -> Abtauchen     wenn T>=160 -> Auftauchen  <- sonst
        M=20         <- T<150           M=5

diesen teil habe ich probleme zu implementieren:

als Pseudocode würde ich das so schreiben
int abtauchen=20;
if T>=160 then goto Auftauchen
else do nothing

int auftauchen=5;
if auftauchen <150 then goto abtauchen
else do nothing


Mit hilfe des Internet habe ich folgendes zusammenstellen können zur 
Kommunikation mit einem I2C bus
mein problem ist nun,dass ich nicht genau weiß wie ich nun mein 
pseudocode hineinimplementieren kann.
1
/*
2
  Schreibt ein Byte in ein Register eines TWI-Gerätes.
3
4
  Parameter: 
5
  uint8_t twi_addr  - Addresse des TWI-Gerätes.
6
  uint8_t reg      - Nr Register des TWI-Gerätes in das geschrieben werden soll.
7
  uint8_t data    - Byte das geschrieben werden soll.
8
9
  Rückgabe: 
10
  1 falls Schreiben erfolgreich, sonst 0.
11
12
  Ablauf:
13
  1. Starte die TWI-Kommunikation.
14
  2. Schreibe die Schreib-Addresse des TWI-Gerätes auf den Bus.
15
  3. Schreibe die Nr des Registers.
16
  4. Schreibe das Byte auf den Bus.
17
  5. Stoppe die TWI-Kommunikation.
18
*/
19
int twi_writeregister(uint8_t twi_addr, uint8_t reg, uint8_t data) {
20
21
        int successful = 1;
22
23
        // 1. Starte die TWI-Kommunikation.
24
  successful &= twi_start();
25
  
26
  // 2. Schreibe die Schreib-Addresse des TWI-Gerätes auf den Bus.
27
  successful &= twi_sla_w(twi_addr);
28
  
29
  // 3. Schreibe die Nr des Registers.
30
  successful &= twi_send(reg);
31
  
32
  // 4. Schreibe das Byte auf den Bus.
33
  successful &= twi_send(data);
34
  
35
  // 5. Stoppe die TWI-Kommunikation.
36
  twi_stop();
37
38
  return successful;
39
}
40
41
/*
42
  Liest ein Byte aus einem Register eines TWI-Gerätes.
43
44
  Parameter: 
45
  uint8_t twi_addr  - Addresse des TWI-Gerätes.
46
  uint8_t reg      - Nr Register des TWI-Gerätes von dem gelesen werden soll.
47
  uint8_t* data    - Addresse einer Variable, in die das gelesene Byte 
48
              geschrieben werden soll.
49
50
  Rückgabe: 
51
  1 falls Lesen erfolgreich, sonst 0. 
52
  Insbesondere soll 0 zurückgegeben werden, falls der Pointer data==0.
53
54
  Ablauf:
55
  1. Starte die TWI-Kommunikation.
56
  2. Schreibe die Schreib-Addresse des TWI-Gerätes auf den Bus.
57
  3. Schreibe die Nr des Registers.
58
  4. Stoppe die Kommunikation
59
  5. Starte die TWI-Kommunikation.
60
  6. Schreibe die Lese-Addresse (LSB==1!!!) des TWI-Gerätes auf den Bus.
61
  7. Lese das Byte aus dem Register, setze dabei kein ACK.
62
  8. Stoppe die TWI-Kommunikation.
63
*/
64
int twi_readregister(uint8_t twi_addr, uint8_t reg, uint8_t* data) {
65
66
        int successful = 1;
67
68
        // 1. Starte die TWI-Kommunikation.
69
  successful &= twi_start();
70
  
71
  // 2. Schreibe die Schreib-Addresse des TWI-Gerätes auf den Bus.
72
  successful &= twi_sla_w(twi_addr);
73
  
74
  // 3. Schreibe die Nr des Registers.
75
  successful &= twi_send(reg);
76
  
77
  // 4. Stoppe die Kommunikation
78
  // twi_stop();
79
        // 5. Starte die TWI-Kommunikation.
80
  // twi_start();
81
  
82
  // 4+5 rep-start
83
  successful &= twi_rep_start();
84
  
85
  // 6. Schreibe die Lese-Addresse (LSB==1!!!) des TWI-Gerätes auf den Bus.
86
  successful &= twi_sla_r(twi_addr | 1);
87
  
88
  // 7. Lese das Byte aus dem Register, setze dabei kein ACK.
89
  successful &= twi_read(0, data); // 0: keine weiteren Bytes erwartet
90
  
91
  // 8. Stoppe die TWI-Kommunikation.
92
  twi_stop();
93
94
        if (*data == 0) {
95
            return 0;
96
        }
97
98
  return successful;
99
}


danke für hilfe
sebo

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.