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

 
 
7 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> 3 ATMega8 к 1 COM-порту ПК
li4
сообщение Jan 5 2007, 20:45
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 11-06-06
Пользователь №: 17 980



Подскажите пожалуйста как решить такую задачу. Есть 3 ATMega8 каждый из которых используется как 3-х канальный АЦП. Мне нужно их все подключить к одному COM-порту компьютера, причем нужно чтобы передача данных происходила без потерь. Ведь пока 1 контроллер передает данные в ПК, остальные тоже работают, а данные передавать не могут, потому что линия занята.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 5 2007, 21:34
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(li4 @ Jan 5 2007, 19:45) *
Подскажите пожалуйста как решить такую задачу. Есть 3 ATMega8 каждый из которых используется как 3-х канальный АЦП. Мне нужно их все подключить к одному COM-порту компьютера, причем нужно чтобы передача данных происходила без потерь. Ведь пока 1 контроллер передает данные в ПК, остальные тоже работают, а данные передавать не могут, потому что линия занята.
Поставить четвертый ATMega8, который будет через три софтовых UART общаться с этими, а через аппаратный на вчетверо большей скорости общаться с PC. Ну и естественно в протоколе с РС должна быть реализована поддержка мультиплексирования потока данных.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Dopler
сообщение Jan 5 2007, 21:35
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



Цитата(li4 @ Jan 5 2007, 20:45) *
Подскажите пожалуйста как решить такую задачу. Есть 3 ATMega8 каждый из которых используется как 3-х канальный АЦП. Мне нужно их все подключить к одному COM-порту компьютера, причем нужно чтобы передача данных происходила без потерь. Ведь пока 1 контроллер передает данные в ПК, остальные тоже работают, а данные передавать не могут, потому что линия занята.


Это реализуется довольно просто, все зависит от объемов данных.
Вот самый примитивный вариант:

1. В каждой меге буффер данных, например, 1024 байт
2. Каждая мега знает свой адрес (номер) на шине, например, 1, 2, 3.
3. Инициатором обмена всегда выступает ПК.
4. ПК шлет адрес меги, а та в свою очередь выдает данные и переводит линии в третье состояние.
5. Так опрашиваются все меги по очереди.

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

Можно почитать пункт Multi-processor Communication Mode в разделе описания UART в даташите, там Atmel дает некоторые рекомендации.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 5 2007, 21:54
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Dopler @ Jan 5 2007, 21:35) *
...

Идея правильная

Только вот здесь небольшая проблемка:
Цитата
4. ПК шлет адрес меги, а та в свою очередь выдает данные и переводит линии в третье состояние.

Толку переводить линии в третье состояние? Чтобы больше никогда не словить обращение Хоста?..
Тут нужно добавить внешний мультиплексор, завести на его входы Tx от каждого МК, выход мультиплексора подключить к входу RS232 преобразователя. Rx'ы всех МК соединить параллельно и подключить к выходу RS232 преобразователя.
Go to the top of the page
 
+Quote Post
vvs157
сообщение Jan 5 2007, 22:01
Сообщение #5


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

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(defunct @ Jan 5 2007, 21:54) *
Толку переводить линии в третье состояние? Чтобы больше никогда не словить обращение Хоста?..


В 3-е сотояние должны переводиться выходы Мег, а не компьютера
Go to the top of the page
 
+Quote Post
Dopler
сообщение Jan 5 2007, 22:30
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



Цитата(defunct @ Jan 5 2007, 21:54) *
Цитата(Dopler @ Jan 5 2007, 21:35) *

...

Идея правильная

Только вот здесь небольшая проблемка:
Цитата
4. ПК шлет адрес меги, а та в свою очередь выдает данные и переводит линии в третье состояние.

