Глюк - неправильная работа функции sprintf,
CODE
sprintf(text,"W %2dим %2d.%.2dл",counter,FORMAT_VOLUME_CL(counter_l));
при обработке формата %.2d, printf зависает, и забивает всю память пробелами.
раскопал dotprnt.c, ошибка происходит в куске
CODE
#ifdef WIDTH
if(width > c)
width -= c;
else
width = 0;
#endif
if(width > c)
width -= c;
else
width = 0;
#endif
условие (width > c) периодически срабатывает не правильно, полез дизассемблер. Вот кусок сравнения sint8 и sint16:
width = 0x1F0 (16 знак бит)
с = 0x1F2 (8 бит знак)
CODE
!#ifdef WIDTH
! if(width > c)
00 0xA3C: MOVLW 0x80 // w=0x80
01 0xA3E: MOVLB 0x1 // bank = 1
02 0xA40: BTFSC 0xF2, 7, BANKED // если с < 0
03 0xA42: MOVLW 0x7F //w = 0x7f
04 0xA44: MOVWF 0xE7, BANKED /// *(0x1E7) = w запись временного значения
05 0xA46: MOVF 0xF0, W, BANKED // w = LOW(width)
06 0xA48: SUBWF 0xF2, W, BANKED // w = LOW(width) - c
07 0xA4A: MOVF 0xF1, W, BANKED // w = HIGH(width)
08 0xA4C: XORLW 0x80 // w = w ^ 0x80
09 0xA4E: MOVLB 0x0 // bank = 0
10 0xA50: SUBWFB 0xE7, W, BANKED // w = w - *(0x0E7)
11 0xA52: BC 0xA64 // переход если Сarry
! width -= c;
! if(width > c)
00 0xA3C: MOVLW 0x80 // w=0x80
01 0xA3E: MOVLB 0x1 // bank = 1
02 0xA40: BTFSC 0xF2, 7, BANKED // если с < 0
03 0xA42: MOVLW 0x7F //w = 0x7f
04 0xA44: MOVWF 0xE7, BANKED /// *(0x1E7) = w запись временного значения
05 0xA46: MOVF 0xF0, W, BANKED // w = LOW(width)
06 0xA48: SUBWF 0xF2, W, BANKED // w = LOW(width) - c
07 0xA4A: MOVF 0xF1, W, BANKED // w = HIGH(width)
08 0xA4C: XORLW 0x80 // w = w ^ 0x80
09 0xA4E: MOVLB 0x0 // bank = 0
10 0xA50: SUBWFB 0xE7, W, BANKED // w = w - *(0x0E7)
11 0xA52: BC 0xA64 // переход если Сarry
! width -= c;
Проблема с кодом, в том что промежуточная переменная пишется в банк 1 [строка 4], а читается из уже из банка 0 [строка 10]. соответсвенно результат сравнения зависит не от операндов, а от предыдущего состояния памяти.
Помогите разобраться, очень похоже на глюк компилятора.