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

 
 
 
Reply to this topicStart new topic
> Помогите с таймером
Neytrino
сообщение Jul 25 2009, 15:30
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 26-02-09
Пользователь №: 45 406



CODE

void init_timer1()
{
PORTB |= (1<<PIND1);
DDRB &= 0;
OCR1B = 0;
TCCR1B = (1 << WGM12) | (1 << CS12) | (1 << CS11) | (1 << CS10); //тактирование по нарастающему фронту импульсов
TIMSK = (1 << OCIE1B); // (1 << 1);
SREG |= (1 << 7); // _SEI();
}

CODE
#pragma vector = TIMER1_COMPB_vect
__interrupt void inc_delay_counter1()
{

counter++;
}


вот собственно код инициализации и прерывания. Не считает гад по импульсам, подаю сигнал - на счетчиках полный 0. Помогите победить заразу для тактирования из-вне
Go to the top of the page
 
+Quote Post
Vishv
сообщение Jul 25 2009, 15:49
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 310
Регистрация: 11-07-09
Из: Екатеринбург
Пользователь №: 51 154



Попробуйте описать словами- что именно вы хотите сделать. На первый взгляд при инициализации таймера полная каша..
Ну а выражение "PORTB |= (1<<PIND1);" Вам самому не кажется странным?
Go to the top of the page
 
+Quote Post
Neytrino
сообщение Jul 25 2009, 15:57
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 26-02-09
Пользователь №: 45 406



Мне нужно считать импульсы за какой-то промежуток времени, с одним таймером я разобрался, он считает, вот теперь мучаюсь с этим таймером.

Цитата(Vishv @ Jul 25 2009, 19:49) *
Ну а выражение "PORTB |= (1<<PIND1);" Вам самому не кажется странным?


а как мне перевести пин в режим входа по другому? это пин внешнего тактирования таймера1

возникла следующая проблема, я у меня получилось считать импульсы, ошибся в регистрах
CODE
void init_timer1()
{
PORTB |= (1<<PIND1);
DDRB &= 0;
OCR1B = 0;
TCCR1B = (1 << WGM13) | (1 << CS12) | (1 << CS11) | (1 << CS10); //тактирование по нарастающему фронту импульсов
TIMSK = (1 << OCIE1B); // (1 << 1);
SREG |= (1 << 7); // _SEI();
}


но теперь считает только один таймер, если инициализирую оба, то считает только таймер1, отключаю таймер1, начинает работать таймер0, вместе не хотят sad.gif вот код таймера0
CODE
void init_timer0()
{
PORTB |= (1<<PIND0);
DDRB &= 0;
OCR0 = 0;
TCCR0 = (1 << WGM21) | (1 << CS22) | (1 << CS21) | (1 << CS20); //тактирование по нарастающему фронту импульсов
TIMSK = (1 << OCIE0); // (1 << 1);

}
Go to the top of the page
 
+Quote Post
Vishv
сообщение Jul 25 2009, 16:13
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 310
Регистрация: 11-07-09
Из: Екатеринбург
Пользователь №: 51 154



Почему Вы определяете направление пина PORTB через PIND?
Ну и я совсем не понял - Вы пытаетесь на одном таймере и измерять время и считать импульсы?
Go to the top of the page
 
+Quote Post
Neytrino
сообщение Jul 25 2009, 16:19
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 26-02-09
Пользователь №: 45 406



Цитата(Vishv @ Jul 25 2009, 20:13) *
Почему Вы определяете направление пина PORTB через PIND?

А можно как-то иначе? я просто начинающий и ещё не совсем понимаю тонкости сия дела

Цитата(Vishv @ Jul 25 2009, 20:13) *
Ну и я совсем не понял - Вы пытаетесь на одном таймере и измерять время и считать импульсы?


конечно нет, время я считаю таймером2, а таймер1 и таймер0 у меня для одновременного подсчета импульсов от 2-х разных источников
Go to the top of the page
 
+Quote Post
Vishv
сообщение Jul 25 2009, 16:54
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 310
Регистрация: 11-07-09
Из: Екатеринбург
Пользователь №: 51 154



PIND относится к PORTD, а к PORTB и DDRB относится PINB !
Выражение "DDRB &= 0;" переводит весь PORTB в режим входов.
Если Вы хотите просто считать импульсы по Т1 тогда не трогайте TCCR1A.
А "TCCR1B = (1 << WGM13) | (1 << CS12) | (1 << CS11) | (1 << CS10); //тактирование по нарастающему фронту импульсов"
замените на "TCCR1B = (1 << CS12) | (1 << CS11) | (1 << CS10); //тактирование по нарастающему фронту импульсов".
TIMSK в этой инициализации тоже трогать не нужно.
Инициализация Т0-аналогично.
Go to the top of the page
 
