обработчик прерывания по совпадению ASM

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 11
Зарегистрирован: Пт янв 06, 2017 14:03:22

Сообщение kvadrats »

Всем привет!!! Помогите разобраться с обработчиком прерывания таймера в Atmega , я написал запуск таймера в подпрограмме

Код: Выделить всё

 
LDI TEMP,$3 
out OCR1AH,TEMP
LDI TEMP,$E8
out OCR1AL,TEMP


delay:
ldi Temp, 0x04  
out TCCR1B, temp

LDI Temp,$10
OUT TIMSK,TEMP
sei
RET
Теперь я хочу сделать , таким образом задержку , т.е. установив регистр сравнения и вызвав процедуру таймера , организовать задержку . Но что-то я не пойму , как отработать что либо по прерыванию от таймера , не представляю как написать обработчик, помогите пожалуйста
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15672
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

А для какого собственно МК программка?
8)
Реклама
akl
Друг Кота
Сообщения: 4462
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

kvadrats писал(а): организовать задержку . Но что-то я не пойму , как отработать что либо по прерыванию от таймера , не представляю как написать обработчик, помогите пожалуйста
Спойлер

Код: Выделить всё

	.INCLUDE "tn2313def.inc"

.equ	Fo=1000000

.def	temp=r16

.CSEG
.ORG 0x0000
START0:
	RJMP	START
.ORG 0x0004
T1_COMPA:
	SBI	PIND,0
	RET
;***********************************
;***********************************
START:
	LDI	R20,LOW(RAMEND)
	OUT	SPL,R20

	SBI	ACSR,ACD

	LDI	R20,1<<SE
	OUT	MCUCR,R20

	SBI	DDRD,0

	LDI XH,HIGH(1*Fo/1000-1)
	out OCR1AH,XH
	LDI XL,LOW(1*Fo/1000-1)
	out OCR1AL,XL	;Интервал 1мс

;LDI TEMP,$3
;out OCR1AH,TEMP
;LDI TEMP,$E8
;out OCR1AL,TEMP


delay:
	ldi Temp, 0x09
	out TCCR1B, temp  ; режим CTC Fo/1
;	ldi Temp, 0x04 
;	out TCCR1B, temp

	LDI Temp,1<<OCIE1A	;$10
	OUT TIMSK,TEMP

	sei
WAIT:
	SLEEP
	BRIE	WAIT
	NOP
	RJMP	START

.EXIT
Как вариант интервала 1мс
Родился
Сообщения: 11
Зарегистрирован: Пт янв 06, 2017 14:03:22

Сообщение kvadrats »

Спасибо большое за отзывчивость , разобрался уже , сделал следующим образом

Код: Выделить всё

delay:
	cli ; запрещаем прерывания
	ldi Temp, 0x00 ;не работаем с выходами 
	out TCCR1A, Temp
	ldi Temp, 0x00 ; содержимое старшего байты 
	out TCNT1H,Temp 
	ldi Temp, 0x00 ; содержимое младшего байты 
	out TCNT1L,Temp
	ldi Temp,0x10 ;прерывание по совпадению c A
	out  TIMSK,Temp
	ldi Temp, 0x01 ;чистый CLK 
	out TCCR1B, Temp
	sei
	loop:
	rjmp loop	
	END_DELAY:
   pop r16
   pop r16
	
RET
Вызываю

Код: Выделить всё

ldi Temp,0x00
out OCR1AH,Temp 
ldi Temp,0x43
out OCR1AL,Temp
RCALL LOWW 
Rcall delay
Обработчик получился как-то так

Код: Выделить всё

.org $0006
	rjmp comp1a

;*******************Обработчик прерываний*******************************
comp1a:;обработчик прерывания таймера 1 по сравнению с А
ldi Temp, 0x00 ;выключили счетчик 
out TCCR1B, Temp
rjmp END_DELAY ;переход за 1 такт до конца подпрограммы задержки 
RETi
ПИшу под ATmega8a
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «AVR»