Страница 1 из 1

Режим захвата в Tiny2313

Добавлено: Вт июл 21, 2009 18:37:15
Antol.St
Здраствуйте. Необходимо измерить время между двумя импульсами,
в интернете прочитал что для этого подойдёт режим захвата.
Объясните пожалуйста как настроить этот режим чтобы замер времени был между первыми фронтами импульсов подаваемыми на PORTD.6.

Добавлено: Вт июл 21, 2009 18:44:56
GP1
Берете ДШ открываете раздел "Таймеры" ищете режим "ICP" пишите в регистры управляющие коды, разрешаете прерывание и все...

На каком языке пишете то?

Добавлено: Вт июл 21, 2009 19:48:24
Antol.St
Пишу на С.

А откуда тогда результат брать, и в чём этот результат будет?

Добавлено: Вт июл 21, 2009 20:39:57
GP1
результат будет в регистровой паре ICRH:ICRL, читают обычно в теле обработчика прерывания, после чтения обнулить счетчик TCNT.
Пишу на асме, так что с кодом на С помочь не могу.
могу предложить асм код (кусок из программы)

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

;========================
; Обработка прерываний
;========================
t1_icp:
   ; обнулить счетчик TCNT1
      clr   tmp
      out   TCNT1H,tmp
      out   TCNT1L,tmp
   ; прочитать значение ICR
      in   lo_icr,ICR1L
      in   hi_icr,ICR1H
   ; установить флаг готовности результатов
      sbr   flags,1<<ready
   ; вычисление переменных
      inc   dm
      cpi   dm,60
      breq   icp01
      rjmp   out_t1_icp      
icp01:      clr   dm
      inc   sm

out_t1_icp:
      reti
;========================

правда код использовался не на tiny2313. но ща гляну как для таньки будет

Добавлено: Вт июл 21, 2009 20:48:41
GP1
Посмотрел, для таньки тоже самое: таймер Т1 режим захвата

зы только сейчас замети концовка не красиво сделана:
надо будет заменить breq на brne и убрать rjmp
:roll: не забыть бы.

Добавлено: Ср июл 22, 2009 06:30:09
akl
Antol.St писал(а):А откуда тогда результат брать, и в чём этот результат будет?

Здравствуйте. Вот пример, где вся работа основана на захвате. Может что пригодится. Правда на ассемблере.
http://radiokot.ru/forum/viewtopic.php?p=193610#193610

Добавлено: Ср июл 22, 2009 18:29:07
Antol.St
Спасибо всем за помощь, разобрался с режимом захвата.
Но сразу возникла другая проблема.
Если регистр ICR1 16 разрядный, то как мне из него число извлечь?
Для примера:
В регистре ICR1L имеем число 10111011, а в регистре ICR1H число 11101010.
Что мне нужно сделать в программе чтобы получилось 1110101010111011 чтобы потом его в десятичное переконвертить?

Добавлено: Ср июл 22, 2009 18:35:39
GP1
Посмотри выше,

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

; прочитать значение ICR 
      in   lo_icr,ICR1L
      in   hi_icr,ICR1H

только обязательно сначало мл.байт потом старший

Добавлено: Ср июл 22, 2009 18:52:46
akl
Жаль,что Вы не посмотрели исходник, а ведь там есть ответ

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

      IN   R14,ICR1L
      IN   R13,ICR1H   ; конечное значение nox

Такой порядок считывания обязателен для всех 16-разрядных регистров периферии, при записи наоборот, первым записывается старший байт, вторым-младший.

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

      CLR   B
      OUT   TCCR1B,B
      OUT   TCNT1H,B
      OUT   TCNT1L,B

Это касается ассемблера; как считывать на сях и сях++, не знаю.

Добавлено: Ср июл 22, 2009 19:18:20
urry
unsigned int summa;
summa= ICR1H<<8;
summa +=ICR1L ;
----------
unsigned char arr2[2];
unsigned int summa;
arr2[0]=ICR1L;
arr2[1]=ICR1H;
summa = * (unsigned int*)&arr2;
----------
union
{
struct {
unsigned char lo;
unsigned char hi;
}bt;
unsigned int all;
}un;

un.bt.hi =ICR1H;
un.bt.lo =ICR1L;
summa=un.all;

Добавлено: Ср июл 22, 2009 19:51:24
akl
Афффигеть :shock: как просто! :oops:

Добавлено: Ср июл 22, 2009 21:33:17
GP1
а потом удивляются - чего это у них *.hex в 3 раза больше чем при написании на асме :))) :))) :)))
Асм был, есть и будет есть!!!

Добавлено: Чт июл 23, 2009 12:38:30
Antol.St
Спасибо всем за помощь .

Добавлено: Пт июл 24, 2009 08:49:10
@ndrey
GP1 писал(а):а потом удивляются - чего это у них *.hex в 3 раза больше чем при написании на асме :))) :))) :)))
Асм был, есть и будет есть!!!

urry выложил 3 примера. Первый пример после компиляции может чуточку по размеру больше получится, чем на ACMе. Ну никак не в 3 раза :-)

Добавлено: Пт июл 24, 2009 17:49:07
GP1
по конкретней пожалуста - сколько вешать в байтах (можно в словах) :)))
приведенный мной код весит 4 байта(2 слова), а у вас?