Режим захвата в Tiny2313
- Antol.St
- Нашел транзистор. Понюхал.
- Сообщения: 163
- Зарегистрирован: Вт окт 14, 2008 11:29:03
- Откуда: Алтайский край, Бийск
- Контактная информация:
Режим захвата в Tiny2313
Здраствуйте. Необходимо измерить время между двумя импульсами,
в интернете прочитал что для этого подойдёт режим захвата.
Объясните пожалуйста как настроить этот режим чтобы замер времени был между первыми фронтами импульсов подаваемыми на PORTD.6.
в интернете прочитал что для этого подойдёт режим захвата.
Объясните пожалуйста как настроить этот режим чтобы замер времени был между первыми фронтами импульсов подаваемыми на PORTD.6.
Последний раз редактировалось Antol.St Ср июл 22, 2009 18:19:41, всего редактировалось 1 раз.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
результат будет в регистровой паре ICRH:ICRL, читают обычно в теле обработчика прерывания, после чтения обнулить счетчик TCNT.
Пишу на асме, так что с кодом на С помочь не могу.
могу предложить асм код (кусок из программы)
правда код использовался не на tiny2313. но ща гляну как для таньки будет
Пишу на асме, так что с кодом на С помочь не могу.
могу предложить асм код (кусок из программы)
Код: Выделить всё
;========================
; Обработка прерываний
;========================
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. но ща гляну как для таньки будет
Antol.St писал(а):А откуда тогда результат брать, и в чём этот результат будет?
Здравствуйте. Вот пример, где вся работа основана на захвате. Может что пригодится. Правда на ассемблере.
http://radiokot.ru/forum/viewtopic.php?p=193610#193610
- Antol.St
- Нашел транзистор. Понюхал.
- Сообщения: 163
- Зарегистрирован: Вт окт 14, 2008 11:29:03
- Откуда: Алтайский край, Бийск
- Контактная информация:
Спасибо всем за помощь, разобрался с режимом захвата.
Но сразу возникла другая проблема.
Если регистр ICR1 16 разрядный, то как мне из него число извлечь?
Для примера:
В регистре ICR1L имеем число 10111011, а в регистре ICR1H число 11101010.
Что мне нужно сделать в программе чтобы получилось 1110101010111011 чтобы потом его в десятичное переконвертить?
Но сразу возникла другая проблема.
Если регистр ICR1 16 разрядный, то как мне из него число извлечь?
Для примера:
В регистре ICR1L имеем число 10111011, а в регистре ICR1H число 11101010.
Что мне нужно сделать в программе чтобы получилось 1110101010111011 чтобы потом его в десятичное переконвертить?
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Посмотри выше,
только обязательно сначало мл.байт потом старший
Код: Выделить всё
; прочитать значение ICR
in lo_icr,ICR1L
in hi_icr,ICR1Hтолько обязательно сначало мл.байт потом старший
Жаль,что Вы не посмотрели исходник, а ведь там есть ответ
Такой порядок считывания обязателен для всех 16-разрядных регистров периферии, при записи наоборот, первым записывается старший байт, вторым-младший.
Это касается ассемблера; как считывать на сях и сях++, не знаю.
Код: Выделить всё
IN R14,ICR1L
IN R13,ICR1H ; конечное значение nox
Такой порядок считывания обязателен для всех 16-разрядных регистров периферии, при записи наоборот, первым записывается старший байт, вторым-младший.
Код: Выделить всё
CLR B
OUT TCCR1B,B
OUT TCNT1H,B
OUT TCNT1L,B
Это касается ассемблера; как считывать на сях и сях++, не знаю.
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
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;
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;
