На ногу 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);
}
ATMega8. Подсчитать импульсы на PD6
-
kyraxinoff
- Родился
- Сообщения: 13
- Зарегистрирован: Пн апр 19, 2010 09:58:37
- Реклама
Re: ATMega8. Подсчитать импульсы на PD6
Задействовать прерывание от аналогового компаратора или прерывание по захвату таймером Т1 события прихода активного уровня сигнала. Странно, что у Вас пропуски импульсов при опросе. Какая частота тактирования? Чем еще занят контроллер?
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Re: ATMega8. Подсчитать импульсы на PD6
На правах оффтопаakl писал(а):Странно, что у Вас пропуски импульсов при опросе. ...Чем еще занят контроллер?
Контроллер занят пропуском импульсов!
Видимо по причине дребезга
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Re: ATMega8. Подсчитать импульсы на PD6
1. PD7 на среднюю точку делителя 2х10К между GND и +5V. Импульсы - на PD6. Гораздо лучше было бы импульсы подавать на PD5. Или хотя бы на PD2 либо PD3. Это уже от схемотехники зависит.kyraxinoff писал(а):На ногу PD6 ATMega8 идут импульсы, частоты могут быть разные, не выше 10кГц. Каждые 100 импульсов должно происходить событие, на например 1 на PB0.
Как счетчик организовать используя прерывания или что-то подобное понять не могу, нога то сидит либо просто порт либо на компараторе. Если использую просто опрос состояния порта PIND. То не которые импульсы Атмега не ловит. Прошу помочь в этом всем разобраться.
2. Написать обработчик по вектору прерывания от компаратора (Собственно сам счетчик). Не забыть объявить переменную счетчика как volatile.
3. В ините разрешить компаратор вообще (по умолчанию он выключен после сброса).
4. Разрешить прерывание от компаратора.
5. Разрешить глобальные прерывания.
Если импульсы чистые и без дребезга - наслаждаться их правильным подсчетом. Если дребезжит - избавляться от дребезга аппаратно или программно.
Вуаля.
С уважением,
Виктор.
Виктор.

