Запуск часов на DS1307 и Wire.h
- Войдите на сайт для отправки комментариев
Сб, 16/11/2013 - 17:13
Для полного понимания принципа записи данных использую только библиотеку 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");
}
}
Данный скетч ни как не желает работать.
На одной из многочисленных автомагистралях страны сломался автобус, перевозящий больных на голову людей. Водитель естественно пытается починить автобус... После 15 минут после поломки из автобуса выбегает Иван дурак и кричит водителю:
- А я знаю что сломалось, а я знаю что сломалось!
Водитель:
-- Не мешай, иди в автобус.
Через час ситуация повторяется.
Больной:
- А я знаю что сломалось, а я знаю что сломалось!
Водитель:
-- Не мешай, я сказал, иди в автобус.
После нескольких часов мучений водитель так и не смог найти поломку сел возле колеса и закурил. Тут по традиции из автобуса выбежал тот же больной и по традиции начал говорить водителю:
- А я знаю что сломалось, а я знаю что сломалось!
Водитель:
-- Ну и что же?
Больной:
- Автобус!
Это к чему?
Это к чему?
А к тому... клиент, старый знакомый, пару лет назад у нас на фирме комп покупал.
С лицензионным windows. Спрашиваю его : Какие ещё программы поставить .....
Ответ был простой : все......
Что конкретно не так написал?. Только не говорите, что все)
Вы вобще не написали что не работает, и как эта неработоспособность выражается.
PS. исправьте причину неработоспособности и у Вас всё заработает :)
Монитор порта молчит. Т.е. вообще ничего не происходит) Не выводится ни ОК ни FALSE. Думаю что неправильно обращаюсь к регистрам и провожу запись в них, следовательно и endTransmission не возврещает ничего, хотя по описанию этой функции в случае ошибки она на нее длолжна указать. Собираю схему на макетке. вешаю кварц, подтягиваю к питанию SDA и SCL и отправляю их на 4 и 5 аналоговый порт соответственно.
А куда Вы выводите значение функции byte transmission (byte address, byte message) ?
То есть с таким же успехом можно использовать void transmission (byte address, byte message) .
Вы два раза вызываете функцию Wire.endTransmission();
Согласен, более правильнее поставить void)
Вы про цикл if? А как еще можно сделать условие?
Так тоже проовал, без результатно) Возможно ошибка именно в моеv неправильном понимании логики работы DS1307. Или же я что-то упустил из виду.
А что есди попробовать так:
А что есди попробовать так:
endTransmission здесь является ключевой функцией отвечающей за отправление сообщения. beginTransmission указывает адрес write записывает данные в буфет передачи, а endTransmission запускает передачу. Так не получилось)
http://arduino.cc/en/Reference/WireEndTransmission
Те он дожен был хоть что-то вернуть, что отправилось бы в порт... попробуй с разными параметрами поиграться, чтобы проверить что ты в функцию выходишь и из неё выходишь выводи что нибудь вначале и в конце...
А так это не дело что программиста надо учить дебажить собственный код и когда не понимает логику что он делает и хочет получить взамен...
А DS1307 по адресу 0xD0 действительно существует?
http://arduino.cc/en/Reference/WireEndTransmission
Те он дожен был хоть что-то вернуть, что отправилось бы в порт... попробуй с разными параметрами поиграться, чтобы проверить что ты в функцию выходишь и из неё выходишь выводи что нибудь вначале и в конце...
А так это не дело что программиста надо учить дебажить собственный код и когда не понимает логику что он делает и хочет получить взамен...
Ни капли не претендую на звание программиста) Логику понимаю, не получается реализовать програмно)
За подсказку спасибо!) В функцию входит!)
А выходит ли? яхз как обрабтывается краш программы на рдуинке
А DS1307 по адресу 0xD0 действительно существует?
Как я понял из даташита это адресс самого устройства. В двоичном представлении 1101000 и в дальнейшем для передачи от мастера к слейву в старший разряд добавляется 0, в другом случае 1
ну вот и должен отвечать по адресу 0x68
(посмотрел сейчас библиотеку RTClib - там тоже 0x68)
ну вот и должен отвечать по адресу 0x68
(посмотрел сейчас библиотеку RTClib - там тоже 0x68)
Я дефолтным калькулятором в винде переводил 11010000 из BIN в HEX. Получилось D0
ну вот и должен отвечать по адресу 0x68
(посмотрел сейчас библиотеку RTClib - там тоже 0x68)
Я дефолтным калькулятором в винде переводил 11010000 из BIN в HEX. Получилось D0
Нолик лишний.
ну вот и должен отвечать по адресу 0x68
(посмотрел сейчас библиотеку RTClib - там тоже 0x68)
Я дефолтным калькулятором в винде переводил 11010000 из BIN в HEX. Получилось D0
Нолик лишний.
Дело не в даташите, а неверном отсчете вами битов, биты считаются справа налево.
Если верить даташиту то последний нолик (старшего разряда) инициализирует режим записи данных от мастера к слейву, в моем случае от МК к DS1307.
А вот если верить "даташиту" на Wire.beginTransmission, то адрес должен быть 7-битным. Так и написано:
address: the 7-bit address of the device to transmit to
Мало того, если посмотреть, на обмен по шине, то мастер должен регулярно получать от слейва подтверждения:
Так вот, есть подозрение, что ждать этого подтверждения он может бесконечно долго (мне лень расковыривать Wire и смотреть, что именно он делает)
И обратите внимание, что RW не входит в адрес