Запуск часов на DS1307 и Wire.h

gustav474
Offline
Зарегистрирован: 16.11.2013

Для полного понимания принципа записи данных использую только библиотеку Wire.h.

Данный скетч ни как не желает работать. Пытаюсь вклюсить DS1307, для этого обращаюсь к регистру 1 и  устанавливаю 7 бит в "0", предварительно обратившись к DS1307 по адресу 0xD0. Как результат выполнения функции планирую получить "0" возвратом из endTransmission, и вывести это в монитор порта.

 

#include <Wire.h>;
#include <Serial.h>;
 
void setup(){
  Wire.begin();
  Serial.begin(9600);
}
 
void loop(){
  
transmission(0x00, 0x00);
 
}
 
byte transmission (byte address, byte message ) {
  Wire.beginTransmission(0xD0); // Указываем на адресс нашего устройства
  Wire.write(address);
  Wire.write(message);
  Wire.endTransmission();
  if(Wire.endTransmission()==0){
    Serial.print("OK");
  }
     else {
       Serial.print("FALSE");
     } 
}
 
maksim
Offline
Зарегистрирован: 12.02.2012

gustav474 пишет:

Данный скетч ни как не желает работать.

На одной из многочисленных автомагистралях страны сломался автобус, перевозящий больных на голову людей. Водитель естественно пытается починить автобус... После 15 минут после поломки из автобуса выбегает Иван дурак и кричит водителю:
- А я знаю что сломалось, а я знаю что сломалось!
Водитель:
-- Не мешай, иди в автобус.
Через час ситуация повторяется. 
Больной:
- А я знаю что сломалось, а я знаю что сломалось!
Водитель:
-- Не мешай, я сказал, иди в автобус.
После нескольких часов мучений водитель так и не смог найти поломку сел возле колеса и закурил. Тут по традиции из автобуса выбежал тот же больной и по традиции начал говорить водителю:
- А я знаю что сломалось, а я знаю что сломалось!
Водитель:
-- Ну и что же?
Больной:
- Автобус!

gustav474
Offline
Зарегистрирован: 16.11.2013

Это к чему?

trembo
trembo аватар
Онлайн
Зарегистрирован: 08.04.2011

gustav474 пишет:

Это к чему?

А к тому... клиент, старый знакомый,  пару лет назад у нас на фирме комп покупал.

С лицензионным windows. Спрашиваю его : Какие ещё программы поставить .....

Ответ был простой : все......

gustav474
Offline
Зарегистрирован: 16.11.2013

Что конкретно не так написал?. Только не говорите, что все)

Lipt0n
Offline
Зарегистрирован: 04.11.2013

Вы вобще не написали что не работает, и как эта неработоспособность выражается.

PS. исправьте причину неработоспособности и у Вас всё заработает :)

gustav474
Offline
Зарегистрирован: 16.11.2013

Монитор порта молчит. Т.е. вообще ничего не происходит) Не выводится ни ОК ни FALSE. Думаю что неправильно обращаюсь к регистрам и провожу запись в них, следовательно и endTransmission не возврещает ничего, хотя по описанию этой функции в случае ошибки  она на нее длолжна указать.  Собираю схему на макетке. вешаю кварц, подтягиваю к питанию SDA и SCL и отправляю их на 4 и 5 аналоговый порт соответственно.

Lipt0n
Offline
Зарегистрирован: 04.11.2013

А куда Вы выводите значение  функции  byte transmission (byte address, byte message) ?

То есть с таким же успехом можно использовать void transmission (byte address, byte message) .

 

maksim
Offline
Зарегистрирован: 12.02.2012

Вы два раза вызываете функцию Wire.endTransmission();

gustav474
Offline
Зарегистрирован: 16.11.2013

Согласен, более правильнее поставить void)

gustav474
Offline
Зарегистрирован: 16.11.2013

Вы про цикл if? А как еще можно сделать условие?

