Для часов - просто "мозги размять", а например для программного многоканального ШИМа - в самый раз..Мастер Ломастер писал(а): для часов - однозначно экзотика.
Нужен оптимальный алгоритм RTC
Re: Нужен оптимальный алгоритм RTC
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
- Реклама
Re: Нужен оптимальный алгоритм RTC
Engineer_Keen, опоздал немногоЧуть короче и без использования бита T
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Нужен оптимальный алгоритм RTC
на счет ШИМ-а не уверен... да и по поводу разминки - тоже не уверенМитяРа писал(а):Для часов - просто "мозги размять", а например для программного многоканального ШИМа - в самый раз..Мастер Ломастер писал(а): для часов - однозначно экзотика.
битва с дураками проиграна, победители торжествуют. слава победителям!
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Нужен оптимальный алгоритм RTC
Точно-точно, там и я некое подобие такого подхода использовал. Метод на самом деле больше для тренировки мозгов.МитяРа писал(а):для программного многоканального ШИМа - в самый раз..
Просто целого куска для секунд-минут-часов не видел. Был кусок только с использованием T, а потом без T, но только для секундploop писал(а):Engineer_Keen, опоздал немного
Кстати вариант для 51:
Код: Выделить всё
RTC:
MOV A,TS ; :)
INC A
MOV B,A
CLR C
SUBB A,#60
CLR A
SUBB A,#0
ANL B,A
MOV TS,B
CPL A
ANL A,#1
ADD A,TM
MOV B,A
CLR C
SUBB A,#60
CLR A
SUBB A,#0
ANL B,A
MOV TM,B
CPL A
ANL A,#1
ADD A,TH
MOV B,A
CLR C
SUBB A,#24
CLR A
SUBB A,#0
ANL B,A
MOV TH,B
RET
Re: Нужен оптимальный алгоритм RTC
Не, ладно всякие финты на гране хакерства, которые понятны только автору, но ведь бывают простые и на столько очевидные решения, что иногда вызывают восторг. И рождаются они зачастую из таких вот "разминок"я сторонник простых и ясных методов, без высокохудожественных изысков (если, как уже было отмечено, высокохудожественность не причина, а следствие).
- Реклама
Re: Нужен оптимальный алгоритм RTC
Кстати, хорош...Engineer_Keen писал(а):Кстати вариант для 51:
P.S. ploop, как думаешь, может завтра создать новую тему или в твоей пока "мозги поразминаем"?
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Re: Нужен оптимальный алгоритм RTC
Да как удобней, мне всё равно. Моя то задача решена. Но если сможет кто-то предложить вариант короче - буду только рад 
Re: Нужен оптимальный алгоритм RTC
Ладно, к завтру энкодер с ограничителями доцарапаю и с него тему начну...ploop писал(а):Да как удобней, мне всё равно.
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Re: Нужен оптимальный алгоритм RTC
Давай, помозгуем!
Re: Нужен оптимальный алгоритм RTC
Как вам такой код на примере минут и часов для х51.
Инкремент минут:
После этого фрагмента в B будет значение минут по модулю 60, а в A будет либо 0 (если значение минут после инкремента меньше 60) или 1 (если равно 60). Используем значение в A для инкремента часов:
Значение в А можно далее использовать для инкремента дней. По времени выиграша нет по-сравнению с кодaми выше (те-же 14-15 циклов), но занимает меньше места в памяти. Я-бы после первого фрагмента все-таки поставил JZ XXX чтобы нижеследующий код не вычислялся зря в случае непереваливания минут через 60.
Инкремент минут:
Код: Выделить всё
mov A, minutes
inc A
mov B, #60
div AB
mov minutes, BКод: Выделить всё
add A, hours
mov B, #24
div AB
mov hours, B-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Нужен оптимальный алгоритм RTC
так в том и фишка, чтобы сделать не проще и понятнее, а с переподвыподвертомSer60 писал(а):Я-бы после первого фрагмента все-таки поставил JZ XXX чтобы нижеследующий код не вычислялся зря в случае непереваливания минут через 60.
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: Нужен оптимальный алгоритм RTC
Мастер Ломастер, дык сами спровоцировали! Не получится, не получится.... 
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Нужен оптимальный алгоритм RTC
не-не-не, не приписывайте мне разжигание чего-то там!ploop писал(а):Мастер Ломастер, дык сами спровоцировали! Не получится, не получится....
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: Нужен оптимальный алгоритм RTC
Не всегда.. Чаще мя использую некую "комбинацию", где что-то делается линейно, а что-то с переходами..Мастер Ломастер писал(а):что это представляет исключительно "академический" интерес
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Нужен оптимальный алгоритм RTC
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: Нужен оптимальный алгоритм RTC
Кто еще хочет размяться? 
Алгоритм лучше словами. Свой тоже опишу.
Есть простой алгоритм декодирования команд пульта ДУ. Любой протокол кодирования передаёт биты только одним способом - длительностями импульсов. И отличаются длинный и короткий импульсы всегда в два раза.
Нам достаточно просто отличить длинный импульс от короткого и сохранить в виде битов. Запомнив результат, можно "обучить" своё устройство практически любому пульту ДУ подходящей несущей частоты.
Для чёткого определения длительности можно настроить любой таймер (даже уже работающий в режиме ШИМа) на такую частоту, чтобы период его переполнения был меньше длительности самого большого импульса. Прикинуть просто: самый короткий информационный импульс должен быть не менее 10 импульсов несущей частоты. На 36-38кГц получается 3.6-3.8кГц. Длинный, соответственно, в два раза больше: 1.8-1.9кГц. Это период (два импульса). Значит таймер может работать на частоте от 2 до 4 кГц, чем ближе к 3,8 тем лучше (предделителем точную частоту не установишь).
Длительность импульса определяем так: в прерывании замеряется длительности фронтов и спадов. Есть два регистра, предыдущее и текущее состояние счетчика. В прерывании копируем текущее в предыдущее, регистр счетчика - в текущее. Получаем разницу показаний. На рисунке это T1 или T2.
Из-за того, что они не могут быть каждый раз идентичны, их нельзя тупо сравнивать с эталонными. Нужно просто отличить один от другого. Для этого выводим их как-нибудь на глаза (в UART или на дисплей), и считаем середину между ними - Border. Запоминаем её как константу. Теперь если вычесть из результата Border, в флаге переноса получим ноль, есть это T1, и единицу, если T2. Дальше просто сдвигаем его в приёмники.