Толку переводить линии в третье состояние? Чтобы больше никогда не словить обращение Хоста?..
Тут нужно добавить внешний мультиплексор, завести на его входы Tx от каждого МК, выход мультиплексора подключить к входу RS232 преобразователя. Rx'ы всех МК соединить параллельно и подключить к выходу RS232 преобразователя.


Да ну, зачем такие сложности.

Линии TX от ПК соединяются в одну и подключаются к линиям RX меги (без мультиплексоров), так как линии RX у меги входные. Линии TX от мег соединяются в одну и подключаются к RX ПК. В неактивном состоянии (в режиме, когда ПК выбрал другую мегу) мега переводит свою линию TX в третье состояние (как только заканчивает передачу данных), а когда получает свой адрес по линии RX (которая всегда активна), берет контроль над своей линией TX. Таким образом, в сети будет активна только одна мега, и их можно подключать до бесконечности.
Стоит помнить, что в UART неактивный уровень - лог. единица, поэтому линия TX мег должна быть подтянута к плюсу.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 5 2007, 22:40
Сообщение #7


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Dopler @ Jan 5 2007, 22:30) *
Линии TX от ПК соединяются в одну и подключаются к линиям RX меги (без мультиплексоров), так как линии RX у меги входные.

Tx-линия у ПК одна..
Так что здесь вы повторяете то, что было сказано в моем посте.

Цитата
Линии TX от мег соединяются в одну и подключаются к RX ПК. В неактивном состоянии (в режиме, когда ПК выбрал другую мегу) мега переводит свою линию TX в третье состояние

Здесь поподробнее.
Как можно перевести Tx линию аппаратного UART'a в Z состояние, не отключив при этом RX?
Go to the top of the page
 
+Quote Post
Dopler
сообщение Jan 5 2007, 23:01
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



Цитата
Цитата
Линии TX от мег соединяются в одну и подключаются к RX ПК. В неактивном состоянии (в режиме, когда ПК выбрал другую мегу) мега переводит свою линию TX в третье состояние

Здесь поподробнее.
Как можно перевести Tx линию аппаратного UART'a в Z состояние, не отключив при этом RX?



Да очень просто, в аппаратном UART приемник и передатчик разрешаются отдельно (размыми битами). Уроды в Atmele решили, что копирование из даташитов может повредить, поэтому не могу привести выдержку. Посмотрите описание битов RXEN и TXEN, каждый из них оказывает независимое влияние на соответствующие линии МК.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 5 2007, 23:11
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Dopler @ Jan 5 2007, 23:01) *
Посмотрите описание битов RXEN и TXEN, каждый из них оказывает независимое влияние на соответствующие линии МК.

Точно!
Что-то сегодня меня совсем переклинило. huh.gif

Ну тогда нет проблем smile.gif
Go to the top of the page
 
+Quote Post
Dopler
сообщение Jan 5 2007, 23:18
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



Цитата(defunct @ Jan 5 2007, 23:11) *
Цитата(Dopler @ Jan 5 2007, 23:01) *

Посмотрите описание битов RXEN и TXEN, каждый из них оказывает независимое влияние на соответствующие линии МК.

Точно!
Что-то сегодня меня совсем переклинило. huh.gif

Ну тогда нет проблем smile.gif


Проблемы возникают, когда необходимо передавать данные через дифференциальные пары (LVDS и тому подобное), вот там приходится городить монтажное или.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jan 5 2007, 23:41
Сообщение #11


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



А можно я тут несколько в сторону отойду. У меня похожий вопрос. Но только мне надоне собирать с нескольких источников, а передавать в несколько приемников. А именно:
Есть MSP430, у него 2 USART (UART или SPI или I2C). И есть 3 или 4 внешних устройства, с которыми контроллер должен общаться - комп по UART, zigbee приемопередатчик по SPI, LCD по I2C, и внешняя флешь по... еще не разбирался, но наверно тоже по SPI. И что делать ohmy.gif
Внешний мультиплексор не особо хочется ставить, надо низкое потребление.
Но, вообще говоря, не будет такой ситуации, когда все эти 4 устройства будут работать одновременно, все эти процессы можно разделить по времени. Как в такиз случаях поступают??
Спасибо
Go to the top of the page
 
