PIC16F876A и АЦП
|
|
ivan_fd |
Дата: Ср, 18.01.2012, 16:10 | Сообщение # 31 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
120 микросекунд - это период, а мы меряем ширину импульса. Которая при скважности 50% равна 60 мкс. У нас показывает 58. Это почти то что надо.
|
|
|
|
Klim |
Дата: Вс, 22.01.2012, 11:45 | Сообщение # 32 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
79
Замечания:
±
На сайте с 21.12.2009
Статус:
Offline
|
Все понятно, спасибо. И последнее - вот тот же самый пример, но на 876a пике. Работать не хочет... Добавлено (22.01.2012, 11.45.02) --------------------------------------------- Разобрался, вместо регистра PIR1 нужно использовать регистр PIR2 и PIE2 соответственно. Нужно было внимательнее читать даташит.
|
|
|
|
Klim |
Дата: Пн, 23.01.2012, 09:40 | Сообщение # 33 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
79
Замечания:
±
На сайте с 21.12.2009
Статус:
Offline
|
C читанием длительности одиночного импульса разобрался. Читает отлично и в эмуляции и в железе. Дальше опять начались грабли... Читает пургу. Кратко опишу процесс. PIC16F628A выдает последовательность импульсов "0001" ориентируясь на нижний фронт (просто имитирует стартовую последовательность ключа Cyfral). PIC16F876A соответсвенно должен зафиксировать длительности импульсов (я сделал пока 16). Алгоритм вроде прост:
1. Отлавливаем нажатие кнопки, чистим дисплей, очищаем переменные. 2. Ждем, пока компаратор не примет значение, которое соответсвует переходу через опорное напряжение по переднему фронту и включаем разрешение на прерывание по компаратору 3. Отлавливаем прерывание компаратора по переходу через задний фронт, обнуляем значение таймера TMR1 и запускаем его. 4. Отлавливаем следующее прерывание компаратора (это будет переход по переднему фронту), выключаем таймер, считаем значение и сохраняем его. Так делаем 16 раз по кругу. 5. Выводим данные на дисплей.
Вроде все просто, но не работает ни в протеусе ни в железе. Читает фигню (хоть вроде как-то и закономерно). Проэкт с подробными коментариями прилагаю.
|
|
|
|
retas |
Дата: Пн, 23.01.2012, 16:45 | Сообщение # 34 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
445
Замечания:
±
На сайте с 10.09.2007
Статус:
Offline
|
На вскидку - не слишком ли шикарно производить расчеты в прерывах --i = (TIMER1 * 200) / 1000 ' Вычисляем время-- И обязательно ли искать значение в мкс, не хватает ли просто смотреть на сколько наполнился таймер?
Сообщение отредактировал
retas - Пн, 23.01.2012, 16:46
|
|
|
|
Klim |
Дата: Пн, 23.01.2012, 17:00 | Сообщение # 35 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
79
Замечания:
±
На сайте с 21.12.2009
Статус:
Offline
|
Я уже это переделал, еще пару часов назад. Читаю просто значение таймера. Ничего не поменялось.
|
|
|
|
ivan_fd |
Дата: Пн, 23.01.2012, 18:11 | Сообщение # 36 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
i = (TIMER1 * 200) / 1000 ' Вычисляем время Это была первая проблема. А далее, Вы просто не разобрались с прерываниями от компаратора. Посмотрите вложение, значение таймера записывается в массив X.
|
|
|
|
Klim |
Дата: Пн, 23.01.2012, 18:50 | Сообщение # 37 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
79
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Все правильно Вы понимаете. В чем собственно неясность?
|
|
|
|
Klim |
Дата: Ср, 25.01.2012, 00:53 | Сообщение # 39 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
79
Замечания:
±
На сайте с 21.12.2009
Статус:
Offline
|
Спасибо огромное. Сейчас привел софт в порядок и все работает. Ошибкой было то, что я в прерывании делал много лишних телодвижений и компаратор успевал сработать еще раз во время вычислений. После максимального укорочения действий все работает. Поистине - хорошее прерывание то, в котором происходит минимальное количество действий. Еще раз спасибо. Скоро начну выкладывать наработки. Добавлено (25.01.2012, 00:53) --------------------------------------------- Ну что, ключики Цыфрал у меня уже в железе читаются безукоризненно. Брал серийный считыватель, и свой - все совпадает 100%. Оптимизирую софт, выложу на обозрение.
|
|
|
|