INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
doch nicht gelöst: neuer Code f. i2c + Muxer ?
11.10.2014, 18:49 (Dieser Beitrag wurde zuletzt bearbeitet: 12.10.2014 11:28 von HaWe.)
Beitrag #1
doch nicht gelöst: neuer Code f. i2c + Muxer ?
hallo,
ich habe nochmal was zu bitbang i2c gefunden - jemand der sich genau mit meinem derzeitigen Problem beschäftigt hat, nämlich den besagten NXT Ultraschallsensor zu steuern:

http://blog.tkjelectronics.dk/2011/10/nxt-shield-ver2/

1. Teil :
Lego USS Läuft auf dem Mega Cool
edit:
aber leider wohl nicht auf dem Due, s. u. Sad


Code:
#include <i2cmaster.h>

byte clockPin = 4;
byte buf[9];//Buffer to store the received valeus
byte addr = 0x02;//address 0x02 in a 8-bit context - 0x01 in a 7-bit context
byte distance;

void setup()
{  
  i2c_init();//I2C frequency = 11494,253Hz
  Serial.begin(115200);
  printUltrasonicCommand(0x00);//Read Version
  printUltrasonicCommand(0x08);//Read Product ID
  printUltrasonicCommand(0x10);//Read Sensor Type
  printUltrasonicCommand(0x14);//Read Measurement Units  
}


void loop() {    
//  printUltrasonicCommand(0x42);//Read Measurement Byte 0
  distance = readDistance();
  if(distance == 0xFF)
    Serial.println("Error Reading Distance");
  else
    Serial.println(distance, DEC);    
}

byte readDistance() {  
  delay(100);//There has to be a delay between commands
  byte cmd = 0x42;//Read Measurement Byte 0
  
  pinMode(clockPin, INPUT);//Needed for writing to work
  digitalWrite(clockPin, HIGH);  

  if(i2c_start(addr+I2C_WRITE))//Check if there is an error
  {
    Serial.println("ERROR i2c_start");
    i2c_stop();
    return 0xFF;
  }    
  if(i2c_write(cmd))//Check if there is an error
  {
    Serial.println("ERROR i2c_write");
    i2c_stop();
    return 0xFF;
  }  
  i2c_stop();
  
  delayMicroseconds(60);//Needed for receiving to work
  pinMode(clockPin, OUTPUT);
  digitalWrite(clockPin, LOW);
  delayMicroseconds(34);
  pinMode(clockPin, INPUT);
  digitalWrite(clockPin, HIGH);
  delayMicroseconds(60);  
  
  if(i2c_rep_start(addr+I2C_READ))//Check if there is an error
  {
    Serial.println("ERROR i2c_rep_start");
    i2c_stop();    
    return 0xFF;
  }  
  for(int i = 0; i < 8; i++)
    buf[i] = i2c_readAck();
  buf[8] = i2c_readNak();  
  i2c_stop();

  return buf[0];  
}



void printUltrasonicCommand(byte cmd) {
  delay(100);//There has to be a delay between commands
  
  pinMode(clockPin, INPUT);//Needed for writing to work
  digitalWrite(clockPin, HIGH);

  if(i2c_start(addr+I2C_WRITE))//Check if there is an error
  {
    Serial.println("ERROR i2c_start");
    i2c_stop();
    return;
  }
  if(i2c_write(cmd))//Check if there is an error
  {
    Serial.println("ERROR i2c_write");
    i2c_stop();
    return;
  }
  i2c_stop();
  
  delayMicroseconds(60);//Needed for receiving to work
  pinMode(clockPin, OUTPUT);
  digitalWrite(clockPin, LOW);
  delayMicroseconds(34);
  pinMode(clockPin, INPUT);
  digitalWrite(clockPin, HIGH);
  delayMicroseconds(60);  

  if(i2c_rep_start(addr+I2C_READ))//Check if there is an error
  {
    Serial.println("ERROR i2c_rep_start");
    i2c_stop();
    return;
  }
  for(int i = 0; i < 8; i++)
    buf[i] = i2c_readAck();
  buf[8] = i2c_readNak();
  i2c_stop();  

  if(cmd == 0x00 || cmd == 0x08 || cmd == 0x10 || cmd == 0x14)
  {
      for(int i = 0; i < 9; i++)
      {
        if(buf[i] != 0xFF && buf[i] != 0x00)
          Serial.print(buf[i]);
        else
          break;
      }              
  }
  else
    Serial.print(buf[0], DEC);  

  Serial.println("");      
}
/*
' Wires on NXT jack plug.
' Wire colours may vary. Pin 1 is always end nearest latch.
' 1 White +9V
' 2 Black GND
' 3 Red GND
' 4 Green +5V
' 5 Yellow SCL - also connect clockpin to give a extra low impuls
' 6 Blue SDA
' Do not use i2c pullup resistor - already provided within sensor.
*/
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.10.2014, 11:05 (Dieser Beitrag wurde zuletzt bearbeitet: 12.10.2014 11:31 von HaWe.)
Beitrag #2
RE: i2c für NXT i2c Sensoren muxen
2. Teil:

bekam einen Link zu dieser Platine - schon geordert!

http://www.bitwizard.nl/shop/i2c-splitter-PCA9548A



was aber den Code angeht..: leider zu früh gefreut -
der USS-Arduino-Code oben schreibt wohl direkt in die AVR-Register, daher funktioniert es zwar mit meinem Mega -

aber leider wird es wohl sicher nicht mit dem ARM des Due laufen.

Also brauche ich leider doch noch eine Due-taugliche Lösung. Undecided
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  TFT Display will nicht so wie ich Franzel007 10 621 12.05.2018 09:28
Letzter Beitrag: amithlon
  Neuling kommt nicht weiter, ws2812 If abfragen Tabata 8 750 19.04.2018 14:07
Letzter Beitrag: Tommy56
  millis() zählt nicht weiter sowerum 8 619 09.04.2018 17:55
Letzter Beitrag: Tommy56
  Windmesser auslesen will noch nicht so recht klappen.. Stargazer 12 762 05.04.2018 10:54
Letzter Beitrag: amithlon
  Bootlader Brennen funktioniert nicht Ardusil 6 524 18.03.2018 10:53
Letzter Beitrag: hotsystems
  Code noch verbesserbar/kürzbar? CommanderKSK 2 332 16.03.2018 23:53
Letzter Beitrag: CommanderKSK
  Bool wird nicht umgesetzt Wampo 3 388 10.03.2018 23:04
Letzter Beitrag: Tommy56
  NTC für LCD-Anzeige.Weiter bekomme ich nicht hin malsehen 17 1.182 09.03.2018 20:28
Letzter Beitrag: malsehen
  328P geht nicht mehr [gelöst] Harry 37 2.965 04.03.2018 19:57
Letzter Beitrag: Harry
  UDP Paket über UART senden (nicht SPI) Wampo 9 763 04.03.2018 18:49
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste