Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » PIC16F876A и АЦП (как оцифровать микросекундные импульсы?)
PIC16F876A и АЦП
ivan_fd Дата: Ср, 18.01.2012, 16:10  |                                                                                                                Сообщение # 31
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

120 микросекунд - это период, а мы меряем ширину импульса. Которая при скважности 50% равна 60 мкс.
У нас показывает 58. Это почти то что надо.
ЯНДЕКС Дата: 18.01.2012
Klim Дата: Вс, 22.01.2012, 11:45  |                                                                                                                Сообщение # 32
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

Все понятно, спасибо. И последнее - вот тот же самый пример, но на 876a пике. Работать не хочет...

Добавлено (22.01.2012, 11.45.02)
---------------------------------------------
Разобрался, вместо регистра PIR1 нужно использовать регистр PIR2 и PIE2 соответственно. Нужно было внимательнее читать даташит.

Прикрепления: 1933052.zip (56.9 Kb)
Klim Дата: Пн, 23.01.2012, 09:40  |                                                                                                                Сообщение # 33
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

C читанием длительности одиночного импульса разобрался. Читает отлично и в эмуляции и в железе. Дальше опять начались грабли... Читает пургу.
Кратко опишу процесс. PIC16F628A выдает последовательность импульсов "0001" ориентируясь на нижний фронт (просто имитирует стартовую последовательность ключа Cyfral). PIC16F876A соответсвенно должен зафиксировать длительности импульсов (я сделал пока 16). Алгоритм вроде прост:

1. Отлавливаем нажатие кнопки, чистим дисплей, очищаем переменные.
2. Ждем, пока компаратор не примет значение, которое соответсвует переходу через опорное напряжение по переднему фронту и включаем разрешение на прерывание по компаратору
3. Отлавливаем прерывание компаратора по переходу через задний фронт, обнуляем значение таймера TMR1 и запускаем его.
4. Отлавливаем следующее прерывание компаратора (это будет переход по переднему фронту), выключаем таймер, считаем значение и сохраняем его. Так делаем 16 раз по кругу.
5. Выводим данные на дисплей.

Вроде все просто, но не работает ни в протеусе ни в железе. Читает фигню (хоть вроде как-то и закономерно). Проэкт с подробными коментариями прилагаю.
Прикрепления: Reader.zip (19.6 Kb)
retas Дата: Пн, 23.01.2012, 16:45  |                                                                                                                Сообщение # 34
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 447
Репутация: 11   ±
Замечания:   ±
На сайте с 10.09.2007

Статус: Offline

На вскидку -
не слишком ли шикарно производить расчеты в прерывах
--i = (TIMER1 * 200) / 1000 ' Вычисляем время--
И обязательно ли искать значение в мкс, не хватает ли просто смотреть на сколько наполнился таймер?

Сообщение отредактировал retas - Пн, 23.01.2012, 16:46
Klim Дата: Пн, 23.01.2012, 17:00  |                                                                                                                Сообщение # 35
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

Я уже это переделал, еще пару часов назад. Читаю просто значение таймера. Ничего не поменялось.
ivan_fd Дата: Пн, 23.01.2012, 18:11  |                                                                                                                Сообщение # 36
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

i = (TIMER1 * 200) / 1000 ' Вычисляем время Это была первая проблема. А далее, Вы просто не разобрались с прерываниями от компаратора.
Посмотрите вложение, значение таймера записывается в массив X.
Прикрепления: 6910962.zip (55.9 Kb)
Klim Дата: Пн, 23.01.2012, 18:50  |                                                                                                                Сообщение # 37
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

Спасибо, буду вечером ковыряться.

Пришел. Пытался вникнуть... Или под вечер уже башка не варит, или где-то совсем торможу... Запутался окончательно. Если раньше работу компаратора и прерывания по нему представлял (насколько я понял - неправильно), то теперь совсем все перепуталось... Попытаюсь обьяснить на пальцах, как я это себе представлял.
1. Настраиваем регистры. В данном случае регистр CMCON, который настраивает компараторы и регистр CVRCON, отвечающий за опорное напряжение.
2. Допустим, я настроил опорное напряжение 2 вольта.
3. Включаем разрешение на прерывание. (вот дальше начинается самое интересное)
4. При превышении на входе порта А.0 напряжения 2 вольта срабатывает прервание и в CMCON.6 заносится 0 (или единица, если сигнал инвертируется). При понижении напряжения ниже 2 вольт опять срабатывает прерывание и в CMCON.6 заносится 1 (или ноль при инвертном сигнале). Можно мне, как недогадливому, обьяснить, где конкретно я ошибаюсь? Или просто на пальцах обьяснить принцип прерывания по компаратору и его обработки... Заранее очень сильно благодарю.

Сообщение отредактировал Klim - Вт, 24.01.2012, 00:09
ivan_fd Дата: Вт, 24.01.2012, 01:11  |                                                                                                                Сообщение # 38
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Все правильно Вы понимаете. В чем собственно неясность?
Klim Дата: Ср, 25.01.2012, 00:53  |                                                                                                                Сообщение # 39
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 0   ±
Замечания:   ±
На сайте с 21.12.2009

Статус: Offline

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

Добавлено (25.01.2012, 00:53)
---------------------------------------------
Ну что, ключики Цыфрал у меня уже в железе читаются безукоризненно. Брал серийный считыватель, и свой - все совпадает 100%. Оптимизирую софт, выложу на обозрение.

Форум Picbasic.ru » Программирование МК » Proton PicBasic » PIC16F876A и АЦП (как оцифровать микросекундные импульсы?)
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Поиск: