Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.51/82: Рейтинг темы: голосов - 82, средняя оценка - 4.51
Vottdimor
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
1

Асмовая RTOS DIHALT-a

18.06.2010, 20:00. Просмотров 14685. Ответов 19
Метки нет (Все метки)

Вопрос довольно интересный, а кто нить в этой РТОС реализовывал задачи жестко привязанные ко времени, к примеру обработку 1-варе? Возможно ли в принципе такое? Хозяин дома - сейчас в отпуске, отпускается :) может кто нить делал? Отпишитесь результатами и опытом ;) плиз. Может когда DY HOTT вернётся, то отпишется и сам, надеюсь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2010, 20:00
Ответы с готовыми решениями:

RTOS for AVR
А много ли реально приложений, где совсем никак нельзя обойтись без системы...

DI HALT rtos
Уже задавал вопрос, но не получил ответа. Мне надо организовать регулировку...

Вопрос по RTOS
Сразу приношу извинения, если пишу не в ту тему. Вопрос в следующем: как в RTOS...

Порт RTOS на mikropascal
Существуют ли порты RTOS на MikroPascal? Поиски в инете ничего не дали, самому...

Как запустить RTOS в WinAVR?
Нашел RTOS, до этого работал только в AVR Studio. Объясните, как в WinAVR...

19
ZvookyiJoo
0 / 0 / 0
Регистрация: 29.04.2010
Сообщений: 181
20.06.2010, 22:44 2
А кто мешает вызывать каждую ступень обмена данными по однопроводу с нужной задержкой? А если приоритетный диспетчер (если правильно помню) - то и пихать задачи в очередь с нужным приоритетом ;)
0
KiFyR
0 / 0 / 0
Регистрация: 26.01.2010
Сообщений: 55
21.06.2010, 00:54 3
Цитата Сообщение от Vottdymor
Возможно ли в принципе такое?
1-Wire маловероятно. Задержки на таймер не повесишь, так как минимальная длительность таймера 1 мсек. Но таймер пригодится если необходини длительная задержка (в датчике температуры преобразование длится до 700 мсек)
0
Dysosm
0 / 0 / 0
Регистрация: 15.02.2010
Сообщений: 16
21.06.2010, 10:22 4
Можно сделать бОльшую частоту таймера.
0
DY HOTT
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
22.06.2010, 23:54 5
Либо добавить таймер2 работающий в режиме конечного автомата и пихающего на конвейер куски подзадачек обработчика 1-вайр. Правда тут косяк -- у этой шины ОЧЕНЬ критичные тайминги. Так что я бы его лучше отдельным конечным автоматом на прерывании отдельного таймера сделал.
0
DY HOTT
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
22.06.2010, 23:55 6
А в логику программы увязал так: стартовая задача запускает автомат, он обрабатывает посылку и запускает итоговую задачу, которая уже пихнет ее куда нужно или выполнит какое либо действие.
0
Vottdimor
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
23.06.2010, 00:28 7
Можно поподробней:

Цитата Сообщение от DY HOTT
Либо добавить таймер2 работающий в режиме конечного автомата и пихающего на конвейер куски подзадачек обработчика 1-вайр. Так что я бы его лучше отдельным конечным автоматом на прерывании отдельного таймера сделал.
Не могу представить себе, как это всё выглядит "конечный автомат на таймере2". Т.е. сделать таймер с прерываниями в 1мс? Так как минимальный временной промежуток протокола 6 мс, исходя из http://www.gaw.ru/html.cgi/txt/app/micr ... avr318.htm "Таблица 3 – Значения используемых задержек времени".
0
DY HOTT
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
23.06.2010, 14:15 8
Конечный автомат выглядит так:

При входе в обработчик прерывания первым делом проверяется состояние автомата (глобальная переменная) и на основании этого делается переход на обработку состояния. На выходе состояние меняется на следующее.

Т.е. стартовая задача программирует первую временную задержку (длина старт импульса) доп таймера и создает начальное действие, скажем формирует нисходящий фронт старт импульса на шине. А также задает положение 0 автомата.

Прерывание по переполнению (а проще по OCR прерыванию) доп таймера:
при входе в состояние 0:
Поднимает линию вверх (конец старта), берет передаваемый байт, определяет первый бит (запоминает какой он по счету) (ноль или 1) и в зависимости от этого выставляет состояние 1 (если ноль) или состояние 2 (если адын) для конечного автомата. Запускает задержку которая должна быть между старт импульсом и первым битом. Выходит.

