Длительность периода в реальном времени

Обсуждаем контроллеры компании Atmel.
Ответить
Модератор
Аватара пользователя
Сообщения: 19055
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

akl, там, в конце нужно разрешить все прерывания. ты этого не написал.
выход с запрещенными прерываниями - красивое решение.

Добавлено after 22 minutes 53 seconds:
извиняюсь, есть там проход через разрешение всех прерываний.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

akl, плюсик Вам :beer: за идею инкрементирования регистра без изменения флагов.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Сообщение B@R5uk »

Z_h_e, я правильно понял вашу идею?

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

;==============
;   Процедура обработки прерывания по событию захвата таймера 1
tc1capt:        in      r14,    SREG
                set                     ;   Установка флага события для основного цикла
                add     r10,    r1      ;   Инкремент номера события
                adc     r11,    r0
                mov     r2,     r18     ;   Сохранение старого временного штампа
                mov     r3,     r19
                mov     r4,     r20
                mov     r5,     r21
                in      r18,    ICR1L   ;   Чтение аппараной части временного штампа
                in      r19,    ICR1H
                mov     r20,    r12     ;   Чтение программной части временного штампа
                mov     r21,    r13
                in      r15,    TIFR    ;   Проверка наличия флага переполнения
                sbrs    r15,    TOV1
                rjmp    tc1capt_1       ;   Если установлен, то продолжить
                mov     r15,    r19     ;   Проверка старшего бита аппараной части ВШ
                sbrc    r15,    7
                rjmp    tc1capt_1       ;   Если сброшен, то продолжить
                add     r20,    r1      ;   Коррекция программной части ВШ
                adc     r21,    r0
tc1capt_1:      out     SREG,   r14
                reti
;==============
;   Процедура обработки прерывания по переполнению таймера 1
tc1ovf:         in      r14,    SREG
                add     r12,    r1
                adc     r13,    r0
                out     SREG,   r14
                reti
;==============
В прерывании по захвату читаем аппаратную и программную часть временного штампа. Затем, если установлен флаг переполнения таймера и сброшен старший бит аппаратной части, то считаем, что переполнение произошло до события захвата и не было обработано (Вариант Д). Поэтому корректируем программную часть штампа, увеличивая её на единицу.
Аlex писал(а):
B@R5uk писал(а):Вариант Г
1) Событие захвата;
2) Событие переполнения;
3) Обработка события переполнения;
4) Обработка события захвата.
Из-за накладки результат получается неправильный. Программная часть временного штампа на единицу больше, чем надо.
Этот вариант исключён.
Я правильно понимаю, что если у МК имеется несколько запланированных прерываний, то выполнятся будет то, которое выше по списку?

Хотя вопрос снят. Нашёл ответ в разделе 4.7 Reset and Interrupt Handling:
The list also determines the priority levels of the different interrupts. The lower the address the higher is the priority level. RESET has the highest priority, and next is INT0 – the External Interrupt Request 0
Последний раз редактировалось B@R5uk Вт мар 28, 2017 12:01:19, всего редактировалось 1 раз.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1314
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

Сообщение НАПАЛМ »

А вы код в столбик ручками выравниваете или есть какой-то более автоматизированный способ?
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Сообщение B@R5uk »

НАПАЛМ, если вопрос стоит в том, как сконвертировать табуляцию в пробелы, то я использую программу Sublime Text 2. Она позволяет настраивать количество пробелов на символ табуляции. Остальные действия — исключительно копипаст.
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1314
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

Сообщение НАПАЛМ »

Я имею в виду именно написание в студии. Например, mov + tab, а если in, то tab + space - так делаете?
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

B@R5uk писал(а):Z_h_e, я правильно понял вашу идею?
Сегодня голова чего-то не варит, целый день сплю. Есть такое чувство что что-то в коде не так, возможно ложное.

По сколько голова не варит, решил накидать свой код :). Переменные решил сделать так же как и у Вас, в регистрах, видимо Ваш проект это позволяет, если индексные регистры свободны, то их использование вроде как должно укоротить код.

