2014-02-04 3 views
0

У меня есть GPIO-контакт (GP4) на микроконтроллере с непрерывной цифровой импульсной линией, входящей в нее. Я пишу ему на C и не имею прерываний на этом чипе. Я вызываю свой ввод «#define inputA GP4». В C я хотел бы найти положительный фронт импульса и запустить таймер на нем. Я не уверен, что XOR выполнит то, что мне нужно, если в какой-то момент будет хранить inputA в другой переменной. Другая проблема, которая у меня есть, - это то, что мне нужно это сделать, а не попадаться в бесконечный цикл, где я могу делать другие вещи последовательно с моим кодом, если, например, inputA переходит в 0 и постоянно остается на 0. Это означает, что мой вариант использования while (inputA = 0); не может быть и речи. Заранее спасибо!Как эмулировать триггерный флип-флоп?

+0

Вы знаете максимальную частоту сигнала на входе, какие приемлемая задержку между триггером и его обнаружением, частотой, на которой ваше ядро ​​работает, или какой процент ваших циклов вы хотите посвятить другим задачам? – jerry

+0

Мой счетчик программ на моем чипе выполняет инструкции каждые 128us. Входной сигнал имеет частотный диапазон от 25 Гц до 533 Гц. Я хотел бы сохранить задержку минимальной (до 800us). Циклы, с которыми я могу жить с выборкой только каждую секунду или около того. Это не бесконечный процесс любыми способами, и несколько сотен миллисекунд времени между циклами, которые не проверяются, не являются моей проблемой. – Stumpyhuck29

+0

Вы имели в виду '128 ns' вместо' 128 us'? Если вы на самом деле запускаете этот медленный (возможно, режим с низким энергопотреблением?), Я не вижу альтернативы занятому циклу, чтобы получить ответ за так много циклов. Это не означает, что вам нужно блокировать, если сигнал будет привязан к минимуму. Другой вопрос: когда вы говорите, что у вас нет прерываний, вы имеете в виду внешние прерывания или ** любые ** прерывания вообще (например, например, прерывание по таймеру)? – jerry

ответ

4

Вы должны написать старое значение некоторой переменной.

Положительный край определяется по старому значению 0 и новому 1. Вы должны проверить точно, что:

char oldval, newval; 
oldval = inputA; 
while (1) { 
    newval = inputA; 
// if (oldval == 0 && newval == 1) { 
    if (!oldval && newval) { 
     // positive edge 
    } 
    oldval = newval; 
    // do other stuff 
} 
+0

Я не уверен, что этот код будет ждать триггера положительного края. Случай, когда мой импульсный поезд не находится в положительном краевом триггере, и в моем выражении if понимается код. Они не всегда будут происходить одновременно. Другими словами, оператор if будет пропущен, если (! Oldval && newval) не является истинным. – Stumpyhuck29

+0

Предполагая, что цифры в комментарии [@ Stumpyhuck29] (http://stackoverflow.com/questions/21563430/how-to-emulate-an-edge-triggered-flip-flop#comment32569060_21563430) точны, я не думаю, что это вероятно, это сможет удовлетворить их, даже если нет '// делать другие вещи' – jerry

+0

Прошу прощения, мой счетчик программ не выполняет вычисления каждые 128us. На моем PIC12F510 я использую 8 МГц часы с программным счетчиком, который инструктирует на 2 МГц. Это означает, что я буду ПЕРЕГРУЗИТЬ каждый 128us с коэффициентом масштабирования 1: 1. У меня есть опции для коэффициентов предварительного масштабирования от 1 до 256, а тактовые частоты 4 или 8 МГц. – Stumpyhuck29

Смежные вопросы