Однако для флагов все же лучше отдельный регистрв "старшей" половине регистрового файла(очепятался...
У Т более интересные возможности/назначение.
А что такое "РСФ"?BOB51 писал(а):регистрв "старшей" половине РСФ.
Для таких действий этот бит правильнее всего использовать?BOB51 писал(а):У Т более интересные возможности/назначение.
Про такой не слыхал до ныне, спасибо!trofim2 писал(а):В качестве флагов очень удобно использовать регистр GPIOR
Код: Выделить всё
Перед входом в осн цикл прописываем так:
ldi low_,0x00
ldi high_,0xFF
ldi count,0x00
sbi GPIOR0,2 ;Рег. и бит в котором храним исп. флаг
В обработке прерывания по каналу А так:
A0_cndn: sbis GPIOR0,2
sbic GPIOR0,2
rjmp inc_cnt
rjmp dec_cnt
inc_cnt: inc count
cpse count,high_
reti
cbi GPIOR0,2
reti
dec_cnt: dec count
cpse count,low_
reti
sbi GPIOR0,2
retiДа, точно! Долго потом можно будет ошибку искать...Alexeyslav писал(а):при том что на входе вы сохраняете регистр состояния, а на выходе восстанавливаете и всё что менялось в обработчике идёт под хвост.
В прерывание по переполнению Т0 вставлял фрагмент с определением числа - да, все работает. Прерывания по каналу А и В можно вовсе отключить, главное настроить выводы СОМ0А(В)1(0).akl писал(а):Прерывания по сравнению не нужны, остаются только прерывание по переполнению.
Код: Выделить всё
;04.05.2018
.include "tn2313def.inc"
.def count =R17
.cseg
.org 0x00
rjmp init
.org 0x06
RETI ;(0х06) Переполнение таймера/счетчика Т0
INIT:
ldi R22,RAMEND
out SPL,R22
SBI ACSR,ACD
SER ZH
out DDRB,ZH ;порты на выход 0
out DDRD,ZH
OUT DDRA,ZH
LDI R22,1<<SE
OUT MCUCR,R22 ; SLEEP IDLE
;НАСТРОЙКА ТАЙМЕРА/СЧЕТЧИКА Т0
ldi count,0x01 ;Задаем начальное значение
out OCR0A,count
out OCR0B,count
ldi R22,(1<<COM0A1 | 0<<COM0A0 | 1<<COM0B1 | 1<<COM0B0 | 1<<WGM00)
out TCCR0A,R22 ;Выводы изм. сост. инверсным способом
ldi R22,1<<CS00 ;1<<CS02 1/256 (в работе делитель такой, в отладке 1/1)
out TCCR0B,R22
ldi R22,1<<TOIE0
; ldi temp,1<<OCIE0A ;| 0<<TOIE0 | 1<<OCIE0A)
out TIMSK,R22
out TIFR,R22
sei
MAIN:
SLEEP
LDI R23,1 ;суммирование счетчика
SBIC PIND,6 ;признак вычитание/суммирование
LDI R23,-1 ;вычитание счетчика
ADD count,R23
BRNE TTT
SBI PIND,6 ;переключить признак
SUB count,R23 ;вернуть счетчик в диапазон
TTT:
OUT OCR0A,count
OUT OCR0B,count
rjmp MAIN
;*************************************************
.exitКод: Выделить всё
.CSEG
.ORG $00
RESET:
000000 27ff CLR ZH
000001 bffe OUT SPH,ZH
000002 ef4f SER R20
000003 bf4d OUT SPL,R20
000004 c00d RJMP GO
.ORG $0009
TIM0_OVF: ; Timer0 Overflow Handler
000009 5071 SUBI R23,1
00000a 4060 SBCI R22,0
00000b f409 BRNE PC+2
00000c 98c4 CBI PORTB,4
00000d 5031 SUBI R19,1
00000e 4020 SBCI R18,0
00000f f409 BRNE TIM0_OUT
; SET
000010 9508 RET
TIM0_OUT:
000011 9518 RETI
;***************************************************************************
GO:
000012 ef07 LDI R16,0b11110111
000013 bb07 OUT DDRB,R16
000014 9ac3 SBI PORTB,3 ; кнопки
000015 bff3 OUT TCCR0,ZH
000016 bff2 OUT TCNT0,ZH
WAIT_KEY: