Вопрос совсем не абстрактный. В статье архив с исходниками. В т.ч. Мейк-файл.
Часы ИДУТ абсолютно правильно... т.е. как я их поставил в середине августа, так они правильно считают время. До сих пор. Но вот ПОКАЗЫВАЮТ они его иногда неправильно. Иногда на час меньше, иногда на минуту меньше.
Кусок кода, отвечающих за отображение весьма прост:
Code: |
case NORMAL:
case MIN_SET:
PORTC = minutes % 10;
PORTB |= 0x08;
break;
|
(аналогично и с единицами часов).
Т.е. байтовая переменная minutes считает правильно. А вот что выводится в PORTC...?
А вот кусок кода, отвечающий за остаток от деления:
Code: |
000006f6 <__udivmodqi4>:
6f6: 99 1b sub r25, r25
6f8: 79 e0 ldi r23, 0x09 ; 9
6fa: 04 c0 rjmp .+8 ; 0x704 <__udivmodqi4_ep>
000006fc <__udivmodqi4_loop>:
6fc: 99 1f adc r25, r25
6fe: 96 17 cp r25, r22
700: 08 f0 brcs .+2 ; 0x704 <__udivmodqi4_ep>
702: 96 1b sub r25, r22
00000704 <__udivmodqi4_ep>:
704: 88 1f adc r24, r24
706: 7a 95 dec r23
708: c9 f7 brne .-14 ; 0x6fc <__udivmodqi4_loop>
70a: 80 95 com r24
70c: 08 95 ret
|
Здесь R24 - минуты или часы, R22 = 10, а результат считывается из R25.
Может вопрос в оптимизаторе? где-то что-то не сохраняется... несколько разных прерываний...
Пока прошил еще 2 МК. Один без изменений, но перекомпилированный, во второй зашил вместо остатка от деления обход = minutes - 10*(minutes/10);