Страница 1 из 1

ATMega8. Подсчитать импульсы на PD6

Добавлено: Пт фев 17, 2012 13:43:57
kyraxinoff
На ногу PD6 ATMega8 идут импульсы, частоты могут быть разные, не выше 10кГц. Каждые 100 импульсов должно происходить событие, на например 1 на PB0.
Как счетчик организовать используя прерывания или что-то подобное понять не могу, нога то сидит либо просто порт либо на компараторе. Если использую просто опрос состояния порта PIND. То не которые импульсы Атмега не ловит. Прошу помочь в этом всем разобраться.

Вот пример последнего кода:

инициал портов оставил в мэине. It глобальная переменная.
10 выбрал, для удобства подсчета импульсов на осциле, PORTC добавил что бы видеть, что оно там себе насчитало.


void IT (void)
{
while (It<10)
{
while (bit_is_set(PIND,PD6))
{
if (bit_is_clear(PIND,PD6))
{
PORTB&=~_BV(PB1);
It=It++;
}
}
}

PORTC=It;
It=0x00;
PORTB|=_BV(PB1);
}

Re: ATMega8. Подсчитать импульсы на PD6

Добавлено: Пт фев 17, 2012 14:16:31
akl
Задействовать прерывание от аналогового компаратора или прерывание по захвату таймером Т1 события прихода активного уровня сигнала. Странно, что у Вас пропуски импульсов при опросе. Какая частота тактирования? Чем еще занят контроллер?

Re: ATMega8. Подсчитать импульсы на PD6

Добавлено: Пт фев 17, 2012 14:20:41
Meteor
akl писал(а):Странно, что у Вас пропуски импульсов при опросе. ...Чем еще занят контроллер?
На правах оффтопа
Контроллер занят пропуском импульсов!
Видимо по причине дребезга

Re: ATMega8. Подсчитать импульсы на PD6

Добавлено: Сб фев 18, 2012 13:32:45
ut1wpr
kyraxinoff писал(а):На ногу PD6 ATMega8 идут импульсы, частоты могут быть разные, не выше 10кГц. Каждые 100 импульсов должно происходить событие, на например 1 на PB0.
Как счетчик организовать используя прерывания или что-то подобное понять не могу, нога то сидит либо просто порт либо на компараторе. Если использую просто опрос состояния порта PIND. То не которые импульсы Атмега не ловит. Прошу помочь в этом всем разобраться.
1. PD7 на среднюю точку делителя 2х10К между GND и +5V. Импульсы - на PD6. Гораздо лучше было бы импульсы подавать на PD5. Или хотя бы на PD2 либо PD3. Это уже от схемотехники зависит.
2. Написать обработчик по вектору прерывания от компаратора (Собственно сам счетчик). Не забыть объявить переменную счетчика как volatile.
3. В ините разрешить компаратор вообще (по умолчанию он выключен после сброса).
4. Разрешить прерывание от компаратора.
5. Разрешить глобальные прерывания.
Если импульсы чистые и без дребезга - наслаждаться их правильным подсчетом. Если дребезжит - избавляться от дребезга аппаратно или программно.
Вуаля.