Перейти к содержанию
    

J-t

Участник
  • Постов

    10
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. USB CDC на PIC18F2550

    Ну есть же таймаут, по которому хост перестает откладывать перенос данных?
  2. USB CDC на PIC18F2550

    :) Замечание уместное. Бред эксперементальный, выложил только то, что претерпело изменение в микрочиповском примере. Все остальное не изменилось. Далее, с Вами соглашусь, на момент написания прошлого комментария не понимал процесса обмена, выходные потрачены не зря :) Я вот только прошу ответить на вопрос: если у USB устройства занят буфер и оно не готово принять данные от host, то на посыл токен OUT устройство отвечает NAK и данные теряются. Я правильно понял? А то что терминал повис, при получении NAK это уже особенности терминала?
  3. USB CDC на PIC18F2550

    Вот то что писал сам (в целях обучения): void ProcessIO(void) { //Blink the LEDs according to the USB device status // BlinkUSBStatus(); // User Application USB tasks mInitSwitch3(); if(sw3 == 0) { if(getsUSBUSART(USB_Out_Buffer, 8) == 5) { if (USB_Out_Buffer[0] == 'a') { if(USB_Out_Buffer[1] == 'a') { if(USB_Out_Buffer[2] == 'a') { if(USB_Out_Buffer[3] == 'a') { if(USB_Out_Buffer[4] == 'a') { if(mUSBUSARTIsTxTrfReady()) { putrsUSBUSART("A"); } } } } } } if (USB_Out_Buffer[0] == 'b') { if(USB_Out_Buffer[1] == 'b') { if(USB_Out_Buffer[2] == 'b') { if(USB_Out_Buffer[3] == 'b') { if(USB_Out_Buffer[4] == 'b') { if(mUSBUSARTIsTxTrfReady()) { putrsUSBUSART("B"); } } } } } } if (USB_Out_Buffer[0] == 'c') { if(USB_Out_Buffer[1] == 'c') { if(USB_Out_Buffer[2] == 'c') { if(USB_Out_Buffer[3] == 'c') { if(USB_Out_Buffer[4] == 'c') { if(mUSBUSARTIsTxTrfReady()) { putrsUSBUSART("C"); } } } } } } } } Мой код ничего не делает полезного, пока. кнопка нужна, что бы давать отмашку на чтение из буфера данных; три последовательности: ааааа, bbbbb, ccccc на каждую из них PIC отвечает A или B или C. Конечная цель всего этого - понять по какому алгоритму стоит действовать если пользовательская программа работает в цикле с другим контроллером или подключенным устройством (например: мерит температуру и показывает ее на дисплее) и в любой момент времени могут прийти данных от ПК по USB? Что будет если я не смогу их прочитать (нажать на кнопку, в программе выше) в виду выполнения более важных операций? Сделал бесконечный цикл в подпрограмме пользователя, ПК вовсе не увидел устройство, я так понял, что из за того, что не вызывается функция USBDeviceTasks(). Тогда ее нужно включить в цикл подпрограммы пользователя?
  4. USB CDC на PIC18F2550

    Наверное запутал и себя и всех присутствующих. Вообщем вот еще: строка #define USB_EP0_BUFF_SIZE 8 определяет количество байт зарезервированое под буфер конечной точки 0. Он используется и на прием и на передачу. Опыт с железом показал, что буфер заполняется за одну транзакцию (даже если буфер 8 байт, а принимаю 5 байт), если не прочитать его и не освободить, то следующая посылка просто игнорируется. Так почему если переданы первые 5 байт - заполнили буфер, вторый 5 байт проигнорированы, а на третьей посылке 5-ти байт зависает терминал?
  5. USB CDC на PIC18F2550

    За ссылку спасибо, прочитал. Оч полезная. Но все же у меня CDC устройство. Вот что не могу в толк взять: в коде программы в конфигурации USB есть строка: #define USB_EP0_BUFF_SIZE 8 // Valid Options: 8, 16, 32, or 64 bytes. Как я понимаю это количество байт которые могут приняться модулем за один "сеанс передачи". Если буфер переполнен, то ПК останавливает передачу (не получен ответ от микроконтроллера). В модуле USB двойная буферизация, есть четный буфер и нечетный. Так вот если ping-pong включен то первый принятый байт принимается в четный буфер, второй в нечетный и пока принимается второй первый должен быть обработан. А если ping-pong отключен, оба буфера имеют один и тот же адрес 0. Вот тут и загвоздка, первый принимается и по логике вещей буфер заполнен. Или я не так понимаю принцип работы. Прошу помочь, кто сталкивался.
  6. USB CDC на PIC18F2550

    Доброго времени суток. Прошу помочь, ответом на такой вопрос: Собрал схему USB CDC устройства на PIC18F2550, скачал родные исходники с microchip.com, подправил кое, что в функциях пользователя. Работает так: на PC с помощью терминала отправляю в появившийся виртуальный порт строку из 5 байт, по идее они сохраняются в буфере до их прочтения. Читаю принятую инф. после нажатия на кнопку на плате устройства, а на терминале получаю ответ от устройства. Так вот, пытливости ради, отправил дважды одну и ту же последовательность, нажал на кнопку, устройство ответило один раз на первую посылку. Отправил последовательность трижды... две отобразились на терминале как отправленные, третья не отобразилась в строке отосланных, терминал повис, нажал на кнопку устройства, в строке отосланных появился третья отправленная последовательность, устройство ответило на первое и третье. То что ответ приходит на первую и третью последовательность проверил сделав последовательности разными. Тут возник вопрос: куда девалась вторая последовательность? Если устройство удержало посылку только третей последовательности, значит вторую он принял... ??? Буфер сконфигурирован: no ping-pong.
  7. Доброго времени суток. Прошу помочь, ответом на такой вопрос: Собрал схему USB CDC устройства на PIC18F2550, скачал родные исходники с microchip.com, подправил кое, что в функциях пользователя. Работает так: на PC с помощью терминала отправляю в появившийся виртуальный порт строку из 5 байт, по идее они сохраняются в буфере до их прочтения. Читаю принятую инф после нажатия на кнопку и на терминале получаю ответ от устройства. Так вот, пытливости ради, отправил дважды одну и ту же последовательность, нажал на кнопку, устройство ответило один раз на первую посылку. Отправил последовательность трижды... две отобразились на терминале как отправленные, третья не отобразилась в строке отосланных, терминал повис, нажал на кнопку устройства, в строке отосланных появился третья отправленная последовательность, устройство ответило на первое и третье. То что ответ приходит на первую и третью последовательность проверил сделав последовательности разными. Тут возник вопрос: куда девалась вторая последовательность? Если устройство удержало посылку только третей последовательности, значит вторую он принял... ??? Буфер сконфигурирован: no ping-pong.
  8. Вы могли бы набросать блок схему такого устройства. Или схему приципиальную, если не затруднит. Мне не приходилось работать с usb, а другим способом не представляю как сконектить 32 микроконтроллера и комп. Ethernet не рентабельно. Если вернуться к схема с драйверами и мультиплексорами, какие подводные камни могут быть и на сколько она стабильна в работе. И еще как развязать команды к микроконтроллеру и команды опроса устройств если в компе только один сом порт?
  9. А DE и RE это управление мультиплексором, правильно понимаю? И еше одно: Драйвер 485 производит "преобразование" TTL/485 и наоборот, то есть что бы применить драйверы нужно с ПК преобразовать в TTL затем обратно. Не очень удобно. Первоначально задача: опрашивать 4100 устройств, передающие данные по 485. но так как адресное слово-8 бит, а сеть 485 до 128 (в среднем) устройств, то было предложено разбить на 32 подсети и коммутировать. Может еще какой вариант есть?
  10. Необходимость реализовать задачу: Есть 32 сети RS485, к которым подключено по 128 адресуемых устройств. Есть компьютер, который необходимо подключать последовательно к каждой сети и проводить опрос устройств. Есть идея сделать 33-ю сеть, состоящую из двух устройств: компьютер и микроконтроллер, компьютер формирует и передает команду на адрес контроллера о переключении к следующей сети, микроконтроллер подключает сеть 33 к одной из сети 1-32 и отправляет ответ компьютеру о выполнении, после компьютер опрашивает устройства этой сети и дает команду на подключение к следующей и так далее. Вопрос в том, чем коммутировать сети и как правильно ее построить. Прошу помочь.
×
×
  • Создать...