|
|
  |
3 ATMega8 к 1 COM-порту ПК |
|
|
|
Jan 5 2007, 20:45
|
Участник

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

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

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jan 5 2007, 21:35
|
Местный
  
Группа: Свой
Сообщений: 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 дает некоторые рекомендации.
|
|
|
|
|
Jan 5 2007, 21:54
|

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

|
Цитата(Dopler @ Jan 5 2007, 21:35)  ... Идея правильная Только вот здесь небольшая проблемка: Цитата 4. ПК шлет адрес меги, а та в свою очередь выдает данные и переводит линии в третье состояние. Толку переводить линии в третье состояние? Чтобы больше никогда не словить обращение Хоста?.. Тут нужно добавить внешний мультиплексор, завести на его входы Tx от каждого МК, выход мультиплексора подключить к входу RS232 преобразователя. Rx'ы всех МК соединить параллельно и подключить к выходу RS232 преобразователя.
|
|
|
|
|
Jan 5 2007, 22:30
|
Местный
  
Группа: Свой
Сообщений: 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 мег должна быть подтянута к плюсу.
|
|
|
|
|
Jan 5 2007, 22:40
|

кекс
     
Группа: Свой
Сообщений: 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?
|
|
|
|
|
Jan 5 2007, 23:01
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Цитата Цитата Линии TX от мег соединяются в одну и подключаются к RX ПК. В неактивном состоянии (в режиме, когда ПК выбрал другую мегу) мега переводит свою линию TX в третье состояние Здесь поподробнее. Как можно перевести Tx линию аппаратного UART'a в Z состояние, не отключив при этом RX? Да очень просто, в аппаратном UART приемник и передатчик разрешаются отдельно (размыми битами). Уроды в Atmele решили, что копирование из даташитов может повредить, поэтому не могу привести выдержку. Посмотрите описание битов RXEN и TXEN, каждый из них оказывает независимое влияние на соответствующие линии МК.
|
|
|
|
|
Jan 5 2007, 23:18
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Цитата(defunct @ Jan 5 2007, 23:11)  Цитата(Dopler @ Jan 5 2007, 23:01)  Посмотрите описание битов RXEN и TXEN, каждый из них оказывает независимое влияние на соответствующие линии МК.
Точно! Что-то сегодня меня совсем переклинило. Ну тогда нет проблем  Проблемы возникают, когда необходимо передавать данные через дифференциальные пары (LVDS и тому подобное), вот там приходится городить монтажное или.
|
|
|
|
|
Jan 5 2007, 23:41
|

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

|
А можно я тут несколько в сторону отойду. У меня похожий вопрос. Но только мне надоне собирать с нескольких источников, а передавать в несколько приемников. А именно: Есть MSP430, у него 2 USART (UART или SPI или I2C). И есть 3 или 4 внешних устройства, с которыми контроллер должен общаться - комп по UART, zigbee приемопередатчик по SPI, LCD по I2C, и внешняя флешь по... еще не разбирался, но наверно тоже по SPI. И что делать Внешний мультиплексор не особо хочется ставить, надо низкое потребление. Но, вообще говоря, не будет такой ситуации, когда все эти 4 устройства будут работать одновременно, все эти процессы можно разделить по времени. Как в такиз случаях поступают?? Спасибо
|
|
|
|
|
Jan 6 2007, 07:05
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Dopler @ Jan 5 2007, 23:30)  Да ну, зачем такие сложности. Линии TX от мег соединяются в одну и подключаются к RX ПК. В неактивном состоянии (в режиме, когда ПК выбрал другую мегу) мега переводит свою линию TX в третье состояние (как только заканчивает передачу данных), а когда получает свой адрес по линии RX (которая всегда активна), берет контроль над своей линией TX. Таким образом, в сети будет активна только одна мега, и их можно подключать до бесконечности. Действительно, зачем такие сложности? Цена вопроса - три диода и резистор без всяких изысков программирования. Схема называется "монтажное ИЛИ" и приводится в книжках по цифровой электронике уже 40 лет Но я не понял одного - разве есть компьютеры с TTL выходом последовательного интерфейса. Автор, Вы в курсе про RS232 уровни и TTL уровни?
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jan 6 2007, 09:15
|
Участник

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

|
Спасибо всем ответившим. Цитата Линии TX от мег соединяются в одну и подключаются к RX ПК. Если это допустимо то проще уж наверное ничего не придумать. Значит для счастья нужна лишь программа МК которая будет: 1)TX всех МК перевести в Z состояние 2)Считывать данные из RX порта. 3)Если запрос на считывание не пришел записывать результат оцифорвки в буферную память 4)Если пришел запрос на считывание выдавать в TX все что накопилось в буфере, и текущий результат оцифорвки Я в программировании для МК не очень силен, поэтому мне бы на AVR C такую программу или хотябы ее часть посмотреть как делается, был бы очень вам признателен.
Сообщение отредактировал li4 - Jan 6 2007, 09:16
|
|
|
|
|
Jan 6 2007, 11:20
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|