Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Есть ли какой-нибудь универсальный алгоритм работы по TWI (I2C)?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Glupen'
Задача такова: на шине TWI меги16 висят часы DS1307 и термометр DS1621.
1)Чтение времени из часов идет постоянно - раз в 1секунду,
2)запись-установка времени - по моему желанию.
3)Команда "измерить Т" дается 1 раз в 10 секунд,
4)чтение температуры - 1 раз в 10секунд.
Эти четыре пакета, могут накладываться по времени. Как бы правильно организовать "ОЧЕРЕДЬ" пакетов с какими-нибудь указателями/буферами в области памяти, где лежат передаваемые данные и куда складывать принимаемые. Чтоб контроллер сформировал очередной пакет, поставил в "очередь" и...
а дальше два варианта:
- забыл о пакете, а потом использовал данные из памяти, которые "автоматически" обновились во время приема,
- прочитав какой-нибудь "статус", увидел, что пакет обработан или нет.

работа с шиной TWI должна быть в прерывании по "TWI завершение очередного действия", чтоб не останавливать работу.

Хорошо бы, чтоб алгоритм был расширяем на много устройств, был универсальным.

Для этих четырех пакетов, (их вид фиксирован), я написал, но получилось громоздко и коряво, с кучей проверок флагов, хотя работоспособно.
artur_off
Если я вас правильно понял, то копать вам надо в сторону FIFO.

http://electronix.ru/forum/index.php?s=&am...st&p=115828
В этом посте есть очень хорошо документированный пример для UART, думаю вам не составит труда его портировать под I2C.
rezident
Задача доступа разных источников данных к одному каналу передачи данных. Решать можно несколькими способами. Но вначале нужно определиться с приоритетами. Т.е. ответить на вопрос: источники данных имеют равный приоритет или разный? Если приоритет одинаковый, то пишете планировщик который опрашивает по кольцу флаги постановки задач от разных источников данных, вызывает функцию подготовки данных, запускает в прерывании транзакцию по каналу связи и потом запускает функцию обработки принятых данных. Все это делается на базе КА (Конечные Автоматы). Если вы сможете формализовать и привести к единому виду вызовы всех функций подготовки и обработки данных для всех источников, то планировщик получается достаточно простой и расширяемый.
Hmm
А какая точность периодов опроса? Если допустимое отклонение больше, чем время обработки 1-го источника с максимальной длительностью (что вероятнее всего), то что тут "мудрить"?
Glupen'
Цитата(artur_off @ Nov 22 2010, 00:35) *
Если я вас правильно понял, то копать вам надо в сторону FIFO.

По сути да, я только слово FIFO вспомнить не мог. за ссылку спасибо, проштудирую примерчик

Цитата(rezident @ Nov 22 2010, 00:53) *
Задача доступа разных источников данных к одному каналу передачи данных. Решать можно несколькими способами. Но вначале нужно определиться с приоритетами. Т.е. ответить на вопрос: источники данных имеют равный приоритет или разный? Если приоритет одинаковый, то пишете планировщик который опрашивает по кольцу флаги постановки задач от разных источников данных, вызывает функцию подготовки данных, запускает в прерывании транзакцию по каналу связи и потом запускает функцию обработки принятых данных. Все это делается на базе КА (Конечные Автоматы). Если вы сможете формализовать и привести к единому виду вызовы всех функций подготовки и обработки данных для всех источников, то планировщик получается достаточно простой и расширяемый.


Приоритетности нет, есть один контроллер (master), который опрашивает устройства на шине (slave), каждое - по своему графику. Аварийных сообщений от устройств нет. Мне нужно, чтоб пакеты не накладывались друг на друга. У меня почти так и сделано, как вы предложили, но получилось коряво. И при добавлении нового устройства, надо много чего дописывать...
ILYAUL
Цитата(Glupen' @ Nov 21 2010, 23:40) *
Задача такова: на шине TWI меги16 висят часы DS1307 и термометр DS1621.
1)Чтение времени из часов идет постоянно - раз в 1секунду,
2)запись-установка времени - по моему желанию.
3)Команда "измерить Т" дается 1 раз в 10 секунд,
4)чтение температуры - 1 раз в 10секунд.


1. А выводите на экран тоже с секундной точностью?
2. Зачем разделять "измерить T" и "чтение" температуры? Если разница между командой начать конвертацию и готово - 10 ms/. A за 1000 ms вы успеете часы прочитать и температуру и даже поспать.
Читайте всё подряд начиная с часов. А вот выводить это как угодно
rezident
Цитата(Glupen' @ Nov 22 2010, 08:49) *
Приоритетности нет, есть один контроллер (master), который опрашивает устройства на шине (slave), каждое - по своему графику. Аварийных сообщений от устройств нет. Мне нужно, чтоб пакеты не накладывались друг на друга.
Я имел в виду приоритеты процессов, а не контроллеров на шине. Например, при совпадении времени задания "считать RTC" и "измерить температуру" какой процесс приоритетнее? По-моему мнению приоритеты у них равные, т.к. значение RTC не изменится в течение следующих 1000мс да и температура в течение этого времени навряд ли изменится в пределах измеряемой точности.
Цитата(Glupen' @ Nov 22 2010, 08:49) *
У меня почти так и сделано, как вы предложили, но получилось коряво. И при добавлении нового устройства, надо много чего дописывать...
Я предложил вам формализовать параметры каждого процесса и сделать единообразными параметры вызовов функции. Тогда для выдачи задания планировщику можно сделать таблицу в которой лежат указатели для вызовов функций пред- и пост-обработки результатов транзакции. Задача планировщика сводится к перебиранию по кольцу индекса этой таблицы и анализу флагов заданий. Расширять подобную таблицу не составляет никакого труда.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.