реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> ТАЙМЕР1, Дайте пример с инициализацией ТАЙМЕРА1.
domowoj
сообщение Apr 24 2008, 01:49
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Цитата(Maik-vs @ Apr 22 2008, 16:02) *
Я бы повесил этот сигнал на внешнее прерывание по обоим фронтам. Его обработчик пусть быстренько переписывает в регистр значение таймера, потом определяет задний или передний фронт. Если задний, то вычисляет длительность. Таймер бы я взял самый приоритетный, разрядность бы расширил софтом: в прерывании таймера по переполнению пусть наращивается регистр или хоть два, получится 24-разрядный таймер, 2 секунды на 16 мегагерцах.

Делай так,
хотя, для более глубокого изучения таймеров, можно спад твоего сигнала завести и на ICP.


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
dvs85
сообщение Apr 24 2008, 02:57
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 86
Регистрация: 24-03-08
Из: Владивосток
Пользователь №: 36 170



Код
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
//========================================
//Инициализация таймера
void Timer1_Init(void)
{
  TIMSK |= (1 << TOIE1)|(1<<TICIE1);            //разрешение переполнения по захвату и по переполнению
  TCCR1B=(1<< ICES1)|(1 << CS21);
  TCNT1=60535;                        // Начинать считать с этого значения
}
//==========================================
//Окончание работы таймера

void Timer1_Stop(void)
{
  TCCR1B = 0x00;                                //Останов. работы
}
//=========================================
//Прерывание по захвату

ISR(TIMER1_CAPT_vect)                        
{
    unsigned int timer;
    timer = ICR1;                        
}
//=========================================
//Программа расчета времени
void Timer1_Inc(void)
{
    unsigned int timer;
    timer ++;
}
//========================================
//Прерывание по переполнению таймера

ISR(TIMER1_OVF_vect)                  //Если возникает прерывание по переполнению таймера,
{
    Timer1_Inc();                        //то перейти к функции Timer1_Inc()
}

//========================================
int main (void)
{
    Timer1_Init();
    
}


Это правильно сделано?
И я не понял как по сохраненым значением счетчика таймера и конечным значением счетчика таймера и счетчиком числа переполнений посчитать временной интервал.


Цитата
можно спад твоего сигнала завести и на ICP.


А как это сделать? Как он отличит, что это спад?

Цитата
Я бы повесил этот сигнал на внешнее прерывание по обоим фронтам. Его обработчик пусть быстренько переписывает в регистр значение таймера, потом определяет задний или передний фронт. Если задний, то вычисляет длительность. Таймер бы я взял самый приоритетный, разрядность бы расширил софтом: в прерывании таймера по переполнению пусть наращивается регистр или хоть два, получится 24-разрядный таймер, 2 секунды на 16 мегагерцах.


Как таймер узнает, что поступает задний фронт?