Опеределения регистров. В Len будет измеренная длина периода импульса.
Спойлер

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

.def zero=R1

.def Len0=R2
.def Len1=R3
.def Len2=R4
.def Len3=R5

.def Old0=R6
.def Old1=R7

.def CountOVF0=R8
.def CountOVF1=R9

.def store=R14

.def buf=r16
Обработчик переполнения таймера
Спойлер

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

//------------------------------
TIM1_OVF:
	in Store,SREG

	inc CountOVF0 
	ADC CountOVF1,zero

	out SREG,Store
	reti
Обработчик захвата
Спойлер

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

TIM1_CAPT:
	in Store,SREG
	push buf

	//захваченные данные
	in Len0,ICR1L
	in Len1,ICR1H
	mov Len2,CountOVF0
	mov Len3,CountOVF1

	BST Len1,7 //если захвачены счетчик больше половины
	brTS NetDob
	in buf, TIFR	//если произошло событие переполнения
	andi buf,1<<TOV1
	breq NetDob

	inc Len2		//добавляем единичку
	adc len3,zero

	out TIFR,buf	//сброс флага переполнения

NetDob:
	//вычитаем старое значение
	Sub Len0,Old0
	SBC Len1,Old1
	Sbc Len2,zero
	sbc Len3,zero

	//новое старое значение
	in Old0,ICR1L
	in Old1,ICR1H

	//сброс счетчика переполнений
	clr CountOVF0
	clr CountOVF1

	set //флаг события захвата длины импульса

	pop buf
	out SREG,Store
	reti
Код не проверял, не уверен что без ошибок и если помозговать, то наверное можно с оптимизировать. Тут еще конечно нюансы конкретного МК надо учитывать.

Не забывайте про необходимость атомарности операций. Например, Вы хотите отправить по UART измеренную длительность. Для этого следует запретить прерывания которые могут изменить Len3:0. Копируете Len в некий буфер, разрешаете прерывания и затем спокойненько отправляете данные из буфера.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Модератор
Аватара пользователя
Сообщения: 19055
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

inc CountOVF0
ADC CountOVF1,zero
инкремент не устанавливает флаг переноса. но зато устанавливает флаг нуля. нужно сделать проверку на ноль, и если ноль, тогда сделать просто инкремент следующего регистра.

зачем занимать еще 2 регистра?
CountOVF0 и CountOVF1 и есть те самые Len2 и Len3.
или можно сделать наоборот. оставить имена Len2 и Len3, а имена (регистры) CountOVF0 и CountOVF1 - убрать.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Starichok51 писал(а):инкремент не устанавливает флаг переноса.
Давно не прогал на асме, забывается, а в справочник не смотрел. Да, тут другое решение нужно. Можно как и у ТС, держать единицу в регистре. А если использовать индексный регистра, то еще проще.
Starichok51 писал(а):зачем занимать еще 2 регистра?
Хотел так, но тогда результат куда-то сохранять надо будет.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

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

TIM1_CAPT:
   in Store,SREG
;
;
   set //флаг события захвата длины импульса
;
   out SREG,Store
   reti
Извините, ошибочная конструкция. Выход будет без флага T, если он не был взведён ранее.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

я бездумно повторил из кода ТС. Замечание верное, надо воспользоваться другим флагом или устанавливать непосредственно перед выходом из прерывания. Код без теста - недокод.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Собутыльник Кота
Аватара пользователя
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Сообщение B@R5uk »

НАПАЛМ писал(а):Я имею в виду именно написание в студии.
В АВР-студии есть автоотступ по типу как в мелкосовтовской визуальной студии. Остальные места — ручками. Табуляции везде, кроме комментариев, очень удобно для выравнивания.
akl писал(а):Извините, ошибочная конструкция.
Вот вы очень внимательны, завидую. Я эту ошибку обнаружил, только когда в железе попробовал, — МК ничего в комп не слал.
Ответить

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