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
  Vorangestellte Nullen | gelöst Jan74 3 134 17.08.2017 09:26
Letzter Beitrag: Jan74
  BME280 - Luftdruckoffset nicht einstellbar ? Stargazer 17 509 13.08.2017 15:38
Letzter Beitrag: hotsystems
  [Gelöst]Automatische Lichtschaltung mit Tastern TerroraffE 5 265 09.08.2017 22:24
Letzter Beitrag: TerroraffE
  Ich komme mit millis nicht weiter !!! Gonmaus 8 525 09.07.2017 21:24
Letzter Beitrag: Tommy56
  Volume Up falscher Tastatur Hex-Code Maxi290997 7 413 03.07.2017 21:49
Letzter Beitrag: Maxi290997
  delay(...) im Code ok? donut 4 323 08.06.2017 20:16
Letzter Beitrag: donut
  WEMOS Motorshield funzt nicht Rumpl-X 8 362 07.06.2017 21:10
Letzter Beitrag: Tommy56
  Textdokument in Arduino Code umwandeln Tellen 9 479 03.06.2017 16:30
Letzter Beitrag: Tellen
  LCD geht nicht - keine Ahnung warum?? DL1AKP 12 647 15.05.2017 13:17
Letzter Beitrag: DL1AKP
  433mHz Funkmodule senden/empfangen nicht metzgefa 2 582 06.05.2017 13:30
Letzter Beitrag: metzgefa

Gehe zu:


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