mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I2C Unterwasserroboter


Autor: Sebastian Schuhmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
/*
  Schreibt ein Byte in ein Register eines TWI-Gerätes.

  Parameter: 
  uint8_t twi_addr  - Addresse des TWI-Gerätes.
  uint8_t reg      - Nr Register des TWI-Gerätes in das geschrieben werden soll.
  uint8_t data    - Byte das geschrieben werden soll.

  Rückgabe: 
  1 falls Schreiben erfolgreich, sonst 0.

  Ablauf:
  1. Starte die TWI-Kommunikation.
  2. Schreibe die Schreib-Addresse des TWI-Gerätes auf den Bus.
  3. Schreibe die Nr des Registers.
  4. Schreibe das Byte auf den Bus.
  5. Stoppe die TWI-Kommunikation.
*/
int twi_writeregister(uint8_t twi_addr, uint8_t reg, uint8_t data) {

        int successful = 1;

        // 1. Starte die TWI-Kommunikation.
  successful &= twi_start();
  
  // 2. Schreibe die Schreib-Addresse des TWI-Gerätes auf den Bus.
  successful &= twi_sla_w(twi_addr);
  
  // 3. Schreibe die Nr des Registers.
  successful &= twi_send(reg);
  
  // 4. Schreibe das Byte auf den Bus.
  successful &= twi_send(data);
  
  // 5. Stoppe die TWI-Kommunikation.
  twi_stop();

  return successful;
}

/*
  Liest ein Byte aus einem Register eines TWI-Gerätes.

  Parameter: 
  uint8_t twi_addr  - Addresse des TWI-Gerätes.
  uint8_t reg      - Nr Register des TWI-Gerätes von dem gelesen werden soll.
  uint8_t* data    - Addresse einer Variable, in die das gelesene Byte 
              geschrieben werden soll.

  Rückgabe: 
  1 falls Lesen erfolgreich, sonst 0. 
  Insbesondere soll 0 zurückgegeben werden, falls der Pointer data==0.

  Ablauf:
  1. Starte die TWI-Kommunikation.
  2. Schreibe die Schreib-Addresse des TWI-Gerätes auf den Bus.
  3. Schreibe die Nr des Registers.
  4. Stoppe die Kommunikation
  5. Starte die TWI-Kommunikation.
  6. Schreibe die Lese-Addresse (LSB==1!!!) des TWI-Gerätes auf den Bus.
  7. Lese das Byte aus dem Register, setze dabei kein ACK.
  8. Stoppe die TWI-Kommunikation.
*/
int twi_readregister(uint8_t twi_addr, uint8_t reg, uint8_t* data) {

        int successful = 1;

        // 1. Starte die TWI-Kommunikation.
  successful &= twi_start();
  
  // 2. Schreibe die Schreib-Addresse des TWI-Gerätes auf den Bus.
  successful &= twi_sla_w(twi_addr);
  
  // 3. Schreibe die Nr des Registers.
  successful &= twi_send(reg);
  
  // 4. Stoppe die Kommunikation
  // twi_stop();
        // 5. Starte die TWI-Kommunikation.
  // twi_start();
  
  // 4+5 rep-start
  successful &= twi_rep_start();
  
  // 6. Schreibe die Lese-Addresse (LSB==1!!!) des TWI-Gerätes auf den Bus.
  successful &= twi_sla_r(twi_addr | 1);
  
  // 7. Lese das Byte aus dem Register, setze dabei kein ACK.
  successful &= twi_read(0, data); // 0: keine weiteren Bytes erwartet
  
  // 8. Stoppe die TWI-Kommunikation.
  twi_stop();

        if (*data == 0) {
            return 0;
        }

  return successful;
}



danke für hilfe
sebo

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.