Всем привет. Собрал я часы на ИН-6, проект здесь: http://forum.rcl-radio.ru/viewtopic.php?id=87.но Индикаторы постоянно показывают разную фигню, например 80.88...Железо проверил, все собрано правильно. Значит проблема в скетче. Просмотрел, скетч рабочий, закоментировал управление кнопками, не помогло...Добавил строки для вывода в монитор порта и удивился. Вот кусок кода: hh = time.gettime("H"); mm = time.gettime("i"); // ss = time.gettime("s"); delay(1); times = hh*100+mm; Serial.println(times ); // Выводим время. delay(1); Строка Serial.println(times ); выводит фигню, каждый раз разную.. Или трехзначное число, или квадратики, или букву.. То же самое при попытке вывода переменных hh и mm. А вот строка Serial.println(time.gettime("H")) выводит в монитор значение часов, все верно. Подозреваю, что именно в этом проблема. Есть знатоки, что могут помочь? Всю голову сломал уже... Полный скетч во вложении. Вот сообщение компилятора: :\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino: In function 'void setup()': C:\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino:37:21: warning: invalid conversion from 'char*' to 'int' [-fpermissive] C:\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino:38:22: warning: invalid conversion from 'char*' to 'int' [-fpermissive] C:\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino:39:20: warning: invalid conversion from 'char*' to 'int' [-fpermissive] C:\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino:40:21: warning: invalid conversion from 'char*' to 'int' [-fpermissive] C:\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino:41:23: warning: invalid conversion from 'char*' to 'int' [-fpermissive] C:\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino: In function 'void loop()': C:\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino:48:22: warning: invalid conversion from 'char*' to 'char' [-fpermissive] C:\Users\Алина\Desktop\Часы на ин6\sketch______6_____1307\sketch______6_____1307.ino:49:22: warning: invalid conversion from 'char*' to 'char' [-fpermissive] Скетч использует 11538 байт (37%) памяти устройства. Всего доступно 30720 байт. Глобальные переменные используют 639 байт (31%) динамической памяти, оставляя 1409 байт для локальных переменных. Максимум: 2048 байт.
Где в документации это указано? Ну посоветуй еще три раза постучать по корпусу, чтобы помогло . У ТС при компиляции совсем другие ошибки, и компиляция завершилась. Опять ерунду пишешь или просто спамишь?
Поровоз дело говорит.Это как минимум должно быть.Ни в пути установки IDE ни в названии файла не должно быть кириллицы— только латинские буквы. Кстати касается и Студии и Кодвижн и IAR. C:\Users\Alina\In6 типо так. Потом надо смотреть код. Вечером могу проверить и посмотреть не раньше
Да не, у ТС все же компилируется, а варнинги по другой причине. Только что проверил, есть в пути каталоги с русскими буквами, нет - одинаково компилируется и одинаково работает. Я в принципе не о том. ТС спрашивает: Ну причем тут:
Вот смотрите: Код (C++): char times,mm,hh; Код (C++): times = hh*100+mm; times - это 8 бит. Влезут туда часы умноженные на 100 + минуты? UPD: Те варнинги, которые появились при компиляции указывают на ошибки. Их нужно внимательно изучать, а не игнорировать. Например компилятор "ругнулся" на строку: Код (C++): hh = time.gettime("H"); Нужно посмотреть описание библиотеки, где сказано:
Ваш скетч не соответствует указанному проекту. Вы используете другие библиотеки. Теперь по поводу используемой Вами библиотеки iarduino_RTC. Что-нибудь знаете про динамическое выделение памяти -- malloc()/free() ? Если не знаете, то ни в коем случае не используйте функцию time.gettime(), например, time.gettime("y"), time.gettime("m") и подобные. Воспользуйтесь лучше публичными свойствами: Код (C++): ........ year = time.year; month = time.month; ........ И тип переменных year, month и подобных должен быть вроде uint8_t, а не char. Иначе Serial.print() будет выдавать чепуху, а не числа. UPD: функцию time.gettime() нужно вызывать перед доступом к публичным свойствам. По поводу кириллицы в путях к файлам -- не желательно использовать русские буковки, но и запрета нет. Если работает, то ни чего страшного. Но может в неожиданный момент сломаться.
Я использовал скетч, разработанный автором проекта под дс1307. Впрочем, автор честно признает, что в железе, в отличие от скетча под дс3231 он его не проверял) Обязательно проверю вашу версию и отпишусь.
если я ниче не путаю, вроде же 1307 от 3231 отличаются только отсутствием будильника и адресом управляющего регистра. можно вообще без библиотек обойтись, я вот такие функции нагуглил и доволен Код (C++): byte decToBcd(byte val){return( (val/10*16) + (val%10) );} byte bcdToDec(byte val){return( (val/16*10) + (val%16) );} void setDS1307time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year){ // передаем данные о времени и дате на DS1307: Wire.beginTransmission(DS1307_I2C_ADDRESS); // выставляем регистр указателей DS1307 на регистр «00h», // т.е. на регистр, в котором хранятся данные о секундах: Wire.write(0); Wire.write(decToBcd(second)); // задаем секунды Wire.write(decToBcd(minute)); // задаем минуты Wire.write(decToBcd(hour)); // задаем часы Wire.write(decToBcd(dayOfWeek)); // задаем день недели (1 – это воскресенье, 7 – это суббота) Wire.write(decToBcd(dayOfMonth)); // задаем дату (от 1 до 31) Wire.write(decToBcd(month)); // задаем месяц Wire.write(decToBcd(year)); // задаем год (от 0 до 99) Wire.endTransmission(); } void readDS1307time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year){ Wire.beginTransmission(DS1307_I2C_ADDRESS); // выставляем регистр указателей DS1307 на регистр «00h»: Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7); // запрашиваем у DS1307 семь байтов начиная с регистра «00h»: *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); } void writeDS1307ctrl(unsigned char data){ Wire.beginTransmission(DS1307_I2C_ADDRESS); //device address and STSRT command are queued Wire.write(0x07); //Control Register Address is queued Wire.write(data); //Data for Control Register is queued Wire.endTransmission(); //queued information are transferred under ACK; STOP } unsigned char readDS1307ctrl(void){ unsigned char reg=0; Wire.beginTransmission(DS1307_I2C_ADDRESS); //device address and STSRT command are queued Wire.write(0x07); //Control Register Address is queued Wire.endTransmission(); //queued information are transferred under ACK; STOP Wire.requestFrom(DS1307_I2C_ADDRESS, 1); reg=Wire.read(); return reg; }
Я их вообще в руках не держал ни разу, до момента, когда потребовалось устанавливать на RTC время и считывать оттуда, поэтому мой выбор именно эта библиотека, т.к. там достаточно понятный пример, на основе которого уже можно построить что то свое. Как то так.
Всем привет. С ерундой в переменной times я разобрался, спасибо AlexU за наводку. Оказалось, команда вида time.gettime("H") предназначена для считывания символов в переменную, а я пытался роботать с ней как с числом... Для этого есть другие команды, что есть в описании библиотеки iarduino, пример в куске кода. . Сейчас в times правильное время. Но прикол в том, что часы по прежнему показывают фигню)) Буду ковырять железо... Прошу глянуть код на всякий, может еще где косяк есть) Код (C++): int an, segm,i=0,times; byte a[4],ss,mm,hh; ///////////////////////// hh = time.Hours; mm = time.minutes; ss = time.seconds; times = hh*100+mm;
ничего сложного - создаешь переменные unsigned char second, minute, hour, dayOfWeek, dayOfMonth, month, year; затем делаешь вот так readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); и всё - в переменных лежит всё что надо