collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Enviar bytes por I2C  (Lida 7089 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • Clube de Robotica
Enviar bytes por I2C
« em: 10 de Maio de 2013, 19:44 »
Preciso de enviar varios bytes para uma ponte H para a controlar.
Mas não tou conseguir. Tenho de enviar algo do genero:
http://botnroll.com/omni3md/downloads/I2C%20Commands%20for%20OMNI-3MD%20and%20OMNI-3MDMAX%20V1.06.pdf

Tentei:
 
Código: [Seleccione]
#include <Wire.h>

void setup()
{
  Wire.begin(); // join i2c bus (address optional for master)
}



void loop()
{
  Wire.beginTransmission(0x18);
  Wire.write(byte(0x7A));     //Endereço para controlar um motor sem PID 
  Wire.write(byte(0x01));     //Escolha de motor
  Wire.write(byte(0x01));     //Escolha da direção do motor
  Wire.write(byte(0x32));     //Escolha da velocidade(100)
  Wire.endTransmission();    // stop transmitting


  delay(500);
}
« Última modificação: 10 de Maio de 2013, 19:51 por LuísR.A. »
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline dropes

  • Mini Robot
  • *
  • Mensagens: 2.189
Re: Enviar bytes por I2C
« Responder #1 em: 10 de Maio de 2013, 20:58 »
Assim não vais lá, tens bastantes exemplos em arduino no site além do manual.

#include <Wire.h>                   // required by Omni3MD.cpp
#include <Omni3MD.h>
//constants definitions
#define OMNI3MD_ADDRESS 0x30        // default factory address

Na página 8 do manual tem descrito o modo de comunicação:
http://botnroll.com/omni3md/downloads/Manual%20OMINI3-MD(18-07-2011).pdf

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • Clube de Robotica
Re: Enviar bytes por I2C
« Responder #2 em: 10 de Maio de 2013, 23:44 »
Eu quero usar apenas envios simples sem usar a biblioteca especifica da placa pois tambem quero implementar isto noutro uControlador (tentei adaptar a biblioteca mas não funcionou).

Já fiz algo do genero nuns basics que encontrei por ai escondidos logo à primeira pois as rotinas são mesmo do tipo: adress, comand, send byte, send byte...etc

Mas fizes-te me lembrar algo. O arduino funciona apenas com endereços de 7bits e não de 8bits por isso fiz estas alterações:

Código: [Seleccione]
byte data[3]={1,1,100};
#include <Wire.h>

void setup()
{
  Wire.begin(); // join i2c bus (address optional for master)
}



void loop()
{
  Wire.beginTransmission(0x18); // transmit to device #4
  Wire.write(0x00);
  Wire.write(0xF4);
  Wire.write(data,3);        // sends five bytes
  Wire.endTransmission();    // stop transmitting

  delay(500);
}

Só poderei confirmar com sorte amanha  :-\
« Última modificação: 11 de Maio de 2013, 00:01 por LuísR.A. »
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Enviar bytes por I2C
« Responder #3 em: 11 de Maio de 2013, 00:48 »
i2c é 7 bits, ou 10bits, no caso dos 7 bits, se te derem um endereço de 8 bits, tens de fazer um shift á direita, porque o bit menos significativo do endereço é normalmente definido pelo que queres fazer, porque ele é quem diz ao slave se vais fazer uma leitura ou uma escrita.
Avr fanboy

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Enviar bytes por I2C
« Responder #4 em: 11 de Maio de 2013, 00:50 »
Presumo que não tenhas lido o pdf que o dropes deixou, porque isto está lá:

ADDRESS:
É o campo do endereço I2C. Este primeiro byte contém os 7bits do endereço I2C e o oitavo bit, o menos significativo, define se a trama é de escrita ou de leitura. Se o bit menos significativo do campo endereço for 0 (zero), a trama é de escrita e o valor do byte é 0x30. Se o bit for 1 a trama é de leitura e o valor do byte é 0x31.
Avr fanboy

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • Clube de Robotica
Re: Enviar bytes por I2C
« Responder #5 em: 11 de Maio de 2013, 12:15 »
Presumo que não tenhas lido o pdf que o dropes deixou, porque isto está lá:

ADDRESS:
É o campo do endereço I2C. Este primeiro byte contém os 7bits do endereço I2C e o oitavo bit, o menos significativo, define se a trama é de escrita ou de leitura. Se o bit menos significativo do campo endereço for 0 (zero), a trama é de escrita e o valor do byte é 0x30. Se o bit for 1 a trama é de leitura e o valor do byte é 0x31.

Li isso sim por isso é que meti a seguir a mandar um byte. O problema é que na biblioteca wire diz que se escrever um endereço de 8bits que é cortado o ultimo bit e assim torna-se 7bits
http://arduino.cc/de/Reference/Wire



Citar
The Wire library requires addresses which do not include the R/W bit. Based only on the datasheet, you might conclude the address is 160 when writing and 161 when reading. The Wire library needs address 80 to communicate with this chip. The R/W bit is automatically created based on your use of the send or receive functions
http://www.pjrc.com/teensy/td_libs_Wire.html
« Última modificação: 11 de Maio de 2013, 12:23 por LuísR.A. »
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Enviar bytes por I2C
« Responder #6 em: 11 de Maio de 2013, 13:00 »
Essa sena dos 7/8 bits refere-se ao endereço *do dispositivo*, mas tu mantiveste-o igual:

Wire.beginTransmission(0x18); // transmit to device #4

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • Clube de Robotica
Re: Enviar bytes por I2C
« Responder #7 em: 11 de Maio de 2013, 13:18 »
Essa sena dos 7/8 bits refere-se ao endereço *do dispositivo*, mas tu mantiveste-o igual:

Wire.beginTransmission(0x18); // transmit to device #4

Pois no PDF refere-se a "0x18 0" = 0x30. sendo 0x18 o endereço e 0x30 o endereço + o bit de write.
A biblioteca Wire apenas aceita a parte do endereço sem o bit de write/read. Por isso é que uso so 0x18. Já nos SRF tenho de retirar o ultimo bit
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/