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

Проблема с подсчетом импульсов ATmega8

Добавлено: Ср мар 18, 2009 14:13:00
Insase
Здравствуйте. Значит купил себе МК ATmega8 поставил внешний кварц на 16 Mhz, прошил фьюзы для его активации, организовал обмен с Com-портом и сел в лужу на самом простом - на подсчете импульсов с ноги МК.

Изначально хотел читать с ноги PC4 ее состояние и от этого рулить:

Код на CVAVR:
while (1) {
if(PINC.4==1) PORTC.5=1; //(LED)
else PORTC.5=0;
};

Но вот тут вся загвоздка: подаю я на PC4-ножку 4.5 вольта и мгновенно срабатывает условие, т.е. в моем случае загорается лампочка, но когда убрать питание от ноги, то происходит непонятная штука - лампочка горит еще несколько секунд, а потом гаснет...

Погрыз я гранит науки, покопался в интернете и пришел к выводу, что нужно счетчик реализовывать с помощью таймера МК. Теории в интернете полно, а вот практики практически нет.

Я думаю задача всем знакомая, может кто-нибудь помочь с этой проблемой? Желательно на CVAVR, т.к. другими компиляторами не я пользовался, да и новичек я в этой области знаний.

Изначальная же задача звучит так: Задано число импульсов - N. Импульсы имеют разную скважность. Требуется посчитать время за которое происходят эти N импульсов и послать значение на com-порт.

Добавлено: Ср мар 18, 2009 14:20:23
Pooher
Самое простое-использовать внешнее прерывание.
В обработчике инкрементировать переменную, а по таймеру выводить её значение и сбрасывать.

Добавлено: Ср мар 18, 2009 14:25:25
Insase
Pooher писал(а):Самое простое-использовать внешнее прерывание.
В обработчике инкрементировать переменную, а по таймеру выводить её значение и сбрасывать.
Проблема в том что с таймером я разобраться то и не могу

Добавлено: Ср мар 18, 2009 14:36:48
Vov123
А может подтяжки входу не хватает?

Re: Проблема с подсчетом импульсов ATmega8

Добавлено: Ср мар 18, 2009 14:44:15
ikarab
Insase писал(а): подаю я на PC4-ножку 4.5 вольта и мгновенно срабатывает условие, т.е. в моем случае загорается лампочка, но когда убрать питание от ноги, то происходит непонятная штука - лампочка горит еще несколько секунд, а потом гаснет...
Подтяжку на ножку включите или резистором определите на ней четко "0" или "1".

Добавлено: Ср мар 18, 2009 14:47:49
Insase
как я понял подтяжка это что то на подобии транзистора?
Посоветуйте какой поставить, если честно нет у меня знаний таких широких

Добавлено: Ср мар 18, 2009 14:52:29
Vov123
сделайте
void main (void)
{
DDRC.4=0;//направление вход
PORTC.4=1//подтяжка на вход

Добавлено: Ср мар 18, 2009 14:56:45
Insase
Vov123 писал(а):сделайте
void main (void)
{
DDRC.4=0;//направление вход
PORTC.4=1//подтяжка на вход
Сделал:
DDRC.4=0;
PORTC.4=1;
while (1)
{
if(PINC.4==1) PORTC.5=1;
else PORTC.5=0;
};

Диод загорелся и не гаснет.

Добавлено: Ср мар 18, 2009 14:56:50
ARV
Vov123 писал(а):сделайте
void main (void)
{
DDRC.4=0;//направление вход
PORTC.4=1//подтяжка на вход
вы забыли сказать, что при этом подавать на ножку надо 0, а не 4,5В, как было раньше... и условие в программе, соответственно, изменить на обратное... а еще надо подавлять дребезг, если "подавание" делается каким-то контактом... не все так просто, как кажется :)

Добавлено: Ср мар 18, 2009 15:02:32
Insase
"подавание" делается с помощью оптоэлектронного реле "5П7".

Добавлено: Ср мар 18, 2009 15:06:22
ARV
Insase писал(а):"подавание" делается с помощью оптоэлектронного реле "5П7".
тогда дребезга скорее всего не будет :)

Добавлено: Ср мар 18, 2009 15:06:28
Insase
Спасибо всем все заработало, осталось понять как с помощью реле подавать не 5V, а теперь уже землю..

Добавлено: Ср мар 18, 2009 15:14:19
ARV
Insase писал(а):Спасибо всем все заработало, осталось понять как с помощью реле подавать не 5V, а теперь уже землю..
есть два пути:
1. включить реле между выводом и общим проводом
2. плюнуть на "подтяжку" и прилепить резистор 1К с вывода на общий, оставив реле, как было (т.е. продолжая подавать 5В)

Добавлено: Ср мар 18, 2009 15:16:42
Vov123
Не просто,а очень просто.Можно,считать низкоуровневые ипульсы,можно поставить подтяжку реальную на землю.
А антидребезг,кому может надо,как вариант
if(!PINB.0){
какой-то код


delay_ms(z);
if(!PINB.0){};//ждём пока отпустим кнопку
delay_ms(z);
}
Ясен перец,что здесь кнопка подключена к земле.