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

 
 
 
Reply to this topicStart new topic
> Помогите разобраться с PCINT на меге
hwdev
сообщение Jun 19 2009, 08:50
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 334
Регистрация: 1-09-06
Из: Москва
Пользователь №: 20 008



Выбрал atmega325 из-за дешевизны и уже кусаю локти..

Завел сигнал (прямоугольные импульсы) на вход PE2 (PCINT2). Понятно, что на входе есть 0 и 5В.

Инициализирую:
DDRE = BIT1; // TXD
PORTE = BIT2; // PullUp for PE2

EICRA = (1<<ISC01);
EIMSK = (1<<INT0)|(1<<PCIE0); // INT0 + PCIE0
PCMSK0 = PCINT2; // RPM interrupt;

sei(); /* enable interrupts */
bla..bla

Обработчик:
ISR(PCINT0_vect)
{ /* signal handler for external interrupt pcint2 */
rpm1++;
}

По таймеру считываю значение переменной rpm и сбрасываю её в 0, значение передаю по UART. В состоянии покоя линии PE2 (смотрю осциллографом) обработчик PCINT0_vect успевает насчитать 90-96 импульсов за 100мс. Интересный эффект. Делаю проверку на состояние линии, чтобы считать только перепады по одной линии: считает всего 2-3 импульса за 100мс (реально порядка 40 имп/100мс). Пробовал очищать флаг EIFR |= 1<<PCIF0; - опять 2 импульса считает вместо 40.

Кто-нибудь может объяснить где я накосячил?

P.S. Завел тот же сигнал на INT0 - считает всё четко и как надо!
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 19 2009, 09:03
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(hwdev @ Jun 19 2009, 11:50) *
Инициализирую:
DDRE = BIT1; // TXD
PORTE = BIT2; // PullUp for PE2
Что такое BIT1, BIT2?
Go to the top of the page
 
+Quote Post
hwdev
сообщение Jun 19 2009, 09:22
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 334
Регистрация: 1-09-06
Из: Москва
Пользователь №: 20 008



Цитата(Палыч @ Jun 19 2009, 13:03) *
Что такое BIT1, BIT2?

#define BIT1 (1<<1)
#define BIT2 (1<<2)
Go to the top of the page
 
+Quote Post
manul78
сообщение Jun 19 2009, 09:46
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719



Цитата(hwdev @ Jun 19 2009, 12:50) *
Кто-нибудь может объяснить где я накосячил?

P.S. Завел тот же сигнал на INT0 - считает всё четко и как надо!


"Обнаружение фронтов сигналов на выводах INT3...INT0 осуществляется асинхронно, при этом минимальная
длительность импульса, гарантирующая генерацию прерывания, составляет 50 нс. А на выводах INT7...INT4
обнаружение фронтов сигналов происходит синхронно, поэтому минимальная длительность импульса, гаран-
тирующая генерацию прерывания составляет 1 период тактового сигнала МК. Если генерация прерывания
должна происходить по НИЗКОМУ уровню, то он должен удерживаться на выводе до окончания выполнения
текущей команды, в противном случае генерации прерывания не произойдет..."

"Вкурили" уважаемый ? biggrin.gif


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
hwdev
сообщение Jun 19 2009, 09:52
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 334
Регистрация: 1-09-06
Из: Москва
Пользователь №: 20 008



Цитата(manul78 @ Jun 19 2009, 13:46) *
"Обнаружение фронтов сигналов на выводах INT3...INT0 осуществляется асинхронно, при этом минимальная
длительность импульса, гарантирующая генерацию прерывания, составляет 50 нс. А на выводах INT7...INT4
обнаружение фронтов сигналов происходит синхронно, поэтому минимальная длительность импульса, гаран-
тирующая генерацию прерывания составляет 1 период тактового сигнала МК. Если генерация прерывания
должна происходить по НИЗКОМУ уровню, то он должен удерживаться на выводе до окончания выполнения
текущей команды, в противном случае генерации прерывания не произойдет..."

"Вкурили" уважаемый ? biggrin.gif

Я должен вкурить, что у меня импульсы короткие? или что? И при чем тут INT, если у меня PCINT, которые совсем по-другому обрабатываются
Go to the top of the page
 
+Quote Post
manul78
сообщение Jun 19 2009, 10:33
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719



Цитата(hwdev @ Jun 19 2009, 13:52) *
Я должен вкурить, что у меня импульсы короткие? или что? И при чем тут INT, если у меня PCINT, которые совсем по-другому обрабатываются


"Обнаружение фронтов сигналов на выводах PCINT3...PCINT0 осуществляется асинхронно, при этом минимальная
длительность импульса, гарантирующая генерацию прерывания, составляет 50 нс. А на выводах PCINT7...PCINT4
обнаружение фронтов сигналов происходит синхронно, поэтому минимальная длительность импульса, гаран-
тирующая генерацию прерывания составляет 1 период тактового сигнала МК. Если генерация прерывания
должна происходить по НИЗКОМУ уровню, то он должен удерживаться на выводе до окончания выполнения
текущей команды, в противном случае генерации прерывания не произойдет..."

Читайте еще раз ! С "колосальными" исправлениями в тексте специально для Вас...

50 нс - это 20 кГц ! " Меньше можно, больше нельзя..." (С) Госпожа Беладонна. Для PCINT0...PCINT3

Для PCINT4...PCINT7 - максимальная частота это частота работы МК...

Короче, переключитесь уважаемый на любой из PCINT4...PCINT7 и программу отредактируйте под них...
Авось заработает... biggrin.gif

Сообщение отредактировал manul78 - Jun 19 2009, 10:34


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Jun 19 2009, 10:37
Сообщение #7


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Оно (маску сделать забыли, 1 << ...):
Цитата(hwdev @ Jun 19 2009, 12:50) *
PCMSK0 = PCINT2; // RPM interrupt;


А вот это еще и глюков добавит мешок (потому что оператор |= использован -- сбросит флаги имеющиеся или вернет назад уже сброшенные, смотря как прерывания попадут):
Цитата(hwdev @ Jun 19 2009, 12:50) *
EIFR |= 1<<PCIF0;
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jun 19 2009, 10:52
Сообщение #8


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(manul78 @ Jun 19 2009, 14:33) *
50 нс - это 20 кГц !

1/20e3=0,05*1e-3=5e-5=50 мкс, однако laughing.gif


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jun 19 2009, 10:54
Сообщение #9


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(hwdev @ Jun 19 2009, 12:50) *
PCMSK0 = PCINT2; // RPM interrupt;


Кто-нибудь может объяснить где я накосячил?


Как у вас определено PCINT2 ?

может все таки надо так ?

Код
PCMSK0 = 1<<PCINT2; // RPM interrupt;


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
manul78
сообщение Jun 19 2009, 11:09
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719



Цитата(mdmitry @ Jun 19 2009, 14:52) *
1/20e3=0,05*1e-3=5e-5=50 мкс, однако laughing.gif


Извиняюсь, ошибся... crying.gif не кГц а МГц...

Да с INT тоже... с 128-ой Мегой перепутал...

Не мой день... пойду напьюсь... crying.gif


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
hwdev
сообщение Jun 19 2009, 13:07
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 334
Регистрация: 1-09-06
Из: Москва
Пользователь №: 20 008



Цитата(dimka76 @ Jun 19 2009, 14:54) *
Как у вас определено PCINT2 ?

может все таки надо так ?

Код
PCMSK0 = 1<<PCINT2; // RPM interrupt;

Да, правильно вы говорите! Накосячил.. Надо проверить.
Go to the top of the page
 
+Quote Post

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

 


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


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