Опять прерывание доп таймера. На этот раз мы вваливаемся в первое или второе состояние конечного автомата. По которому формируем задержку на длину нуля или единички. Читаем следующий бит, определяем следующее состояние для автомата. Выходим.

Когда автомат прожует весь передаваемый байт (или цепочку байтов) он на последнем издыхании генерит финальное состояние ,которое запустит в конвейер задачу обработки данных и связь с основной программой.

З.Ы.
приеду домой напшиу статейку про работу с далласом на автоматах.
0
Vottdimor
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
24.06.2010, 01:51 9
Удачного отдыха, и ждёмс статейку :)
0
Vottdimor
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
01.07.2010, 13:35 10
Цитата Сообщение от DY HOTT
З.Ы.
приеду домой напшиу статейку про работу с далласом на автоматах.
Вроде уже приехал, теперь с новыми силами и свежей головой может таки слобаешь статейку? ;)
0
DY HOTT
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
01.07.2010, 18:54 11
Я еще не совсем вернулся. Дома буду числа 5го. Дел сейчас столько что капец.
0
vrr
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 4
02.08.2010, 18:05 12
Цитата Сообщение от DY HOTT
Поднимает линию вверх (конец старта), берет передаваемый байт,...
После поднятия линии вверх нужно выждать 15-60 us для ее возврата на место, затем в течении
60-240 us ждать ответа (PRESENCE) от устройства. "После этого устройство так же "отпускает" шину.
Но после завершения импульса PRESENCE устройству дается еще некоторое время для завершения внутренних процедур инициализации, таким образом, МК должен приступить к любому обмену с устройством не ранее, чем через 480 микросекунд после завершения импульса RESIT. (http://www.rodyokot.ru/articles/13/)" . Значит после всего этого мы должны дать задержку еще на 180 us. Это будет процедура сброса линии и проверки наличия на ней хотя бы одного устройства. В стартовой задаче:
Код
 Measure_tempr:
push     temp
clr    temp               ;
stsr   fymite_machine, temp              ;конечный автомат в начало(fymite_machine - байт в ОЗУ)
out    TCNT1H, temp         ;установить начальное
out    TCNT1L, temp         ;значение счетчиков

ldi   temp, high(Timer_480_us)   ;таймер
out   OCR1AH, temp                 ;на
ldi   temp, low (Timer_480_us)   ;480 us
out   OCR1AL, temp

in   temp, TIMSK
ori   temp, (1<<OCIE1A)      ;разрешили прерывание по совпадению
out   TIMSK, temp

wire0               ;линию 1-wire в "0"
outi   TCCR1B, (1<<WGM12)|(1<<CS10)    ;режим совпадения вкл, таймер вкл
pop   temp
RET
В прерывании:
Код
;=======Прерывание Т1 по совпаденю=======

OutComp1Int:
pushf
push   temp
ldis   temp, fymite_machine      ;считываем состояние конечного автомата
cpi   temp, 0                        ;в нулевом состоянии отправляемся на поднятие линии 1-wire
breq   wire_one      ;и задаем задержку в 60 us для релаксации линии

cpi   temp, 1                       ;здесь уходим на ожидание PRESENCE
breq   woyt_presence              ;и выставляем задержку в 240 us

cpi   temp, 2                      ;тут заканчиваем сброс линии
breq   woyt_end_risit

wire_one:
wire1                                                ;линию в "1"
ldi   temp, high(Timer_60_us)      ;таймер
out   OCR1AH, temp         ;на
ldi   temp, low (Timer_60_us)      ;60 us
out   OCR1AL, temp
ldi   temp, 1            ;конечный автомат на следующую позицию
stsr   fymite_machine, temp
rjmp   end_int

woyt_presence:
ldi   temp, high(Timer_240_us)   ;таймер
out   OCR1AH, temp         ;на
ldi   temp, low (Timer_240_us)   ;240 us
out   OCR1AL, temp
ldi   temp, 2            ;конечный автомат на следующую позицию
stsr   fymite_machine, temp
rjmp   end_int

woyt_end_risit:
ldi   temp, high(Timer_180_us)   ;таймер
out   OCR1AH, temp         ;на
ldi   temp, low (Timer_180_us)   ;180 us
out   OCR1AL, temp
ldi   temp, 3         ;конечный автомат на следующую позицию
stsr   fymite_machine, temp
;   rjmp   end_int

end_int:
pop   temp
popf
reti
stsr - это макрос, записывающий состояние РОН в ОЗУ
ldis - макрос, считывающий состояние байта ОЗУ в РОН

В чем собственно затык: мне нужно отследить приход PRESENCE, но каким способом эт зделать из самой RTOS не могу допеткать. В прерывании я задал нитервал времени (240 us) и теперь мне нужно пока считает таймер попасть в задачу, которая проверит мне приход PRESENCE - т.е. перед выходом из прерывания я ставлю в очередь эту задачу. А что если очередь будет как за водкой в сухой закон;)? Не могу разрулиться, мож подскажет кто чего
0
Hoskir
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 30
02.08.2010, 22:45 13
Как бы 1-Wire можно через Uart прицепить, на скорости, если не изменяет память 9600, отслеживать задержки не надо, вся работа осуществляется в отправке и принятии информации по одному байту.
0
Vottdimor
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
03.08.2010, 13:28 14
Цитата Сообщение от Hoskir
Как бы 1-Wire можно через Uart прицепить, на скорости, если не изменяет память 9600, отслеживать задержки не надо, вся работа осуществляется в отправке и принятии информации по одному байту.
Я пользовался:
http://www.gaw.ru/html.cgi/txt/app/micr ... avr318.htm
там очень хорошо расписаны временные задержки, ну и есть реализация через юсарт.
0
vrr
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 4
03.08.2010, 17:01 15
Спасибо за информацию, действительно удобно, но мне асм ближе чем си, хотя можно попробовать и на ассемблере реализовать.
0
Hoskir
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 30
07.08.2010, 04:58 16
Цитата Сообщение от Vottdymor
Цитата Сообщение от Hoskir
Как бы 1-Wire можно через Uart прицепить, на скорости, если не изменяет память 9600, отслеживать задержки не надо, вся работа осуществляется в отправке и принятии информации по одному байту.
Я пользовался:
http://www.gaw.ru/html.cgi/txt/app/micr ... avr318.htm
там очень хорошо расписаны временные задержки, ну и есть реализация через юсарт.

