Зарегистрирован: Вт май 01, 2007 19:27:30 Сообщений: 56
Рейтинг сообщения:0
Коллеги, пишу прогу для работы с DS1307 для atmega 8. Имею странный глюк, при чтении данных из DS1307 функцией (функция состоит из команд запись и чтения регистров) данные считываются, но затем происходит запись в 7 регистр данных D0 07 90 (этой команды в программе нет вообще). Если команды записи и чтения прописать в функции main, то все работает хорошо.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: WinAvr в вопросах и ответах
Добавлено: Ср ноя 01, 2017 06:12:41
Открыл глаза
Зарегистрирован: Вт май 01, 2007 19:27:30 Сообщений: 56
Рейтинг сообщения:0
Вот код функции. Немного понял, после выхода из функции происходит перезагрузка МК. Из-за чего заново инициализируется DS1307, но вместо байта данных 00 записывается 90. См. лог во вложении. Сама функция void rtc_gettime(unsigned char *hour,unsigned char *min,unsigned char *sec){
I2CStart(); if (I2CWriteByte(0xd0)); if (I2CWriteByte(0x00)); //I2CStop();
I2CStart(); if (I2CWriteByte(0xd1)); if (I2CReadByte(*sec,1)); if (I2CReadByte(*min ,1)); if (I2CReadByte(*hour,0)); I2CStop(); }
P.S. разобрался был перезагруз МК из-за другой функции. Хотя странный в ней был switch от 0 до 9. при вводе в процедуру числа 10, был перезагруз, добавил default тоже самое, пришлось сдeлать проверку if.
Опять же, кода недостаточно. Мы не знаем, например, выделена ли память под указатели *sec, *min и *hour. Вангую, что нет, и от этого и перезагрузки МК.
А вообще красивее было бы иметь структуру для хранения времени, и читать в неё. Т.е. что-то вроде: Спойлер
Зарегистрирован: Вт май 01, 2007 19:27:30 Сообщений: 56
Рейтинг сообщения:0
Чтобы сделать проверку что число в диапазоне, говорю default не работает, точнее с ним тоже перезагруз был ниже пример switch (digit) { case 0: PORTD=0x5F; break; case 1: PORTDIG=0x0C; break; case 2: PORTDIG=0x3B; break; case 3: PORTDIG=0x3E; break; case 4: PORTDIG=0x6C; break; case 5: PORTDIG=0x76; break; case 6: PORTDIG=0x77; break; case 7: PORTDIG=0x1C; break; case 8: PORTDIG=0x7F; break; case 9: PORTDIG=0x7E; break; default: PORTDIG=0x00; break; }
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Очередная тема быдлокодерства, которая, по всей видимости, также как и недавняя, развернётся на 3 страницы экстрасенсорных обсуждений И опять же, мы вляпываемся в это г...о
PS: Пора уже наверное просто начинать игнорить подобные темы. Пусть люди учатся вопросы нормально задавать, со всеми прикреплёнными максимально-необходимыми данными.
Зарегистрирован: Вт май 01, 2007 19:27:30 Сообщений: 56
Рейтинг сообщения:0
Я говорю перезагруз был если в switch попадало число более 9, пробовал вводит переменнную более 9. Вот исправленная процедура получения времени (см. ниже), а вот вызов ее main rtc_get_time(&hour,&min,&sec);. В процедуру передаются адреса переменных (&sec и т.д.), эти адреса передаются функции I2CReadByte(sec,1) без указателя ) сама функция I2CReadByte(sec,1) берет адрес переменной и записывает туда нужное значение. Если ее вызвать напрямую то получится I2CReadByte(&sec,1). Это конечно все учебниках написано, но каждый учится на своих ошибках.
void rtc_get_time(unsigned char *hour,unsigned char *min,unsigned char *sec){ I2CStart(); if (I2CWriteByte(0xd0)); if (I2CWriteByte(0x00)); //I2CStop();
I2CStart(); if (I2CWriteByte(0xd1)); if (I2CReadByte(sec,1)); if (I2CReadByte(min ,1)); if (I2CReadByte(hour,0)); I2CStop();
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 54
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения