реклама на сайте
подробности

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


Частый гость
**

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



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

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

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

Для этих четырех пакетов, (их вид фиксирован), я написал, но получилось громоздко и коряво, с кучей проверок флагов, хотя работоспособно.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
artur_off
сообщение Nov 21 2010, 21:35
Сообщение #2


Частый гость
**

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



Если я вас правильно понял, то копать вам надо в сторону FIFO.

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


--------------------
 Big time. 
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 21 2010, 21:53
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Задача доступа разных источников данных к одному каналу передачи данных. Решать можно несколькими способами. Но вначале нужно определиться с приоритетами. Т.е. ответить на вопрос: источники данных имеют равный приоритет или разный? Если приоритет одинаковый, то пишете планировщик который опрашивает по кольцу флаги постановки задач от разных источников данных, вызывает функцию подготовки данных, запускает в прерывании транзакцию по каналу связи и потом запускает функцию обработки принятых данных. Все это делается на базе КА (Конечные Автоматы). Если вы сможете формализовать и привести к единому виду вызовы всех функций подготовки и обработки данных для всех источников, то планировщик получается достаточно простой и расширяемый.
Go to the top of the page
 
+Quote Post
Hmm
сообщение Nov 21 2010, 22:49
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 329
Регистрация: 22-06-04
Пользователь №: 124



А какая точность периодов опроса? Если допустимое отклонение больше, чем время обработки 1-го источника с максимальной длительностью (что вероятнее всего), то что тут "мудрить"?


--------------------
Талант не пропить ...
Go to the top of the page
 
+Quote Post
Glupen'
сообщение Nov 22 2010, 03:49
Сообщение #5


Частый гость
**

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



Цитата(artur_off @ Nov 22 2010, 00:35) *
Если я вас правильно понял, то копать вам надо в сторону FIFO.

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

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


Приоритетности нет, есть один контроллер (master), который опрашивает устройства на шине (slave), каждое - по своему графику. Аварийных сообщений от устройств нет. Мне нужно, чтоб пакеты не накладывались друг на друга. У меня почти так и сделано, как вы предложили, но получилось коряво. И при добавлении нового устройства, надо много чего дописывать...
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Nov 22 2010, 05:55
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 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 вы успеете часы прочитать и температуру и даже поспать.
Читайте всё подряд начиная с часов. А вот выводить это как угодно


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 22 2010, 08:46
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 18:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016