Просто я давненько подключал DS18B20 к компу через RS232, на скорости 9600 всё обрабатывается побайтно, не надо думать о временных интервалах.
0
DY HOTT
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
07.08.2010, 09:08 17
Если у ты не можешь предсказать четкое поведение отклика, а тайминги у тебя жесткие, то тебе проще будет на другом (не системном) таймере сделать конечный автомат и его уже нагрузить на обработку протокола, а данными обмениваться уже с задачами которые скачут через диспетчер.
0
vrr
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 4
07.08.2010, 18:51 18
Стстемным таймером остался-T2, я его не менял пока, а на T1 я и попытался сделать конечный автомат. В стартовой задаче Measure_tempr я задаю длину старт-импульса, и далее в прерывании по совпадению T1 задаю последующие временные интерваы, переключая к.автомат. И в положении к.автомата-"woyt_presence"-это те самые 240 us, в течении которых должен прийти PRESENCE, мне нада как-то его отследить(принять). Может "woyt_presence" разделить на допустим 10 частей и в каждой 1/10 проверять упала-ли линия 1-wire в ноль, и если это случилось, то ставить в очередь задачу, кот. уже будет обрабатывать ответ.
0
DY HOTT
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
07.08.2010, 21:27 19
Попробуй. Только зачем десять раз проверять? У тебя в разрядность таймера задержка не влазит? Так заюзай предделитель.
0
vrr
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 4
27.08.2010, 00:12 20
Доброго времени всем. Вот прикрутил к RTOS DI протокол 1-Wire, в частности термометр DS1820. Получилось аж 6 задач. Весь протокол работает на прерывании по совпадению таймера 1. Заходя в прерывание считывается состояние конечного автомата и осуществляется переход на нужные процедуры, представляющие из себя тайминиги протокола 1-Wire. Прерывание, правда, получилось немного раздутое... Вобщем как для начинающего, надеюсь прокатит. Также знаю, что любой код подлежит оптимизации, поэтому это неокончательный вариант. Проект для ATmega16 с внутренним генератором на 8МГц. Библиотеки работы с LCD и кое-какие макросы использовал от DY HOTT, за что ему оч. спасибо! Подсчет CRC-8 взят с http://rodyokot.ru/circuit/digital/home/12/index.shtml. Если будут вопросы-задавайте, постараюсь ответить.

[30.33 Кб]
0
27.08.2010, 00:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2010, 00:12

atmega8535, RTOS, interrupts, вопрос
Здравствуйте, установил ОС, которую выкладывал Ди и возник следующий вопрос. ...

Rtos и tiny2313 что править?
с установкой Rtoso от Di Halta на Мегу32 проблем как таковых не возникло ибо...

RTOS для AVR. Какая там загрузка контроллера?
Пишу диспетчер мультизадачности для AVR. Интересен вопрос - сколько примерно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru