Захотелось мне общаться с МК (атмега16) по юсб. Под рукой оказалась микросхема под именем CH340G. Припаял по быстрому туда кварц, D+, D-, питание и виндовс ее увидел, в сисетме появился КОМ3. Решил пойти дальше - подключил МК (RX,TX), написал прошивку по чтению/записи из/в UART и программку на компе по отправке данных и приему из комп порта. И дальше какая то фигня затворилась.
В МК логика была задумана такая - при чтении байта этот байт отправляется в портB, куда подключены 8 светодиодов (к каждой ноге по одному) что бы увидеть что он получил. В ответ шлем 0. При нажатии на кнопку зажигаем еще одни светодиод и шлем единичку, при отпускании - тушим и шлем двойку. МК тактируется от кварца на 8 мегагерц. Скорость по уарту - 9600. Подключение примитивное, даже незнаю чего там описывать. Схема вот
Программа на компе еще примитивней. Отправляет в порт $01, $02, $04, $08, $00. Ну что бы разные светодиоды загорались. Ну и раз в полсекунды читаем есть что в порту или нет. Программа на дельфях. Октрываю порт как файл
Код:
Com1:=CreateFile(PChar('Com1'),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
пытаюсь настроить
Код:
SetCommState
выдают ошибку. Ладно, фих с вами, пусть по дефолту все. Пуржим. Пуржится.
А вот дальше начинается свистопляска. В диспетчере устройств устройство сидит плотно, не пропадает, все стабильно. Но вот работает оно фих знает как. Иногда при подключении начинают из ком порта литься данные. Ну по логике так ит должно быть, но оттуда льется 120 (десятичная) и шесть нулей. Когда я туда пытаюсь что то отправить, то светодиоды загораются, но как то "от балды", хотя всегда одинаково, но не в соответствии с тем что я посылаю.
а иногда вообще молчек, ничего не отправляется и не посылается, выдает ошибку записи в порт (ну не ошибку, а ничего не пишет).
В чем секрет? Кто работал с этим чудом китайской техники?
Не исключено. Просто я старался писать максимально просто. Приняли байт - в порт его. Отправляются они тоже просто. Завтра проверю еще разок, если не найду ничего - выложу на всеобщее обозрение...
а эта микросхема да, много где используеться, весь интернет в ссылках на программатор, диагностический модуль для авто и андурину. А как работать саму с ней - две ссылки только и то, там без МК, поверхностно как то Даташит на китайском нашел. Много думал Программу нашел тоже на китайском, кнопок больше чем иероглифов в их алфавите. Так и не понял как с ней работать
Нашел одну ошибку ( судя по всему не последнюю). Не подключил конденсатор на V3. Поставил. Ситуация изменилась незначительно. Вернее вообще не изменилась, разве что только более уверенно она включается и работает, но смысл не изменился - принимает непонятно что, отправляет непонятно что, теже же самые 120D и нули Про представление аски и байтов я тоже думал, но там вообще никак не получается. Более того, я когда отправляю байт туда, который должен отправиться на портВ, то в порту все время принимается 0xFE. Если отправляю единицу (0x01) то приниматься 0xFF. Все остальное (0x02, 0x04, 0x08, 0x00) - на порту - 0xFE. Обратно тоже фигня какая то.
Заметил тут другое - я когда конденсатор то припаял, то функция установки параметров ком порта (SetCommState) стала проходить без ошибок. но все данные - принятые и переданные - нули. Неважно что отправляю на МК или с МК - принимаются нули. Решил посмотреть какие параметры в порту по умолчанию (GetCommState) - а там оказывается скорость 1200, стоп битов нет, битов 7. И при этом мусор шлеться. В свойствах ком порта все как надо - 9600, стоп бит, 8 бит. На каких скоростях то она вообще работать должна?
Тут меня осенило еще - надо на ней Rx и Tx перемкнуть и посмотреть че там будет отправляться и приниматься.
Вообщем пообедаю сейчас и займусь. А вечерком кину исходники свои.
Нашел ошибку. Подключил напрямую линии rx tx у ch340g и у мк - сами с собой они прекрасно общались. Полез копать прошивку МК. Оказалась ошибка в инициализации уарта. Модуль работы с уарта я брал из готового проекта, где он пошел в серию и прекрасно все работает. Там правда не совсем уарт был, а rs-485, но я подумал что это все фигня. А в модуле этом был включен асинхронный режим. После отключения этого режима все полетело.
А в модуле этом был включен асинхронный режим. После отключения этого режима все полетело.
Э-э-э, а вот с этого момента можно поподробнее? Асинхронный режим - это как раз нормальный, основной режим, используемый в 99% случаев. Режим с тактированием - это экзотика для U(S)ART'а.
Может быть там был включен не асинхронный режим, а режим удвоенной скорости (бит U2Xn)?
_________________ Разница между теорией и практикой на практике гораздо больше, чем в теории.
Не имеет смысла. Как ноль ни сдвигай, он нулем и останется...
Устанавливают бит № X так:
Код:
y|=(1<<X);
сбрасывают так:
Код:
y&=~(1<<X);
Это если мы не хотим трогать остальные биты. Если же мы просто инициализируем значение регистра присваиванием, то имеет смысл только установить нужные биты. Во всех остальных автоматически окажутся нули.
Далее, в приведенном изначальном коде при записи в UCSRC не учитывается бит URSEL. За счет этого портился UBRRH, и ничего не работало, т.к. сбивалась настройка скорости.
_________________ Разница между теорией и практикой на практике гораздо больше, чем в теории.
да это понятно. просто если потом понадобиться установить единичку, то берем и меняем ноль на единичку, а не дописываем новое выражения сдвига и не ищем названия регистра
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения