Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2017, 14:46   #1
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию Как настроить счетчик импульсов на с++?

У меня на с++ под досом, на вход lpt порта приходит сигнал с генератора на 10ю ножку lpt порта, этот сигнал тупо считываю командой с++
Код:
...
result=inportb(0x379); //port+1
if (result & 0x40) // проверяю наличие 7го бита порта lpt
...
и проверяю что там 0 или 1, но мне этого недостаточно, мне нужно по фронту переключения сигнала с 0 на 1 увеличивать на единицу значение счетчика
Код:
i8++;
и не могу сообразить как это сделать, пробую через флаг.
Допустим в момент запуска программы порт LPT (ЛПТ) находился в низком уровне (теоретически он может быть в любом), но пусть пока в нижнем
Код:
...
flag=0; //флаг защелки фронта сигнала с генератора
while (i8>1000)//0 новый "круг"  общего цикла
{
   result=inportb(0x379); //port+1
    if (result & 0x40) // 1. проверяю наличие 7го бита порта lpt - нет тут 0
     {
        if (flag==1)  //2. нет это условие не работает
          {
             <действие (Д.1)>
           }
        else  //3. lpt низкий, тоже пропускаем
           {
           <действие (Д.2)>
           }
      } //4. Проверка lpt закончилась идем на 2й круг общего цикла
} //5. конец общего цикла
...
Таким образом цикл крутится пока сигнал с генератора держится в низком уровне. Далее на генераторе проходит передний фронт (переключение с 0 на 1). ЛПТ порт переключается тоже с 0 на 1=> срабатывает п.1 => п.3 и вот тут в действие 2 можно поставить I8++;
А далее мне надо, что бы при очередном круге общего цикла у меня не увеличился счетчик на 1, т.к уровень ЛПТ все еще стоит высокий, надо куда-то поставить флаг и проверять где то в цикле наличие этого флага.
Сразу за I8++; ставлю flag=1 (тогда на следующем круге инкриминация не включится)...,но что то пока не очень получается, может конечно упростить задачу и написать короткий код и на нем методом тыка отладить или подскажете как это можно сделать?
седьмой вне форума Ответить с цитированием
Старый 13.06.2017, 15:05   #2
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 734
По умолчанию

Я не понял Ваше сообщение. Путаница с переменными i8 и I8. Вы бы назвали их как-то по разному, тогда легче было-бы и понятнее.
Также непонятно, елис Вы пишете что i8 прибавляется на 1, то тогда зачем вот этот цикл:
Цитата:
Сообщение от седьмой Посмотреть сообщение
Код:
while(i8>1000)//0 новый "круг"  общего цикла
Такое чувство, что i8 имеет какое-то большое значение(2000) и, наоборот, уменьшается на 1.
Системы событий нету в LPT порте? Насколько я помню - нету. Следовательно остается единственный вариант - постоянно принимать данные с порта в бесконечном цикле работы и следить когда на нужном пине 0 переидет в 1.
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Старый 13.06.2017, 15:28   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от седьмой Посмотреть сообщение
подскажете как это можно сделать
В конце цикла сохраняйте каждое полученное значение в переменную.
Таким образом прочитав текущее состояние у вас еще будет и предыдущее.
Если текущее 1 а предыдущее 0 тогда увеличиваем.
waleri на форуме Ответить с цитированием
Старый 14.06.2017, 07:18   #4
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
Я не понял Ваше сообщение. Путаница с переменными i8 и I8.
Спасибо за ответ, это одно и тоже, просто у меня программа привязана к железу и находится на одном компе, а интернет на другом и приходится руками перебивать код что бы задать вопрос на форуме, это трудно понять, я понимаю, просто у нас колхоз и интернет ограничен и не у всех...
Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
Системы событий нету в LPT порте? Насколько я помню - нету.
на LPT есть аппаратное прерывание как раз на контакте 10, но смысла особого нет его использовать, так как комп только этим одним и занимается что ждет сигналы с генератора. Компьютер находится под досом, нет ни фоновых заданий, ни параллельных процессов как в винде. Поэтому пока просто в бесконечном цикле жду на входе сигналы с генератора.
Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
Такое чувство, что i8 имеет какое-то большое значение(2000)
нет это значение поставил просто для отладки, что бы поймать ответные импульсы, которые использую для отладки программы. Я вывел на осциллограф дополнительно 17ю и 14ю ножку LPT порта, что бы проверить работу программы. Так на каждый фронт сигнала с генератора (с 0 на 1) на 10 ноге LPT порта я формирую на 17й ноге импульс на 10 мс и проверяю отработку программы, этот импульс у меня проходит и осциллограф его фиксирует, когда программа настроена в постоянном цикле. На самом деле с генератора должно прийти ровно 50 периодов, но использовать для работы я могу только 10, то есть мне нужно считать фронты. Для отладки этого режима я использую 14ю ножку LPT порта, что бы вывести на экран каждый 5й фронт сигнала с генератора на экран осциллографа в виде короткого импульса в 10 мс.
И вот это у меня последнее на 14 ноге не получается. Так как фронты считаются не правильно.

Последний раз редактировалось седьмой; 14.06.2017 в 07:34.
седьмой вне форума Ответить с цитированием
Старый 14.06.2017, 07:32   #5
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 734
По умолчанию

Посмотрите это прерывание получше, может он(компьютер) его будет ждать 2 процессом.
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Старый 14.06.2017, 07:39   #6
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
В конце цикла сохраняйте каждое полученное значение в переменную.
Спасибо, да я так и пошел делать и у меня получилось, но фронты считаются не правильно. Я сейчас все же перекопирую сюда реальный код, а то так чувствую не смогу объяснить что хочу получить. Спасибо что не отказали в помощи.
седьмой вне форума Ответить с цитированием
Старый 14.06.2017, 07:42   #7
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
Посмотрите это прерывание получше, может он(компьютер) его будет ждать 2 процессом.
Спасибо большое, я конечно это учту и посмотрю, я читал что в досе тоже есть процессы, но не обратил на это должного внимания. Но пока мне важна не скорость сама по себе, а отработка алгоритма в целом, я сейчас перкопирую все что у меня получилось
седьмой вне форума Ответить с цитированием
Старый 14.06.2017, 07:47   #8
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 734
По умолчанию

Смысл прерывания в том, что оно делается само по себе(это я беру теорию микроконтроллеров). Если здесь работает также, то Вы его просто заряжаете и ждете пока придет фронт импульса. По его приходу срабатывает обработчик прерывания.
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Старый 14.06.2017, 08:41   #9
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 734
По умолчанию

В какой среде Вы пишете, седьмой? Я чувствую, что здесь нужно будет на ассемблере писать и прерывания плотно изучать.
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Старый 14.06.2017, 10:08   #10
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
Я чувствую, что здесь нужно будет на ассемблере писать
О простите не написал ms-dos6.22 BorlandC++ 3.0

вот код
Код:
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#include <time.h>


	int main(void)
{
   unsigned char result;
   int port = 0x378; //LPT

   int flag=1;
  while (1)
   {
   result=inportb(port+1);
   if (	result & 0x40)
      {
	if (flag==1)
	{
	outportb(port+2,0xF8); //CR3 3й бит регистра base+2
	delay(10);
	outportb(port+2,0xF0);
	
	flag=0;
	}
      }
      else
      flag=1;
    }


}
Сейчас добавлю картинку
Изображения
Тип файла: jpg gener.jpg (105.0 Кб, 155 просмотров)

Последний раз редактировалось седьмой; 14.06.2017 в 10:47.
седьмой вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
com-порт счетчик импульсов Ciganqwer Компоненты Delphi 2 10.11.2016 09:37
Счетчик импульсов с ком-порта, глюк ? z-wer Общие вопросы Delphi 13 07.07.2011 15:33
Счетчик импульсов через ком-порт z-wer Компоненты Delphi 10 21.05.2011 11:01
Счетчик импульсов на LPT. Delphi clone_ Общие вопросы Delphi 7 29.04.2011 01:29
Счетчик импульсов stanik123 Общие вопросы Delphi 11 09.10.2009 10:10