+Quote Post
Serj78
сообщение Jan 5 2007, 23:46
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



Подтверждаю, можно отдельно включать и приемник и передатчик. У меня через uart объединены 4 контроллера,один из них мастер- обменивается с другими тремя. Все выходы, правда подключены через резисторы 680 ом, но это просто в целях безопасности портов smile.gif.

2 jorikdima - можно завести на некоторые устройства ножки разрешения работы.у spi оно точно есть, на другие можно попробовать организовать программно. у меня например на одном устройстве из 3-х нет времени ждать пока пройдет адрес- нужен мнгновенный ответ- там соответственно есть ножка отдельная- синхронизация обмена.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 6 2007, 07:05
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Dopler @ Jan 5 2007, 23:30) *
Да ну, зачем такие сложности.
Линии TX от мег соединяются в одну и подключаются к RX ПК. В неактивном состоянии (в режиме, когда ПК выбрал другую мегу) мега переводит свою линию TX в третье состояние (как только заканчивает передачу данных), а когда получает свой адрес по линии RX (которая всегда активна), берет контроль над своей линией TX. Таким образом, в сети будет активна только одна мега, и их можно подключать до бесконечности.

Действительно, зачем такие сложности? smile.gif
Цена вопроса - три диода и резистор без всяких изысков программирования.
Схема называется "монтажное ИЛИ" и приводится в книжках по цифровой электронике уже 40 лет

Но я не понял одного - разве есть компьютеры с TTL выходом последовательного интерфейса. Автор, Вы в курсе про RS232 уровни и TTL уровни?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
li4
сообщение Jan 6 2007, 09:15
Сообщение #14


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 11-06-06
Пользователь №: 17 980



Спасибо всем ответившим.
Цитата
Линии TX от мег соединяются в одну и подключаются к RX ПК.

Если это допустимо то проще уж наверное ничего не придумать. Значит для счастья нужна лишь программа МК которая будет:
1)TX всех МК перевести в Z состояние
2)Считывать данные из RX порта.
3)Если запрос на считывание не пришел записывать результат оцифорвки в буферную память
4)Если пришел запрос на считывание выдавать в TX все что накопилось в буфере, и текущий результат оцифорвки

Я в программировании для МК не очень силен, поэтому мне бы на AVR C такую программу или хотябы ее часть посмотреть как делается, был бы очень вам признателен.

Сообщение отредактировал li4 - Jan 6 2007, 09:16
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 6 2007, 11:20
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(jorikdima @ Jan 5 2007, 22:41) *
Внешний мультиплексор не особо хочется ставить, надо низкое потребление.
Но, вообще говоря, не будет такой ситуации, когда все эти 4 устройства будут работать одновременно, все эти процессы можно разделить по времени. Как в такиз случаях поступают??
Раз не требуется одновременная работа - то все просто. У MSP430 SPI, UART и I2C(если не изменяет память) выведены на разные ноги, поэтому просто включай нужную периферию через ME1, ME2 и выбирай нужную ногу через PxSEL. Часть интерфейсов можно реализовать программно (например I2C для индикатора).

P.S. продолжать лучше в разделе про MSP


Цитата(li4 @ Jan 6 2007, 08:15) *
Спасибо всем ответившим.
Цитата
Линии TX от мег соединяются в одну и подключаются к RX ПК.

Если это допустимо то проще уж наверное ничего не придумать.
Если эти 3 меги находятся на одной плате - тогда действительно это наиболее простое решение. А вот если между ними значительное расстояние, то тянуть TTL уровни уже нельзя а RS232 объединение не позволяет. Я чего-то подумал что есть три законченных устройства, каждое из которых общается с компом, и надо их свести вместе.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


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


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