Сообщение отредактировал dvs85 - Apr 24 2008, 03:03
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Apr 24 2008, 06:17
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(dvs85 @ Apr 24 2008, 06:57) *
[А как это сделать? Как он отличит, что это спад?
Как таймер узнает, что поступает задний фронт?


Всё это описано в документации. К сожалению, нужно всё это внимательно прочесть и понять. Если трудности с английским, то выучи язык! то можно поискать перевод на gaw.ru. Я когда разбирался, сделал вот это в екселе (Макросы не выключай!) Там меняешь битики в регистрах, оно показывает.
Go to the top of the page
 
+Quote Post
dvs85
сообщение Apr 24 2008, 06:31
Сообщение #19


Частый гость
**

Группа: Участник
Сообщений: 86
Регистрация: 24-03-08
Из: Владивосток
Пользователь №: 36 170



Цитата
Если трудности с английским, то выучи язык!

Спасибо за совет, пытаюсь.. wassat.gif

Цитата
Я когда разбирался, сделал вот это в екселе (Макросы не выключай!) Там меняешь битики в регистрах, оно показывает.


Спасибо за файлик smile.gif рад любой помощи в освоении программирования МК

В общем попытаюсь изучать все досконально..
Go to the top of the page
 
+Quote Post
dvs85
сообщение Apr 24 2008, 23:34
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 86
Регистрация: 24-03-08
Из: Владивосток
Пользователь №: 36 170



Я уже наверно надоел, но увы.. Прочитал я все вроде очень хорошо, но вопросы остались те же crying.gif

Как таймер узнает, что сигнал прекращается?

Цитата
И я не понял как по сохраненым значением счетчика таймера и конечным значением счетчика таймера и счетчиком числа переполнений посчитать временной интервал.
Go to the top of the page
 
+Quote Post
domowoj
сообщение Apr 25 2008, 00:17
Сообщение #21


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



В TCCR1B есть бит ICЕSn.

А зачем TCNT1=60535; ?
не понял.

Сообщение отредактировал domowoj - Apr 25 2008, 00:57


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
dvs85
сообщение Apr 25 2008, 00:37
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 86
Регистрация: 24-03-08
Из: Владивосток
Пользователь №: 36 170



Цитата
В TCCR1B есть бит ICTSn.


Я почему то не нашел такого бита
ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10 TCCR1B

В даташите только такие регистры написаны wassat.gif Что этот бит делает?

Цитата
А зачем TCNT1=60535; ?
не понял.


Ну это я почитал разную литературу и прочитал где то в ней, что
например при коэф. деления 8 и частоте 4 МГц получается 0,13сек. А как сделать, чтобы он считал допустим каждые 0,1 секунды(то есть время между прерываниями по переполнению)? Было написано, что надо в счетчик записать число (65535 - ((4000000*0.1)/8)), т.е. 63035. Чтобы потом было удобнее считать. Или я что то опять не понял?

Сообщение отредактировал dvs85 - Apr 25 2008, 00:40
Go to the top of the page
 
+Quote Post
domowoj
сообщение Apr 25 2008, 01:08
Сообщение #23


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



ICES1=0 - по заднему фр.
ICES1=1 ло переднему
одновременно с сохранением устанавливается флаг
ICF1 в TIFR

И каковы параметры интервала и с какой точностью его нужно мерить?

Сообщение отредактировал domowoj - Apr 25 2008, 01:14


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
dvs85
сообщение Apr 25 2008, 01:23
Сообщение #24


Частый гость
**

Группа: Участник
Сообщений: 86
Регистрация: 24-03-08
Из: Владивосток
Пользователь №: 36 170



Цитата
И каковы параметры интервала и с какой точностью его нужно мерить?


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

Цитата
ICES1=0 - по заднему фр.
ICES1=1 ло переднему
одновременно с сохранением устанавливается флаг
ICF1 в TIFR


Это то я понял.. Я не понял как сделать.. Ну поставил я бит чтобы захват срабатывал по переднему импульсу.. Запомнил счетчик свое значение.. Посчитал число переполнений. А как ему дать знать, что нада бы уже закончить считать? Я этого понять не могу laughing.gif
Go to the top of the page
 
+Quote Post
domowoj
сообщение Apr 25 2008, 01:51
Сообщение #25


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Фиксировать значение таймера можно по тому же сигналу(ICP) , прямому или инверсному.
В обработчике флага захвата нужно ввести еще и признак -начало или конец интервала.
Можно пользоваться флагом Т .
В обработчике флага захвата сначала анализируешь Т, Т=0 допустим - начало,
установил Т-начал считать, пришел конец интервала, а Т уже =1 и ты идешь по другой ветке -
подсчитываешь - кол. переполнений умножаешь на 65536 и прибавляешь содерж. TCNT1
дальше на экран.
Сбросил Т и новый цикл .
А чтобы цикл был 0,1 сек 60535(или ?) нужно записывать в OCR1 и таймер в реж. CTC-сброс при совпадении-в даташите и у Евстифеева есть формула.

Сообщение отредактировал domowoj - Apr 25 2008, 02:19


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
dvs85
сообщение Apr 27 2008, 23:03
Сообщение #26


Частый гость
**

Группа: Участник
Сообщений: 86
Регистрация: 24-03-08
Из: Владивосток
Пользователь №: 36 170



Цитата(domowoj @ Apr 25 2008, 04:51) *
Фиксировать значение таймера можно по тому же сигналу(ICP) , прямому или инверсному.
В обработчике флага захвата нужно ввести еще и признак -начало или конец интервала.
Можно пользоваться флагом Т .
В обработчике флага захвата сначала анализируешь Т, Т=0 допустим - начало,
установил Т-начал считать, пришел конец интервала, а Т уже =1 и ты идешь по другой ветке -
подсчитываешь - кол. переполнений умножаешь на 65536 и прибавляешь содерж. TCNT1
дальше на экран.
Сбросил Т и новый цикл .
А чтобы цикл был 0,1 сек 60535(или ?) нужно записывать в OCR1 и таймер в реж. CTC-сброс при совпадении-в даташите и у Евстифеева есть формула.


Спасибо. Буду пробовать.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 01:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01415 секунд с 7
ELECTRONIX ©2004-2016