+Quote Post
Neytrino
сообщение Jul 26 2009, 06:31
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 26-02-09
Пользователь №: 45 406



Цитата(Vishv @ Jul 25 2009, 20:54) *
PIND относится к PORTD, а к PORTB и DDRB относится PINB !
Выражение "DDRB &= 0;" переводит весь PORTB в режим входов.

Вот спасибо Вам, как это я раньше не заметил???? ужас.

Но таймеры все равно не считают вместе sad.gif

Цитата(Vishv @ Jul 25 2009, 20:54) *
А "TCCR1B = (1 << WGM13) | (1 << CS12) | (1 << CS11) | (1 << CS10); //тактирование по нарастающему фронту импульсов"
замените на "TCCR1B = (1 << CS12) | (1 << CS11) | (1 << CS10); //тактирование по нарастающему фронту импульсов".
TIMSK в этой инициализации тоже трогать не нужно.
Инициализация Т0-аналогично.

Если сделать так, то таймеры вообще перестают считать, только что проверил

А так получается либо один работает, либо второй, вместе не хотят
Go to the top of the page
 
+Quote Post
Vishv
сообщение Jul 26 2009, 07:01
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 310
Регистрация: 11-07-09
Из: Екатеринбург
Пользователь №: 51 154



Цитата(Neytrino @ Jul 26 2009, 12:31) *
Вот спасибо Вам, как это я раньше не заметил???? ужас.

Но таймеры все равно не считают вместе sad.gif


Если сделать так, то таймеры вообще перестают считать, только что проверил

А так получается либо один работает, либо второй, вместе не хотят

А почему Вы уверены, что они не считают?
Попробуйте читать таймеры, например в прерывании таймера2(кажется он у Вас отвечает за отсчет времени).
А вообще биты WGхх расшифровываются как Wave Generation т.е. - генерирование.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jul 26 2009, 10:23
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Для начала несколько маленьких замечаний.
1) по команде DDRB &= 0; вы указываете компилятору, что
а) надо взять значение из DDRB
б) сделать AND с 0
в) положить результат в порт DDRB.
Учитывая, что любое значение AND с 0 даст 0, то вы делаете обнуление DDRB тремя командами ассемблера (как минимум). В то же время результат будет тот же, что и после операции DDRB=0; Что эквивалентно одной операции асма.

2) Вы я вижу пользуетесь IARом. Попробуйте почитать на него документацию, а не рваться тупо в бой. Для разрешения прерывания есть функция __enable_interrupt(); Там есть и ряд других, которые вам обязательно понадобятся. Почитайте.

Теперь по существу вопроса.
В первом и последующих операциях у вас написан полный бред. Так при задании таймеру 1
Цитата
TCCR1B = (1 << WGM12) | (1 << CS12) | (1 << CS11) | (1 << CS10); //тактирование по нарастающему фронту импульсов

Ни о каком "тактировании по нарастающему фронту" речи не идёт. Вы запускаете таймер в режиме CTC по OCR1A. Это значит, что ваш таймер будет тактироваться, согласно заданию, частотой с пина T1 по переднему фронту, досчитывать до значения занесённого в OCR1A и сбрасываться в 0. При этом OC1A вы не задали (по умолчанию 0). Я так не пробовал и не могу сказать что будет. Скорее всего он будет считать до переполнения то есть 65536 импульсов. При этом вы в OC1B заносите 0 и разрешаете по нему прерывание. Прерывание у вас будет вызываться либо каждый импульс либо (что скорее всего) через теже 65536 импульсов. То есть в момент когда TCNT будет равно OC1B.
Совершенно очевидно, что вы просто не понимаете что пишете. Обычно так инициализируют если период задают в OC1A, а OC1B отмеряют часть этого периода.

Судя по тому, что вы написали, если я правильно понял, то вы хотите посчитать число импульсов за интервал.
Для этого в таймер 1 надо просто занести (1 << CS12) | (1 << CS11) | (1 << CS10). Пусть просто считает импульсы. Если за отмерянный интервал гарантированно не придёт более 65536 импульсов. (Если может придти, то надо инициализировать прерывание от этого таймера по переполнению TOV и в прерывании тупо считать число переполнений).
Таймер же 0 надо инициализировать в режиме CTC(для задания нужного интервала) и разрешить прерывание от OC1A. В этом прерывании прочитать TCNT1 (число посчитанных импульсов таймером 1) ну и если надо, то ваши переполнения.
Go to the top of the page
 
+Quote Post
Neytrino
сообщение Jul 27 2009, 07:42
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 26-02-09
Пользователь №: 45 406



Так, запутался окончательно sad.gif сейчас попробую
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 12:38
Рейтинг@Mail.ru


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