Свежие обсуждения
Микроконтроллеры

Микроконтроллерный датчик пульса

1 6

Если процедуру обработки прерывания заменить на написаную на ассемблере (т.е. перебор разрядов и вывод на порт "билибурды"), то мерцания не видно (возможно работает на штатной частоте).
Сравнивал полченые процедуры на АСМе. Вроде начало и конец идентичные и вроде бы никаких задержек в выполнении не должно быть, но возникает такое ощущение, что при написании нескольких строчек на Си, обработка прерывания без внешнего тактового генератора очень сильно притормаживается, т.к. остальной код идентичный.
Последний элементарный пример кода см. выше во вложении.

Мигать светодиодом в самой программе еще не пробовал, т.к. все время нужен сканер и передергивать кабель не очень хочется.
З.Ы. В выходные нарынке выдел PCI плату с одним LPT и двумя COM- портами (~20 у.е.). Думаю взять.

 

А я все "лопачу" программу.
Переписал на ассемблере процедуру обработки кнопок и динамическую индикацию. Но по прежнему слайдшоу

Еще раз проверил длительность обработки прерывания (максимальная) - выходит до 170 команд, плюс стоит делитель "RTCC_DIV_16". В эмуляторе работает на штатной частоте обновления.

 

Сергей, а может в "консерватории" что поправить? В смысле, пересоберите железо, попробуйте другую печатку. Мне пару раз помогало одолеть "необъяснимые" глюки. Полностью отлаженная в протеусе программа, в железе работала непредсказуемым образом. Переразвел печатку - и вуаля!

 

Сергей К:

пролистал страницы, не нашёл вопроса.... сори, может пропустил.
Я так понял - информация на индикаторе медленно обновляется? Правильно я понимаю, что сама "смена кадров" идёт быстро (т.е. горят все индикаторы), а обновление происходит в режиме слайд-шоу? Смотрети как данный глюк я обошёл в своей программе.

это в ПРЕРЫВАНИИ:

if (refresh)
{
refresh = 0;
for (i = 0; i = 7; i++)
od[i] = d[i];
};

Это, для примера, в тексте программы

d[0] = '-';
d[1] = 'H';
d[2] = 'E';
d[3] = 'L';
d[4] = 'L';
d[5] = '0';
d[6] = '1';
d[7] = '-';
refresh = 1;

Поясняю - массив д - текущей массив, где хранится инфа о индикаторах. Массив ob - то, что выводится в данный момент. Обновление происходит без потерь в прерывании, когда вся нужная информация занесена в массив d (о чём свидетельствует refresh)

PS: подобное решение нашёл в журнале радио..

 

нет, тут немного сложнее.
У меня PIC16F628A. К нему подключен светодиодный дисплей (7-ми сегментный, 4 цифры). Идникация динамическая
По сигналу прерывания я вывожу "следующую" цифру информацию.
Если я запускаю МК с кварцевым резонатором на 4МГц, то все отлично работает, но вот если я вибираю внутрений генератор - получаю частоту обновления (сканирования дисплея) немного больше 1Гц.

Опытным путем я выяснил, если процедуру вывода информации на дисплей написать на ассемблере - то все работает нормально в обоих случаях. Но если она написана на Си - то слайдшоу.
Переписал программу вывода информации на ассемблере - работает.
Добавил обработку кнопок и счетчик (ну там в программе считает импулься) - "слайдшоу".
Сейчас хочу еще раз поблочно прогнать разные участки кода, чтобы более точно локализировать причину.

З.Ы. Ног не хватает, поэтому использован внутрений генератор. Да и плата уже готовая и кварц некуда подключить

 

Сергей К: вот если я вибираю внутрений генератор - получаю частоту обновления (сканирования дисплея) немного больше 1Гц.
внутренний на сколько ? Может надо просто изменить коэфф. предделителя?

 

у меня похожая схемка...счётчик импульсов...тот же пик ..кнопки...и внутренний
генератор...никаких проблем правда писал на бейсике...

 

Вообще имеется неплохой специализированный датчик для реализации пульсоксиметров - TSL230R, который производит компания TAOS.
http://www.taosinc.com/index.asp
На сайте есть пример реализации пульсоксиметра на основе этого датчика и PIC16F873. Конечно целесообразность применения подобного специализированного датчика определяется бюджетом проекта.

 

Это-ж только приемник, а там и осветители с нормированным спектром нужны.

 

Проблема с динамической индикацией оказалась в первых строках инициализации МК. Там была строчка "setuposcillator(false)". После ее удаления все заработало как нужно.

Пульсометр я так и не собрал, а сам "спидометр" для тренажера уже работает....

 
1 6