|
Есть ли какой-нибудь универсальный алгоритм работы по TWI (I2C)? |
|
|
|
Nov 21 2010, 20:40
|

Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 23-05-07
Пользователь №: 27 918

|
Задача такова: на шине TWI меги16 висят часы DS1307 и термометр DS1621. 1)Чтение времени из часов идет постоянно - раз в 1секунду, 2)запись-установка времени - по моему желанию. 3)Команда "измерить Т" дается 1 раз в 10 секунд, 4)чтение температуры - 1 раз в 10секунд. Эти четыре пакета, могут накладываться по времени. Как бы правильно организовать "ОЧЕРЕДЬ" пакетов с какими-нибудь указателями/буферами в области памяти, где лежат передаваемые данные и куда складывать принимаемые. Чтоб контроллер сформировал очередной пакет, поставил в "очередь" и... а дальше два варианта: - забыл о пакете, а потом использовал данные из памяти, которые "автоматически" обновились во время приема, - прочитав какой-нибудь "статус", увидел, что пакет обработан или нет.
работа с шиной TWI должна быть в прерывании по "TWI завершение очередного действия", чтоб не останавливать работу.
Хорошо бы, чтоб алгоритм был расширяем на много устройств, был универсальным.
Для этих четырех пакетов, (их вид фиксирован), я написал, но получилось громоздко и коряво, с кучей проверок флагов, хотя работоспособно.
|
|
|
|
|
 |
Ответов
(1 - 6)
|
Nov 21 2010, 21:35
|

Частый гость
 
Группа: Свой
Сообщений: 118
Регистрация: 24-05-08
Из: Odessa
Пользователь №: 37 784

|
Если я вас правильно понял, то копать вам надо в сторону FIFO. http://electronix.ru/forum/index.php?s=&am...st&p=115828В этом посте есть очень хорошо документированный пример для UART, думаю вам не составит труда его портировать под I2C.
--------------------
Big time.
|
|
|
|
|
Nov 22 2010, 03:49
|

Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 23-05-07
Пользователь №: 27 918

|
Цитата(artur_off @ Nov 22 2010, 00:35)  Если я вас правильно понял, то копать вам надо в сторону FIFO. По сути да, я только слово FIFO вспомнить не мог. за ссылку спасибо, проштудирую примерчик Цитата(rezident @ Nov 22 2010, 00:53)  Задача доступа разных источников данных к одному каналу передачи данных. Решать можно несколькими способами. Но вначале нужно определиться с приоритетами. Т.е. ответить на вопрос: источники данных имеют равный приоритет или разный? Если приоритет одинаковый, то пишете планировщик который опрашивает по кольцу флаги постановки задач от разных источников данных, вызывает функцию подготовки данных, запускает в прерывании транзакцию по каналу связи и потом запускает функцию обработки принятых данных. Все это делается на базе КА (Конечные Автоматы). Если вы сможете формализовать и привести к единому виду вызовы всех функций подготовки и обработки данных для всех источников, то планировщик получается достаточно простой и расширяемый. Приоритетности нет, есть один контроллер (master), который опрашивает устройства на шине (slave), каждое - по своему графику. Аварийных сообщений от устройств нет. Мне нужно, чтоб пакеты не накладывались друг на друга. У меня почти так и сделано, как вы предложили, но получилось коряво. И при добавлении нового устройства, надо много чего дописывать...
|
|
|
|
|
Nov 22 2010, 05:55
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(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 вы успеете часы прочитать и температуру и даже поспать. Читайте всё подряд начиная с часов. А вот выводить это как угодно
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Nov 22 2010, 08:46
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Glupen' @ Nov 22 2010, 08:49)  Приоритетности нет, есть один контроллер (master), который опрашивает устройства на шине (slave), каждое - по своему графику. Аварийных сообщений от устройств нет. Мне нужно, чтоб пакеты не накладывались друг на друга. Я имел в виду приоритеты процессов, а не контроллеров на шине. Например, при совпадении времени задания "считать RTC" и "измерить температуру" какой процесс приоритетнее? По-моему мнению приоритеты у них равные, т.к. значение RTC не изменится в течение следующих 1000мс да и температура в течение этого времени навряд ли изменится в пределах измеряемой точности. Цитата(Glupen' @ Nov 22 2010, 08:49)  У меня почти так и сделано, как вы предложили, но получилось коряво. И при добавлении нового устройства, надо много чего дописывать... Я предложил вам формализовать параметры каждого процесса и сделать единообразными параметры вызовов функции. Тогда для выдачи задания планировщику можно сделать таблицу в которой лежат указатели для вызовов функций пред- и пост-обработки результатов транзакции. Задача планировщика сводится к перебиранию по кольцу индекса этой таблицы и анализу флагов заданий. Расширять подобную таблицу не составляет никакого труда.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|