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
Mega: Hardware i2c bus speed (Wire.) verändern?
10.10.2014, 19:06 (Dieser Beitrag wurde zuletzt bearbeitet: 10.10.2014 19:37 von HaWe.)
Beitrag #1
Mega: Hardware i2c bus speed (Wire.) verändern?
hi,
wie kann Hardware i2c bus speed von Wire. verändern?
Standard ist ja wohl vermutlich 100kHz - wie kriegt man es runter auf 9.6 oder hoch auf 400 ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.10.2014, 23:04 (Dieser Beitrag wurde zuletzt bearbeitet: 10.10.2014 23:07 von SkobyMobil.)
Beitrag #2
RE: Mega: Hardware i2c bus speed (Wire.) verändern?
Hallo,
in der Lib "twi.c" kannst Du dran drehen.

Suche nach:

// initialize twi prescaler and bit rate
cbi(TWSR, TWPS0);
cbi(TWSR, TWPS1);
TWBR = ((F_CPU / TWI_FREQ) - 16) / 2;

lese das:

/* twi bit rate formula from atmega128 manual pg 204
SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR))
note: TWBR should be 10 or higher for master mode
It is 72 for a 16mhz Wiring board with 100kHz TWI */

oder in der "twi.h"

#ifndef TWI_FREQ
#define TWI_FREQ 100000L
#endif

Ich würde erst die "twi.h" probieren...
Gruß und Spaß
Andreas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.10.2014, 09:02 (Dieser Beitrag wurde zuletzt bearbeitet: 11.10.2014 10:03 von HaWe.)
Beitrag #3
RE: Mega: Hardware i2c bus speed (Wire.) verändern?
danke - aber das verstehe ich komplett nicht.

ich bräuchte so etwas wie

SetTWISpeed(9600); // für 9600 bps