Lipt0n
Offline
Зарегистрирован: 04.11.2013
#include <Wire.h>;
#include <Serial.h>;
 
void setup(){
  Wire.begin();
  Serial.begin(9600);
}
 
void loop(){
  
transmission(0x00, 0x00);
 
}
 
void transmission (byte address, byte message ) {
  Wire.beginTransmission(0xD0); // Указываем на адресс нашего устройства
  Wire.write(address);
  Wire.write(message);

  if(Wire.endTransmission()==0){
    Serial.print("OK");
  }
     else {
       Serial.print("FALSE");
     } 
}

 

gustav474
Offline
Зарегистрирован: 16.11.2013

Lipt0n пишет:

#include <Wire.h>;
#include <Serial.h>;
 
void setup(){
  Wire.begin();
  Serial.begin(9600);
}
 
void loop(){
  
transmission(0x00, 0x00);
 
}
 
byte transmission (byte address, byte message ) {
  Wire.beginTransmission(0xD0); // Указываем на адресс нашего устройства
  Wire.write(address);
  Wire.write(message);

  if(Wire.endTransmission()==0){
    Serial.print("OK");
  }
     else {
       Serial.print("FALSE");
     } 
}

 

Так тоже проовал, без результатно) Возможно ошибка именно в моеv неправильном понимании логики работы DS1307. Или же я что-то упустил из виду.

Lipt0n
Offline
Зарегистрирован: 04.11.2013

А что есди попробовать так:

#include <Wire.h>;
#include <Serial.h>;
 
void setup(){
  Wire.begin();
  Serial.begin(9600);
  Serial.println('Start');

}
 
void loop(){
  
transmission(0x00, 0x00);
 
}
 
void transmission (byte address, byte message ) {
  Wire.beginTransmission(0xD0); // Указываем на адресс нашего устройства
  Wire.write(address);
  Wire.write(message);


  Serial.println(Wire.endTransmission());

    
}

 

gustav474
Offline
Зарегистрирован: 16.11.2013

Lipt0n пишет:

А что есди попробовать так:

#include <Wire.h>;
#include <Serial.h>;
 
void setup(){
  Wire.begin();
  Serial.begin(9600);
}
 
void loop(){
  
transmission(0x00, 0x00);
 
}
 
void transmission (byte address, byte message ) {
  Wire.beginTransmission(0xD0); // Указываем на адресс нашего устройства
  Wire.write(address);
  Wire.write(message);


  Serial.println(Wire.endTransmission());

    
}

 

endTransmission здесь является ключевой функцией отвечающей за отправление сообщения. beginTransmission  указывает адрес write записывает данные в буфет передачи, а endTransmission запускает передачу. Так не получилось)

Zizilk
Offline
Зарегистрирован: 30.05.2013

http://arduino.cc/en/Reference/WireEndTransmission

Те он дожен был хоть что-то вернуть, что отправилось бы в порт... попробуй с разными параметрами поиграться, чтобы проверить что ты в функцию выходишь и из неё выходишь выводи что нибудь вначале и в конце...

#include <Wire.h>;
#include <Serial.h>;
 
	void setup(){
	  Wire.begin();
	  Serial.begin(9600);
	}
	  
	void loop(){
   
	transmission(0x00, 0x00);
	  
	}
	 Serial.println("Enter"); 
	void transmission (byte address, byte message ) {
	  Wire.beginTransmission(0xD0); // Указываем на адресс нашего устройства
	  Wire.write(address);
	  Wire.write(message);
	 
	 
	  Serial.println(Wire.endTransmission());
	 Serial.println("Exit"); 
	     
	}

А так это не дело что программиста надо учить дебажить собственный код и когда не понимает логику что он делает и  хочет получить взамен...

vdk
Offline
Зарегистрирован: 14.04.2013

А DS1307 по адресу 0xD0 действительно существует?

gustav474
Offline
Зарегистрирован: 16.11.2013

