Весь вчерашний день и весь вечер я искал ошибку. Я её искал...искал.....искал. Рвал волосы на голове, но не сдавался. И как всегда ошибка нашлась там где её не ждали. Я её смог обнаружить только сегодня.
Вот два куска кода, первый:
_txbyte:
mov r1,p0l
ldi p1l,8
3:sbi DDR_SENSOR,NPIN_SENSOR
cbi PORT_SENSOR,NPIN_SENSOR
lsr r1 ; next bit
brcc 0f
1:delay_us 10 ; bit 1
cbi DDR_SENSOR,NPIN_SENSOR
delay_us 60
rjmp 2f
0:delay_us 60 ; bit 0
cbi DDR_SENSOR,NPIN_SENSOR
delay_us 10
2:dec p1l ; next
brne 3b
ret
Второй:
_txbyte:
mov r1,p0l
ldi p1l,8
3:sbi DDR_SENSOR,NPIN_SENSOR
cbi PORT_SENSOR,NPIN_SENSOR
lsr r1 ; next bit
brcc 4f
1:delay_us 10 ; bit 1
cbi DDR_SENSOR,NPIN_SENSOR
delay_us 60
rjmp 2f
4:delay_us 60 ; bit 0
cbi DDR_SENSOR,NPIN_SENSOR
delay_us 10
2:dec p1l ; next
brne 3b
ret
И казалось бы разница минимальна, но первый вариант кода не работает правильно. А всё из-за локальной метки с номером 0. Заменил метку 0 на метку 4 (и соответственно 0f на 4f), и заработало.
Вопрос, баг или фишка?