Ну вот пример программы из книги, где это используется. Поочередно включаются светодиоды:
CODE
.device at90s1200
.nolist
.include "C:\Program Files\Atmel\AVR Studio\1200def.inc"
.list
.def temp=r16
.def Mark240=r17
.def Counter=r18
.def Speed=r19
rjmp Init
Init:
ser temp
out DDRB,temp
ldi temp,0b11111100
out DDRD,temp
ldi temp,0b00000001
out PortB,temp
ldi temp,0b00000011
out PortD,temp
ldi temp,0b00000101
out TTCR0,temp
ldi Mark240,240
ldi Counter,5
ldi Speed,5
Start:
; Проверяется нажатие кнопки уменьшения скорости
sbic PinD,0
rjmp UpTest
inc Speed
cpi Speed,11
brne ReleaseDown
dec Speed
ReleaseDown:
sbis PinD,0
rjmp ReleaseDown
; Проверяется нажатие кнопки увеличения скорости
UpTest:
sbic PinD,1
rjmp Timer
dec Speed
brne ReleaseUp
inc Speed
ReleaseUp:
sbis PinD,0
rjmp ReleaseUp
; Формируем задержку
Timer:
in temp,TCNT0
cp temp,Mark240
brne Timer
subi Mark240,-240
dec Counter
brne Start
;Меняем СИД
mov Counter,Speed
in temp,PortB
lsl temp
brcc PC+2
ldi temp,0b00000001
out PortB,temp
rjmp Start
Цитата(Палыч @ Oct 28 2009, 10:57)

Переполним... Но, и счетный регистр таймера работает с переполнением. Поэтому я и употребил - "отодвинем".
но переполнение происходит же не одинаково? время разве не уедет? я понимаю так, достигли мы в Mark80 значения 240. Прибавляем 80, получаем переполнение. А Timer считает дальше (до 255), и равенство будет не ранее, чем переполнится Timer и дойдет до нужного значения, так? Это время будет соответствовать тому же периоду, что и увеличение со 160 до 240?
Причина редактирования: Нарушение п.3.4 Правил форума.