ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
29 июня
241225 Топик полностью
ReAl (01.03.2011 19:01 - 19:07, просмотров: 137) ответил mazur на Задача, нужен таймер. Размер таймера зависит от
Другой пример нужен. Тут вполне можно обойтись без дёрганья туда-сюда SREG, так как код в цикле использует только бит переноса, а в документации английским по белому: The C Flag in SREG is not affected by the operation, thus allowing the DEC instruction to be used on a loop counter in multiple-precision computations. Так что можно вообще так (кстати, а зачем продолжать "инкремент", если из предыдущего байта нет переноса?): System_Timer: ldix TIMER ldi CNT, TIMER_LENGTH ; Поскольку ниже INC, тут убираем SEC за ненадобностью. System_Timer_Cycle: ld r16, X ; Поскольку есть досрочный выход, тут можно и INC, а не ADC с нулевым регистром ; Но можно было бы и ADC, и без досрочного выхода, только это будет в среднем дольше выполняться ; а по коду выиграша не даст. inc r16 st r16, X+ ; Ну зачем добавлять дальше нулевой перенос? ; Если в R16 не 0, то дальше передавать нечего. brne Sysem_Timer_Done dec CNT brne Sysem_Timer_Cycle System_Timer_Done: Даже если бы inc/dec у AVR задевали бит переноса, тут для счётчиков длиной до 8 байт тоже можно было бы обойтись без танцев, причём не удлинняя код: System_Timer: ldix TIMER ldi CNT, (1<<TIMER_LENGTH)-1 ; 0b00001111 для 4-байтового счётчика System_Timer_Cycle: lsr CNT brcc System_Timer_Done ; C=0 - закончился счётчик, C=1 - его и добавляем. ld r16, X ; Впрочем, при выходе по завершению переноса тут можно и INC. ; Просто демонстрация использования бита C в двух целях. adc r16, RCLR st r16, X+ brcs Sysem_Timer_Cycle ; ну зачем добавлять дальше нулевой перенос? System_Timer_Done: Так что даже будeчи увереным в собственной правоте и неправоте задавшего вопрос -- иногда стоит над вопросом задуматься :-)