Вроде бы всё по даташитам, но на ожидании флага INITF мы останавливаемся и не выходим из этого цикла. Вроде бы и разблокировку делаю, и адреса правильные, но что-то не работает. Даже LSI вместо LSE пытался использовать, результат тот же.
Если читать из регистров RTC, то в RTC_DR1 получам 0x01, в RTC_DR2 - 0x21 - всё как положено. Ну, а если убрать ожидание входа в режим инициализации, то содержимое регистров не изменяется.
С stm8l часы еще не делал, это у меня было запланировано когда-то. По коду пока проблем не вижу. только хочу уточнить: а LSEON сделан? Хотя, он должен был сам включиться, но можно проверить тоже. p.s. А. у меня платка с stm8l152 но даташит, вроде, тот же самый.
Добавлено after 5 hours 38 minutes 44 seconds: Еще, к делу не относится, но в RTC_DR2 старшие 3 бита не должны быть нулями:
Цитата:
Bits 7:5 WDU[2:0]: Week day units 000: forbidden. 001: Monday ... 111: Sunday
Добавлено after 15 minutes 30 seconds: Глягул внимательнее, что-то странные у вас коэффициенты деления. Для асинхронного счетчика рекомендуется использовать максимальное значение - 128. Т.е. грузить - 127 (0x7F). Тогда, если кварц 32768, для синхронного остаётся 256 - грузить 255 (0xff). Хотя, вы делите заранее на 32 (я бы этого не делал), то коэфиициенты верные, только грузить всё-равно надо на 1 меньше.
Добавлено after 1 hour 51 minute 40 seconds: Вот мой вариант - не зависает в фазе INITF:
; main.c: 249: RTC_WPR = 0xFF; ldw x, #0x5159main.c: 40: ld a, #0xff ld (x), a ret
Случайно обнаружил, что если после установки флага INIT немного подождать, то потом флаг INITF нормально читается и устанавливаются остальные регистры, но никогда не взводится флаг RSF в RTC_ISR1 и часы не тикают. Вроде бы в free run режим перевожу...
Тактирование контроллера от HSI, никаких особых настроек.
Странно выходит с задержкой, нигде в ДШ такого не встречал, да и в примерах в интернете тоже.
Что-то я всё-таки неправильно делаю похоже...
Добавлено after 25 minutes 37 seconds: Так, чтобы часы пошли нужно флаг RSF сбрасывать руками, например так:
Код:
RTC_ISR1 &= ~(RTC_ISR1_INIT | RTC_ISR1_RSF);
Всё равно с задержкой меня решение смущает, потому что как-то ненадёжно это.
что если после установки флага INIT немного подождать, то потом флаг INITF нормально читается
Ну дык, для того этот флаг (INITF) и есть. Тем более в даташите явно сказано, что переход в режим инициализации требует 2 такта RTCCLK, который вы еще и затормозили в 32 раза! У моего кристалла всё нормально работает: и RSF взводится, и часы тикают.
a_winner писал(а):
Так, чтобы часы пошли нужно флаг RSF сбрасывать руками, например так:
Не нужно. По входу в режим инициализации оно и так сбрасывается. Надо просто читать все регистры TR и DR. Так как в даташите написано, что обновление теневых регистров блокируется после чтения TR1 или SSRL и разблокируется после чтения DR3.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Уже переделал без предделителя в RTCCLK, см. ассемблерный листинг сообщением выше. Да и с предделителем 32, ну, вошел бы в режим инициализации RTC не через 60мкс, а за 2мс, так у меня он (флаг INITF) в цикле никогда не читается единичкой.
Если в while вставить небольшую задержку, то инициализация проходит нормально.
Про блокировку теневых регистров я невнимательно прочитал даташит, спасибо. Только получается, мне всегда нужно читать все регистры, даже, если нужно только часы и минуты прочитать? Лучше я буду сбрасывать флаг RSF.
В итоге у меня сейчас так:
Код:
// Enter initialization mode void RTC_InitModeEnter() { RTC_ISR1 |= RTC_ISR1_INIT; while (!(RTC_ISR1 & RTC_ISR1_INITF)) { _delay_ms(10); } }
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения