История изменений
Исправление 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, может даже зачиню его :)