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

Подсчет каждого нечетного импульса

Добавлено: Пн ноя 17, 2008 18:40:42
Digital
Подскажите пожалуйста!

Не пойму как реализовать (пользуюсь cvavr) подсчет каждого нечетного импульса. Может кто-нибудь посоветовать? Задача такая: в бесконечном цикле отсчитывать пачку из 58 импульсов, затем пауза на 2 импульса и т.д., а по каждой нечетной пачке генерировать 1 импульс. Но получается только на каждую пачку генерить :(

Добавлено: Пн ноя 17, 2008 21:39:23
Aheir
Ну так заведите переменную, которая будет увеличиваться на 1 при приеме каждой новой пачки и по нечетному значению этой переменной генерируйте нужный импульс. :)

Re: Подсчет каждого нечетного импульса

Добавлено: Пн ноя 17, 2008 23:24:08
TechMike
Digital писал(а):Подскажите пожалуйста!

Не пойму как реализовать (пользуюсь cvavr) подсчет каждого нечетного импульса. Может кто-нибудь посоветовать? Задача такая: в бесконечном цикле отсчитывать пачку из 58 импульсов, затем пауза на 2 импульса и т.д., а по каждой нечетной пачке генерировать 1 импульс. Но получается только на каждую пачку генерить :(


Включаеш прерывание по фронту внешнего импульса, например на ноге INT0 и накапливаеш в переменной кол-во выходов в прерывание. На нужном значении переменной, дергаеш еще какой-либо ногой МК. далее возможны вариации.....

Добавлено: Пн ноя 17, 2008 23:35:40
Dr. Alex
Или завести переменную, которая увеличивается на 1. Когда переменная будет равна 2, выдавать нужную тебе пачку и сбрасывать переменную в 0.
Так и получится каждый чётный импульс...

Добавлено: Пн ноя 17, 2008 23:47:55
kostya740
Я б не использовал увелечение переменной(инкремент). можно упереться в предел значения переменной. пробуй мой вариант.

Код: Выделить всё

bit chet = 0;
if(chet == 1)
{
      // сдесь твои операции четного кода

      chet = !chet;
}
else
{
     chet = !chet;
}

Подсчет каждого нечетного импульса

Добавлено: Вт ноя 18, 2008 19:31:10
Digital
Спасибо за советы, обдумаю еще раз, попробую на недельке. Сначала думал тоже о переменной, но не смог сформулировать условие нечетности числа (как запрограммировать условие, что число считать нечетным, если оно не делится без остатка на 2). Может есть у кого варианты реализации этого условия?

Добавлено: Вт ноя 18, 2008 19:34:54
kostya740
Деление числа без остатка.

Код: Выделить всё

if(!(x%2))
{
}


Но я б использовал мой вариант выше. Тактов процессор должен тратить меньше.

Подсчет каждого нечетного импульса

Добавлено: Вт ноя 18, 2008 19:43:13
Digital
Обязательно попробую все варианты.

Добавлено: Вт ноя 18, 2008 20:03:22
Кашпо
микропроцессорное зажигание мутите ;) ?

Re: Подсчет каждого нечетного импульса

Добавлено: Вт ноя 18, 2008 21:25:37
smac
Digital писал(а):Спасибо за советы, обдумаю еще раз, попробую на недельке. Сначала думал тоже о переменной, но не смог сформулировать условие нечетности числа (как запрограммировать условие, что число считать нечетным, если оно не делится без остатка на 2). Может есть у кого варианты реализации этого условия?

Младший бит числа проверить, если 0 - четное.
например счетчик

Код: Выделить всё

unsigned char count=0
...
if (!(count&0b1)){
do something
}

инкрементировать естественно по приему каждой пачки импульсов, если упрестя в конечное значение - должен с нуля считать начать

Подсчет каждого нечетного импульса

Добавлено: Ср ноя 19, 2008 18:31:44
Digital
Кашпо писал(а):микропроцессорное зажигание мутите ;) ?

Нет, девайс попроще. имитатор сигнала датчика положения КВ для проверки контроллера инжектора на "столе".

Подсчет каждого нечетного импульса

Добавлено: Чт ноя 20, 2008 19:51:06
Digital
Выкладываю, так сказать, побочный продукт обсуждаемой темы. Может кому-нибудь пригодится. Это делитель частоты на 2, ну или аналог Т-триггера, без использования таймеров МК AVR. Нужная частота задается функцией delay_us(х) или delay_ms(х).

//Компилятор CodeVisionAVR
#include <mega16_h>
#include <delay_h>
unsigned char chet;
void initialization(void)
{
PORTA=0; DDRA=0;
PORTB=0x3F; DDRB=0xC0;
PORTC=0; DDRC=0;
PORTD=0; DDRD=0;
}
void main(void)
{
initialization();
while(1)
{
PORTB.6^=(1<<0);
delay_us(1250);
chet++;
if((chet%2)==1)
{
PORTB.7^=(1<<0);
}
}
}

P.S. с определением нечётности разобрался. Всем ответившим спасибо.

Добавлено: Чт ноя 20, 2008 19:56:30
Igor_67
Ну ты паришься!? Смотри пост выше у Kostya740! Там всё правильно! Чёт-нечёт. Какие проблемы?

Подсчет каждого нечетного импульса

Добавлено: Чт ноя 20, 2008 21:11:56
Digital
Igor_67 писал(а):Ну ты паришься!? Смотри пост выше у Kostya740! Там всё правильно! Чёт-нечёт. Какие проблемы?


No problem, sir :)

Добавлено: Чт ноя 20, 2008 21:14:06
Igor_67
Ну так и чё???

Подсчет каждого нечетного импульса

Добавлено: Чт ноя 20, 2008 21:24:16
Digital
Igor_67 писал(а):Ну так и чё???


хм. ??? По этой теме ничего.
Другие проблемы еще не сформулировал.