vor dem entsprechenden Wire-Befehl (damit man auch mal während der Laufzeit wieder umschalten kann.
Manche Geräte (Lego-NXT-Ultraschallsensoren) vertragen nicht mehr, andere schon.

das mit
cbi(TWSR, TWPS0);
cbi(TWSR, TWPS1);
TWBR = ((F_CPU / TWI_FREQ) - 16) / 2;
und
#ifndef TWI_FREQ
#define TWI_FREQ 100000L
#endif
sind für mich böhmische Dörfer oder aus einer ganz anderen Welt Wink
#define scheidet aber wschl schon deswegen aus, weil man es nicht mehr während der Laufzeit wie eine Variable ändern kann.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.10.2014, 12:00
Beitrag #4
RE: Mega: Hardware i2c bus speed (Wire.) verändern?
Hallo,
"#define TWI_FREQ 100000L" ist die Frequenz, die von der IDE vorgegeben ist.
In Arduino "C" ist mir nichts bekannt, um diese während der Laufzeit des
Sketch zu ändern.
Möglich wäre es wohl, wenn Du "DDR-Programmierung" in #C betreiben würdest,
aber davon habe ich keine Ahnung.
Das Datenblatt des Atmel müßte da etwas hergeben, dann könnte man die Register
direkt ansprechen, wenn der Arduino Compiler/IDE das zuläßt.
Hier kannst Du sie nur für "alle" hoch/runter drehen.
Gruß und Spaß
Andreas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.10.2014, 12:08 (Dieser Beitrag wurde zuletzt bearbeitet: 11.10.2014 12:12 von HaWe.)
Beitrag #5
RE: Mega: Hardware i2c bus speed (Wire.) verändern?
ich muss für ein paar sehr spezielle i2c-Sensoren unbedingt auf 9.6k runter, um dann sowas wie hier zu machen - allerdings für 8 verschiedene unabhängige i2c-Peripherals an einem i2c Mux/Switch:

Code:
// US sensor reading test

#include <Wire.h>

#define devaddr_US 0x02

byte US_readbytes[4];


void setup()
{
  Wire.begin();        // join i2c bus  
  Serial.begin(9600);  // start serial for output
}


void loop() {
  byte bbuf, i;
  
  Wire.beginTransmission(devaddr_US);
  Wire.write(0x41);                       // send the ping command to write reg
  Wire.write(0x01);                       // single shot mode
  Wire.endTransmission();
    
  delay(50);                              // give sensor time to do the ping
  
  Wire.beginTransmission(devaddr_US);  
  Wire.write(0x42);                       // select read register
  Wire.endTransmission();
  
  Serial.println(" echo 0 1 2 3");
  
  Wire.requestFrom(devaddr_US, 4);        // request 4 bytes from slave device
  while (Wire.available())  {             // slave may send less than requested
    bbuf= Wire.read();                    // receive a byte
    US_readbytes[i++] = bbuf;             // store the byte
    Serial.print(bbuf);                   // print the byte
    Serial.print(" ");  
  }
  Serial.println();

  delay(50);
  

}






wenn ichs jetzt dauerhaft global ändern müsste - wie sähe der Code dann für 9.6k aus?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.10.2014, 12:48
Beitrag #6
RE: Mega: Hardware i2c bus speed (Wire.) verändern?
Hallo,
verwechsel da nichts, das "100000L" ist eine Frequenz, und das "9600" ist eine
Übertragungsrate.

unsigned long Fq = 50000;
#define TWI_FREQ FqL;




void setup()
{

}
void loop() {

Serial.print(Fq);
Fq = 25000;
#define TWI_FREQ FqL;
Serial.print(Fq);

}

Die IDE wirft keinen Fehler raus, keine Ahnung ob es funktioniert.
Der "I2C" müßte erst mit 50kHz laufen, dann mit 25kHz.
Gruß und Spaß
Andreas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.10.2014, 12:57 (Dieser Beitrag wurde zuletzt bearbeitet: 11.10.2014 13:13 von HaWe.)
Beitrag #7
RE: Mega: Hardware i2c bus speed (Wire.) verändern?
ich habe mal in twi.h geändert:
Code:
#ifndef TWI_FREQ
  // #define TWI_FREQ 100000L    //
  #define TWI_FREQ 9600L    //
#endif

kein Erfolg!!

es war bei dem "Lowspeed", das ich brauche, immer von "bus speed 9.6k" die Rede, im Gegensatz zum Standard i2c mit 100k.
Ich könnte mir denken, das hat was mit den Impulsfrequenz auf der SCL-Leitung zu tun.

Durch deinen Code bin ich aber jetzt vollends verwirrt -

wie mache ich es denn jetzt für die 9.6k, wie ich sie tatsächlich brauche?

ps, edit:

auch wenn ich in meinem eigenen Source Code einsetze
#define TWI_FREQ 9600

bekomme ich keine Messergebnisse.

Der Sensor funktioniert aber einwandfrei am NXT mit diesem Code:
Code:
const byte ping_cmnd[] = {0x2, 0x41, 0x1};  // sensor one-shot-mode command
const byte register_select[] = {0x2, 0x42}; // sensor data register

task main()
{
   byte len=4;
   byte data[4];

   SetSensorLowspeed(IN_4);
  
   while (true)
   {
      TextOut(0,0,"press BtnCenter");

      ClearScreen();
      I2CWrite(IN_4, 0, ping_cmnd); // send the ping command
      Wait(50);                     // give sensor time to do the ping
                                    // Read and display data

      if (I2CBytes(IN_4, register_select, len, data)) {
         for (int i=0; i<4; ++i)  NumOut(40, 56 - 8 * i, data[i]);
      }
      else TextOut(0, LCD_LINE1, "Sensor Error");    
      Wait(50);
   }
}

also klappt irgendwie das Timing nicht für Arduino Sketch.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.10.2014, 13:25
Beitrag #8
RE: Mega: Hardware i2c bus speed (Wire.) verändern?
Hallo,
ich stelle mir das so vor:
Die 100kHz Frequenz ist die Rate, mit der die Slaves maximal abgefragt werden.
Die 9600 k ist die Übertragungsrate, mit der die Slaves ihre Daten senden.

Ich habe keine Ahnung in was für einem Zusammenhang das zu bringen ist.

Wenn Dein LegoBaustein eine I2C-Schnittstelle hat, dann sollte diese
NormKonform sein- ist sie das nicht, dann ist es ein LegoEigenes I2C- aber kein
I2C im Sinne von I2C.

Wie heißt denn der Baustein genau, da gibt es doch Doku drüber.

Dann probiere mal etwas anderes:

Du nimmst Deinen I2C-Legobaustein, der Dir probleme bereitet. Den schließt Du
richtig an den Mega an (PullUpWiderstand nicht vergessen)
Dann startest Du den I2C-Scanner (mußt mal nach suchen "Arduino +I2C-Scanner")
auf dem Arduino.
Dieser sollte Dir die Adresse Deines LegoBaustein melden.
Macht er das, dann sitzt der Fehler unmittelbar vor der Tastatur.

Macht er das nicht, hast Du einen VerdrahtungsFehler- oder der Lego hat eine
Schnittstelle, die alles Mögliche ist- aber KEIN I2C.
Gruß und Spaß
Andreas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  [gelöst] wire.h blockiert analogRead Rupert 6 75 08.12.2016 18:03
Letzter Beitrag: hotsystems
  Datenübertragung vom Arduino Mega 2560 zu Hterm Datatom 1 99 13.11.2016 23:08
Letzter Beitrag: hotsystems
  Arduino Mega 2560 läuft nicht Wolfgang50 6 185 13.11.2016 10:50
Letzter Beitrag: Wolfgang50
  Arduino Mega 2560 Manfred1981 4 196 11.11.2016 18:07
Letzter Beitrag: hotsystems
  Attiny45 Bootloader brennen mit Funduino Mega toto1975 63 2.218 23.10.2016 17:08
Letzter Beitrag: hotsystems
Question Mega 2560 defekt? triode 11 366 29.09.2016 07:21
Letzter Beitrag: hotsystems
  nrf24 an Mega 2560 jgrothe 2 166 10.09.2016 13:39
Letzter Beitrag: jgrothe
  TimerOne Speed Mathias 4 255 10.08.2016 18:43
Letzter Beitrag: Mathias
  Arduino mega 2560 mit TFT LCD Touch Shield V1 Clemens55555 17 941 02.08.2016 20:51
Letzter Beitrag: Clemens55555
  (Mega) Timer 3 A, B & C Scheams 0 231 04.06.2016 17:09
Letzter Beitrag: Scheams

Gehe zu:


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