I2C Unterwasserroboter

Gast #1764088
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.