Zizilk пишет:

http://arduino.cc/en/Reference/WireEndTransmission

Те он дожен был хоть что-то вернуть, что отправилось бы в порт... попробуй с разными параметрами поиграться, чтобы проверить что ты в функцию выходишь и из неё выходишь выводи что нибудь вначале и в конце...

#include <Wire.h>;
#include <Serial.h>;
 
	void setup(){
	  Wire.begin();
	  Serial.begin(9600);
	}
	  
	void loop(){
   
	transmission(0x00, 0x00);
	  
	}
	 Serial.println("Enter"); 
	void transmission (byte address, byte message ) {
	  Wire.beginTransmission(0xD0); // Указываем на адресс нашего устройства
	  Wire.write(address);
	  Wire.write(message);
	 
	 
	  Serial.println(Wire.endTransmission());
	 Serial.println("Exit"); 
	     
	}

А так это не дело что программиста надо учить дебажить собственный код и когда не понимает логику что он делает и  хочет получить взамен...

Ни капли не претендую на звание программиста) Логику понимаю, не получается реализовать програмно)

За подсказку спасибо!) В функцию входит!)

Zizilk
Offline
Зарегистрирован: 30.05.2013

А выходит ли? яхз как обрабтывается краш программы на рдуинке

gustav474
Offline
Зарегистрирован: 16.11.2013

vdk пишет:

А DS1307 по адресу 0xD0 действительно существует?

Как я понял  из даташита это адресс самого устройства. В двоичном представлении 1101000 и в дальнейшем для передачи от мастера к слейву в старший разряд добавляется 0, в другом случае 1

vdk
Offline
Зарегистрирован: 14.04.2013

ну вот и должен отвечать по адресу 0x68

(посмотрел сейчас библиотеку RTClib - там тоже 0x68)

gustav474
Offline
Зарегистрирован: 16.11.2013

vdk пишет:

ну вот и должен отвечать по адресу 0x68

(посмотрел сейчас библиотеку RTClib - там тоже 0x68)

Я дефолтным калькулятором в винде переводил 11010000 из BIN в  HEX. Получилось D0

Lipt0n
Offline
Зарегистрирован: 04.11.2013

gustav474 пишет:

vdk пишет:

ну вот и должен отвечать по адресу 0x68

(посмотрел сейчас библиотеку RTClib - там тоже 0x68)

Я дефолтным калькулятором в винде переводил 11010000 из BIN в  HEX. Получилось D0

Нолик лишний.

gustav474
Offline
Зарегистрирован: 16.11.2013

Lipt0n пишет:

gustav474 пишет:

vdk пишет:

ну вот и должен отвечать по адресу 0x68

(посмотрел сейчас библиотеку RTClib - там тоже 0x68)

Я дефолтным калькулятором в винде переводил 11010000 из BIN в  HEX. Получилось D0

Нолик лишний.

Если верить даташиту то последний нолик (старшего разряда) инициализирует режим записи данных от мастера к слейву, в моем случае от МК к DS1307.

maksim
Offline
Зарегистрирован: 12.02.2012

Дело не в даташите, а неверном отсчете вами битов, биты считаются справа налево.

vdk
Offline
Зарегистрирован: 14.04.2013

gustav474 пишет:

Если верить даташиту то последний нолик (старшего разряда) инициализирует режим записи данных от мастера к слейву, в моем случае от МК к DS1307.

А вот если верить "даташиту" на Wire.beginTransmission, то адрес должен быть 7-битным. Так и написано:

Цитата:
Parameters
address: the 7-bit address of the device to transmit to

Мало того, если посмотреть, на обмен по шине, то мастер должен регулярно получать от слейва подтверждения:

Так вот, есть подозрение, что ждать этого подтверждения он может бесконечно долго (мне лень расковыривать Wire и смотреть, что именно он делает)

И обратите внимание, что RW не входит в адрес