После того, как насдвигали N бит (например 16), надо вырубить прерывания, иначе результат затрётся, и забрать его. Включить, например, через задержку.
Но вот как придумать, чтобы можно было отрабатывать повтор кнопки при удержании? Принимается ведь не полная посылка, а лишь безсмысленный кусок?
Для одиночных нажатий алгоритм работает как часы, проверен неоднократно.
Алгоритм лучше словами. Свой тоже опишу.
Есть простой алгоритм декодирования команд пульта ДУ. Любой протокол кодирования передаёт биты только одним способом - длительностями импульсов. И отличаются длинный и короткий импульсы всегда в два раза.
Нам достаточно просто отличить длинный импульс от короткого и сохранить в виде битов. Запомнив результат, можно "обучить" своё устройство практически любому пульту ДУ подходящей несущей частоты.
Для чёткого определения длительности можно настроить любой таймер (даже уже работающий в режиме ШИМа) на такую частоту, чтобы период его переполнения был меньше длительности самого большого импульса. Прикинуть просто: самый короткий информационный импульс должен быть не менее 10 импульсов несущей частоты. На 36-38кГц получается 3.6-3.8кГц. Длинный, соответственно, в два раза больше: 1.8-1.9кГц. Это период (два импульса). Значит таймер может работать на частоте от 2 до 4 кГц, чем ближе к 3,8 тем лучше (предделителем точную частоту не установишь).
Длительность импульса определяем так: в прерывании замеряется длительности фронтов и спадов. Есть два регистра, предыдущее и текущее состояние счетчика. В прерывании копируем текущее в предыдущее, регистр счетчика - в текущее. Получаем разницу показаний. На рисунке это T1 или T2.
Из-за того, что они не могут быть каждый раз идентичны, их нельзя тупо сравнивать с эталонными. Нужно просто отличить один от другого. Для этого выводим их как-нибудь на глаза (в UART или на дисплей), и считаем середину между ними - Border. Запоминаем её как константу. Теперь если вычесть из результата Border, в флаге переноса получим ноль, есть это T1, и единицу, если T2. Дальше просто сдвигаем его в приёмники.

После того, как насдвигали N бит (например 16), надо вырубить прерывания, иначе результат затрётся, и забрать его. Включить, например, через задержку.
Но вот как придумать, чтобы можно было отрабатывать повтор кнопки при удержании? Принимается ведь не полная посылка, а лишь безсмысленный кусок?
Для одиночных нажатий алгоритм работает как часы, проверен неоднократно.
Re: Нужен оптимальный алгоритм RTC
А если импульс типа "меандра", то где у него будет фронт, а где - спад?ploop писал(а):в прерывании замеряется длительности фронтов и спадов.
Ты походу кислое с пресным перепутал..
А по задачке: возьми за основу принцип "синхронизации" УАРТА при асинхронном приёме..
У твоего протокола ИК-последовательности, наверняка есть "стартовая посылка", которая чему-то равна..
Вот чему она равна?
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Re: Нужен оптимальный алгоритм RTC
Ну ты меня прям убил!А если импульс типа "меандра", то где у него будет фронт, а где - спад?
Меандр не импульс, а периодический прямоугольный сигнал, сто скважностью равной двум
Её приходится пропускать. У некоторых протоколов там инвертируется бит чётного и нечётного нажатия. Это сделано чтобы отличать, было ли новое нажатие, или сигнал пульта прервался препятствием, а кнопка удерживается.Вот чему она равна?
Re: Нужен оптимальный алгоритм RTC
Теперь ты мя тоже убил, наповал прямо..ploop писал(а):Меандр не импульс, а периодический прямоугольный сигнал, сто скважностью равной двум
Меандр, это "не рыба и не мясо" среди импульсов, т.к. у него нет фронта и нет спада, а у импульсов положительной или отрицательной полярности, и то и другое - есть..
Вопрос был: Чему она равна?ploop писал(а):Её приходится пропускать.
В УАРТе стартовый бит - 1.5 бита данных, а у тя сколько?
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Re: Нужен оптимальный алгоритм RTC
У любого периодического сигнала нет ни фронта ни спада, т.к. нет начала и нет конца на данном промежутке времени.Меандр, это "не рыба и не мясо" среди импульсов, т.к. у него нет фронта и нет спада
И пусть нас похоронят вместе!
Да не помню, гуглить надо конкретный протокол. Кажется с длинного импульса начинается, потом у каждого свои заморочки.Вопрос был: Чему она равна?
А фишка - сделать без привязки к протоколу!


