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
  Programm-Code für 4 Schrittmotoren Philipp92 4 45 Gestern 17:26
Letzter Beitrag: Philipp92
  Code muss um 73Bytes reduziert werden! Wie? torsten_156 11 212 Gestern 12:54
Letzter Beitrag: Hilgi
Bug I2C Displays wollen nicht mehr Der Ausserirdische 12 455 30.12.2017 17:11
Letzter Beitrag: hotsystems
  Uhr funktioniert nicht Jakob 8 405 30.12.2017 00:15
Letzter Beitrag: hotsystems
  Echtzeituhrmodul läuft nicht scritch 26 1.310 17.12.2017 20:38
Letzter Beitrag: Ratlos
  BME280 wird nicht erkannt sowerum 14 545 10.12.2017 22:14
Letzter Beitrag: Tommy56
  Arduino -> Controllino [Problem gelöst] Cyrilsneer 17 952 27.11.2017 18:49
Letzter Beitrag: Franz54
  Bootloader lässt sich nicht brennen?? dobermann145 10 753 21.11.2017 22:58
Letzter Beitrag: hotsystems
Sad Nano - nicht genug Speicher torsten_156 10 901 30.10.2017 21:40
Letzter Beitrag: MicroBahner
  Code wird langsamer mit der Laufzeit Wampo 9 792 05.10.2017 11:32
Letzter Beitrag: SkobyMobil

Gehe zu:


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