Страница 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

не забыть бы.
Добавлено: Ср июл 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
Афффигеть

как просто!

Добавлено: Ср июл 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 слова), а у вас?