Поскольку мнения разделились - отвечу еще и я :-)
Цитата
1) Зачем в некоторых схемах ставят подтягивающий резистор 1 МОм на питание и D+?
Для устройств с собственным питанием (self-powered) это предотвращает от ловли помех и, как следствие, моргания Int0. При отсутствии сигнала на шине (при отключенном устройстве) можно получить зацикливание драйвера.
Подтянуть его pull-up'ом нельзя. Наличие резистора от D+/D- используется контроллером USB хоста для определения типа USB устройства (low-speed/full speed/disconnected). Наличие pull-up может помешать этому. Начиная с IAR-версии драйвера, введены макро usbDeviceConnect/Disconnect. Имеется в виду, что 1.5 килоома pullup можно включать не на VBUS, а на порт. И тогда подачей туда 1 или переключением в Z состояние можно управлять подключением и отключением устройства по желанию. Предположительно, это должно работать только для 5-вольтового питания, так как цеплять надо на 5 вольт (VBUS), а не на 3.3.
Понимаю желание "по быстрому" дешево и сердито сваять USB девайс. Но иногда полезно почитать спецификации, там многое можно почерпнуть.
Цитата
2) Какой разброс могут иметь последовательные резисторы по D+, D- (68-200 Ом или как)? Они должны быть одинаковыми по сопротивлению или могут быть разными?
Это согласование с шиной. Можно выкинуть при коротком USB шнуре. Про это тоже написано в комментариях, как верно было подмечено. Да и на длинном можно выкинуть, на самом-то деле, для наших скоростей. Но тогда стабилитроны тоже ставить нельзя при 5 вольт питании.
А какой смысл делать разные резисторы?
Цитата
3) При питании 3,5 В ставят ATmega8L и кварц 12 МГц. Это расчет на технологический запас?
Да, в серию ставить не следует.
Цитата
4) В некоторых схемах сигнал INT0 соединяется еще с одной линией контроллера. В некоторых схемах обходятся одним INT0. С программной точки зрения что лучше (быстрее)?
Ответ на этот вопрос я косвенно уже писал на этом форуме.
С программной точки зрения нет никакой разницы. Разница с точки зрения аппаратной. Нам нужен Int0, и нужна нулевая линия порта (принципиально). Хорошо вешать это на один порт и экономить пин. Но на порту с Int0 нулевой бит - это RxD. Потому его стараются не занимать.
Если RxD не нужен, то можно использовать его для D-, и бит2 (Int0) - для D+.
Никаких аналоговых компараторов при анализе сигнала не используется. Более того, использован только один бит вместо проверки противофазных сигналов. Сделать "по правильному" программно невозможно. Но для low-speed устройств это не очень критично. Тем более, что CRC пакетов на приеме тоже не считается

- надо использовать проверку правильности пакетов на уровне приложения. И это описано в комментариях.
Цитата
5) При питании 5 В в HID_Keys линии D+, D- почему-то не шунтируют стабилитронами 3,3 В (или у них и так работает)?
Вся эта схема в той или иной степени нарушает стандарты USB. В какой - частично документировано. На шине D+/D- должны быть сигналы в 3.3 вольта. Со стороны хоста это, как считается, выдерживается (иначе при трехвольтовом питании на пинах AVR будет больше, чем его питание - опасно для контроллера). Со стороны AVR это выдерживается при питании 3.3 вольта. Стабилитроны с резисторами (это второе назначение последних) обеспечивают ограничение выходных уровней со стороны AVR при 5-вольтовом питании последнего.
С другой стороны, стандарт USB оговаривает, что и хост, и устройства обязаны выдерживать любое замыкание чего угодно на что угодно - на плюс 5, на землю, между собой, и т.п. Потому хост обязан выдержать и 5 вольт, что и использовано в HID_Keys. Правда, большинство дешевых материнок не содержат защиты от коротыша по питанию в USB устройстве. Так что тут еще вопрос, какое отклонение от стандарта более "неправильно".