PIC10F222 + Soft UART

Наконец то я осилил программный UART на PIC10F222!
Работает на 1200 бод при цастоте микроконтроллера 8МГц, не принимает быстрый поток, но посимвольно с малюсенькой задержкой (для явно выраженных start и stop битов) работает отлично.

Схема:


Исходник
  • +1
  • 12 июля 2011, 02:09
  • zaman
  • 1
Файлы в топике: Servo_10F.zip

Комментарии (16)

RSS свернуть / развернуть
Прикольно :) Я софтовый i2c слейв на тини13 делал, тоже веселое занятие было :)
0
не принимает быстрый поток, но посимвольно с малюсенькой задержкой (для явно выраженных start и stop битов) работает отлично.
Были похожие симптомы (с другим мк), подобрал более точно временные интервалы и проблема исчезла.
0
Контроллер просто слабенький и не успевает принять следущий старт-бит идущий за последним стопом, и получается что первый символ проходит нормально а остальное не очень

думаю это еще и потому что идет отправка сразу после приема (что и теряет кучу времени) если принимать в буфер то думаю такого не будет
0
Контроллер просто слабенький и не успевает принять следущий старт-бит идущий за последним стопом, и получается что первый символ проходит нормально а остальное не очень
С тактовой частотой 8МГц, контроллер легко потянет 19200 бод, не говоря уж про 1200 бод
0
Товарищи, подскажите пожалуйста, как рассчитать задержку старт-бита и задержку битов-данных?
0
Имеется в виду, как рассчитать задержки, зная скорость в бодах.
И еще вопрос: в Visual C++, как лучше организовать задержку в мкС?
Мне в итоге нужен программный UART для Windows.
0
А ты уверен, что винда сможет генерить маленькие задержки (<1ms) с большой точностью? ИМХО, ниче не получится.

Время передачи 1 бита = 1/бодрейт
0
Меня в принципе устроит вообще любая скорость, хоть 10 бод! Вообще по идее может, ведь можно подсчитать число тактов процессора (хотя опять может быть фейл, ибо семерка сама рулит частотой CPU).
Вопрос по расчету задержек не отпал :)
0
Дико интересно — зачем и какими ножками ты собрался дрыгать из винды? :)
0
А в этом вся соль ;) Ну ладно, вот: bsvi.ru/klassnyj-sposob-proshivki-ustrojstv/
Хочу подрыгать монитором!
0
А чо, прикольно :)
Если надо перегнать пару байт в устройство, то очень удобный способ.

Интересно, какой максимальной скорости передачи данных можно добиться?

Алсо, я-бы сделал свой протокол. Все-равно быстро мигать монитором не получится, а чтобы сделать 10 бод на UART в AVR надо работать на очень низкой тактовой частоте.

Пойду запилю эксперимент :)
0
На AVR можно и программный UART сделать в принципе. Я вот хотел со светодиодом попробовать — не получилось :(
UART мне кажется более/менее подходящим для такого дела.
0
Как вариант, кстати, можно использовать выход звуковухи для передачи данных.

Хоть это и не так удобно, как с монитором, но зато скорость выше.
0
Я звуковухой управлял синхронным двигателем, причем с успехом :) Но не звуком конечно, а сигналом.
0
Частоту CPU мона и неоднократно семплировать. Либо сперва погонять цикл вхолостую, чтобы частота успела увеличиться. Причем это фишка не только семерки, на ноутах такое давным давно. Да и на десктопах тоже, правда через драйверы вроде Cool&Quiet. Собсна, именно с ними я и столкнулся с прелестным явлением работающих в 2-3 раза быстрее игр (они калибровали RDTSC таймер при старте, пока проц еще работал на 800МГц, затем почуяв работу проц разгонялся до 2ГГц и все тайминги дружно уплывали).

Но основная проблема ножкодрыга под виндой не в этом, а в том, что винда ОС не реалтаймовая и спокойно может отправить процесс в спячку на сотню-другую мс прямо посреди передачи.

И еще вопрос: в Visual C++, как лучше организовать задержку в мкС?
Точную? Только тупить в цикле, проверяя RDTSC или QueryPerformanceCounter. Второй менее подвержен сбоям из-за изменения частоты проца.
0
  • avatar
  • Vga
  • 03 сентября 2011, 21:28
Я вот уже что-то передумал делать задержку в микросекундах, плохо получится чую.
И все-таки: если сделать задержку на старт-бит 35мс, а на биты-данных 40мс, я получу скорость 192 бода? Или как?
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.