
p.s.
Понял про компаратор - тот же сброс при совпадении!!! Спасибо. 

Понял про компаратор - тот же сброс при совпадении!!! Спасибо. 
Код: Выделить всё
; Учебная программа выводит время на индикатор
.def temp= r16; присваиваем регистру R16 - имя "temp"
.def min= r17; переменная значения минут
.def chas= r18; переменная значения часов
.def h1= r19; переменная старшего разряда п/п преобразовния
.org 0;_________старт с нуля и переход по вектору на метку "start"__
rjmp start
.org $04
rjmp tim1
.org OVF0addr; _адресс прерывания по переполнению таймера 0__
rjmp tim0
;---------- Инициализация ----------
start:
ldi temp, LOW(Ramend); инициализация указателя стека
out spl, temp
ldi temp, $ff; програмируем порт "В" на выход
out ddrB, temp
ldi temp, 0b0001111
out ddrD, temp; програмируем выводы 1...4 порта "D" на выход
rcall tim0_init; переход на п/п инициализации прерывания
clr r31
ldi r30, $70; переносим таблицу символов в ОЗУ
ldi temp, $c0; по адресу $70...$79
st Z+, temp
ldi temp, $f9
st Z+, temp
ldi temp, $A4
st Z+, temp
ldi temp, $b0
st Z+, temp
ldi temp, $99
st Z+, temp
ldi temp, $92
st Z+, temp
ldi temp, $82
st Z+, temp
ldi temp, $F8
st Z+, temp
ldi temp, $80
st Z+, temp
ldi temp, $90
st Z+, temp
ldi temp, $01
st Z+, temp
ldi r30, $60; Обнуляем значение ОЗУ
ldi temp, $00; по адресу $60...$63
st Z+, temp
st Z+, temp
st Z+, temp
st Z+, temp
mov r17, temp
mov r18, temp
ldi temp, 1; Задаём начальные условия
mov r2, temp
sei; глобально разрешаем прерывания
;---------- цикл---------------------------------
LOOP: rjmp LOOP
;_____
TRANSFORM:; подпрограмма преобразования в двоично-десятичную систему исчесления
clr h1 ;очищаем результат ПРЕОБРАЗОВАНИЯ
LOOP_1:
subi temp,10 ;из входного числа вычитаем - 10
brcs LOOP_2 ;переход на метку при переносе
inc h1 ; + 1
rjmp LOOP_1; назад к циклу
LOOP_2:
subi temp,-10 ; к остатку прибавляем +10 -- получается младший разряд
ret
;----------
tim0_init:; инициализация прерывания Timer
ldi temp, $2; устанавливаем предделитель
out tccr0, temp; регистр TCCR0B задаёт коэф. деления (Биты CS00,CS01,CS02)
; __________инициализация прерывания Timer1___________
ldi Temp,0b01000010 ;разрешить прерывание компаратора
out TIMSK,Temp
ldi Temp,0b00000100 ;тактовый сигнал (8 МГц) = CK/256
out TCCR1B,Temp
ldi Temp,0x7A ;инициализация компаратора
out OCR1AH,Temp ; считаем до 31250
ldi Temp,0x12
out OCR1AL,Temp
ret
;_____
; П/П обработки прерывания
;_____
tim0:
push temp; сохраняем значение переменной temp в стек
in temp, sreg; сохраняем значение региста SREG в стек
push temp
clr temp
out portD, temp; гасим индикатор
lds temp, $007A; Загружаем непосредственно с RAM значение Хранящееся в ячейке $007A
cpi temp, 0b00010000; сверяем на достижение зачен. 0b00010000
breq OVERFLOV; если достигло то переход на П/П обнуления
W: out portD, temp; Включаем нужный разряд (хранится) в яч. №007А
lsl temp; сдвигаем temp на один пазряд влево
sts $007A, temp; записываем значение temp в ОЗУ по адресу $007A
mov r30, r2; копируем r2 в r30 (r2 хранит номер разряда)
subi r30, -$5f; к r30 прибавляем $5f
ld temp, z; загружаем значение ОЗУ по адрессу Z (r30,r31)
ldi r30, $70; загружаем в Z число $70
add r30, temp; прибавляем к Z число в рег. temp
ld temp, z; загружаем в temp число по адресу Z
out portB, temp; Выводим цифру на индикатор
inc r2; прибавляем номер позиции индикатора
pop temp; востанавливаем из стека данные
out sreg, temp
pop temp;
reti;
OVERFLOV:;П/П обнуления
ldi temp, 1;
mov r2, temp;
rjmp W;
tim1:
push temp; сохраняем значение переменной temp в стек
in temp, sreg; сохраняем значение региста SREG в стек
push temp
push r30
inc min; Значение минут + 1
cpi min, 60; сравниваем значение минут с 60
breq TIM60; если да - то переход на п/п обнуления минут
rjmp E1; едем дальше
TIM60:; П/П обнуления минут
clr min; очищаем значения минут
inc chas; прибавляем один час
cpi chas, 24; если часов 24
breq CHAS24; то переходим на п/п обнуления часов
rjmp E1
CHAS24:;П/П обнуления часов
clr chas; обнулить часы
E1: mov temp, min; копируем значение минут в temp
Rcall TRANSFORM; вызов п/п преобразования шестнадцатиричного формата в двоично-десятичный
clr r31; запись значения времени в оперативную память
ldi r30, $60 ; по адресу $0060
st Z+, temp; записываем значение едениц минут в ОЗУ с инкременированием адреса
st Z+, h1 ;записываем значение десятков минут в ОЗУ с инкременированием адреса
mov temp, chas; копируем значение часов в temp
Rcall TRANSFORM; вызов п/п преобразования шестнадцатиричного формата в двоично-десятичный
st Z+, temp; записываем значение едениц часов в ОЗУ с инкременированием адреса
st Z+, h1; записываем значение десятков часов в ОЗУ с инкременированием адреса
ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp
out TCNT1L,Temp
pop r30
pop temp; востанавливаем из стека данные
out sreg, temp
pop temp;
reti;
Всё исправлено, работает как задумано... 
Оно!Kavka писал(а):http://www.atmel.com/images/doc0856.pdf - за подробностями "8-bit AVR Instruction Set"

B@R5uk писал(а):Народ, подскажите, пожалуйста, где взять подробное описание команд ATtiny13А
ploop писал(а):проще написать подпрограмму на 10 строчек

Alexeyslav писал(а):займет уйму тактов, дёргание ножкой SCK - целых 4 такта... уже только за это время можно передать несколько байт по SPI.