Все 3 "sleep" не выполняются, выяснил это тем что питание отключается только на то время что сформировано таймером.
Задержки на слипах только на "большие" интервалы времени для экономии батарейки, а так как отрезки фиксированные,
то недостающее (до алгоритма) добираю таймером.
Знал бы я asm достаточно то на нем бы и накатал) Но дело в том что я знаю только те инструкции которые описаны в ДШ.
Не знаю как память размечать, как инклюдить внешние файлы, ну короче не уметь)
Вызовы вроде как тоже тратят время))))
Прерываний нет вообще, по крайней мере нету ухода на вектор, только анализ флагов.
Да функции сам писал, и не функции а дефайны. Работает все отлично, в дизассемблере именно то что задумано)
Собственно дефайны:
Спойлер
Код:
#define asm_BSF(adr, bit) asm("BSF " #adr "," #bit) //__Устанавливает указанный бит по адресу.
#define asm_BCF(adr, bit) asm("BCF " #adr "," #bit) //__Сбрасывает указанный бит по адресу.
#define asm_MARK(mark) asm(" " #mark) //__Устанавливает метку строки.
/*
Проверяет установлен ли бит по указанному адресу.
adr - адрес регистра или переменной.
bit - номер бита.
mark - метка строки для команды GOTO в процессе сравнения. Необходима
метка строки, установить ее можно макрасом asm_MARK.
*/
#define asm_BTFSS(mark, adr, bit) asm("BTFSS " #adr "," #bit); \
asm("GOTO " #mark)
/*
Проверяет установлен ли бит по указанному адресу.
adr - адрес регистра или переменной.
bit - номер бита.
mark - метка строки для команды GOTO в процессе сравнения. Необходима
метка строки, установить ее можно макрасом asm_MARK.
*/
#define asm_BTFSC(mark, adr, bit) asm("BTFSC " #adr "," #bit); \
asm("GOTO " #mark)
Остальной код тут не причем думаю, так как выполняется все за тем исключением того что питание приемника
отключается не на 89мс как задумано, а на ~1ms (то что таймер формирует после слипов).
Да эти "goto" все равно появляются при использовании IF, FOR, WHILE, но дело в том что при дизассемблировании
происходит не очень хорошая их замена и где можно было обойтись 2 инструкциями может и по 6 висеть((((
Потому все ветвления сделаны через вставки, и приведенный кусок кода как раз является одной из веток
при проверке флага переполнения таймера.
В общем выяснил, что "слипы отмирают" когда соединяю вместе RA1(дискретный выход) и RA2(дискретный вход с подтяжкой внутренней). Как с этим бороться?
То есть если я запитываю приемник с пина и соединяю другой пин с выходом приемника, начинается этот баг.