LINUX.ORG.RU

История изменений

Исправление Goganchic, (текущая версия) :

Итак, на новую либу переходить не стал, но разобрался с багами в текущем коде, теперь ответ приходит правильный. Если кому-то интересно, описываю какие были баги (достаточно глупые, на самом деле)

  • Почему иногда был фантомный байт - в некоторых командах я записываю и вычитываю 1 байт, при этом не было проверки того, что вычитался именно 1 байт. В результате: вычитывалось 0 байт и повторного чтения не происходило, а потом в следующем вызове я получал этот недочитанный байт.
  • Почему ATmega8A неверно отвечала на команду Programming Enable: во-первых см. предыдущий пункт, во-вторых - я неверно записывал данные в буфер отправки (байты шли по неправильному смещению и перекрывали друг друга) и в-третьих я записывал неправильные байты, т.е. был кривой макрос SET_BITS_0 (плохо адаптировал макрос из avrdude)

правильный макрос такой:

#define SET_BITS_0(x,pinbit,level) (((x) & ~(1 << (pinbit))) | ((level && 1) << (pinbit)))

в общем, как оказалось - всему виной кривые руки, библиотека непричем

теперь буду дальше разбираться почему неправильно работает avrdude 6.1, может даже зачиню его :)

Исходная версия Goganchic, :

Итак, на новую либу переходить не стал, но разобрался с багами в текущем коде, теперь ответ приходит правильный. Если кому-то интересно, описываю какие были бали (достаточно глупые, на самом деле)

  • Почему иногда был фантомный байт - в некоторых командах я записываю и вычитываю 1 байт, при этом не было проверки того, что вычитался именно 1 байт. В результате: вычитывалось 0 байт и повторного чтения не происходило, а потом в следующем вызове я получал этот недочитанный байт.
  • Почему ATmega8A неверно отвечала на команду Programming Enable: во-первых см. предыдущий пункт, во-вторых - я неверно записывал данные в буфер отправки (байты шли по неправильному смещению и перекрывали друг друга) и в-третьих я записывал неправильные байты, т.е. был кривой макрос SET_BITS_0 (плохо адаптировал макрос из avrdude)

правильный макрос такой:

#define SET_BITS_0(x,pinbit,level) (((x) & ~(1 << (pinbit))) | ((level && 1) << (pinbit)))

в общем, как оказалось - всему виной кривые руки, библиотека непричем

теперь буду дальше разбираться почему неправильно работает avrdude 6.1, может даже зачиню его :)