АвторСообщение





Пост N: 5
Зарегистрирован: 28.01.13
Рейтинг: 0
ссылка на сообщение  Отправлено: 28.01.13 16:36. Заголовок: Непропорциональный сдвиг частоты PIC16F84A ASM


Необходимо самостоятельно сделать программу - сдвиг частоты:
Если на входе X (Гц), то на выходе Y (Гц)
67>45
52>43
40>40
Цель - "обмануть" мозг сплит/системы ДЭО, там три ступени потока воздуха, которые почти ни отличаются, проц (ПО сплита таково, что) поддерживает кол.импульсов 40,43,45 (скорость)поступающих с датчика Холла с мотора вентилятора внутреннего блока, но этого очень мало, короче ДЭО накосячили. причём на другом сплите такая-же картина, так что проблема в ПО
На данный момент, ради экспериманта, просто поставил "в разрыв" триггер на 155ТМ2, чисто пополам делит, но так лишь (ессно) максимальная скорость.

Вроде, как я частично программу оформил, но пока всё как-то разрозненно. Мне тяжело понять, как организовать ежесекундный (с выборкой в 1 сек, достаточно) учёт входящей частоты независимо от выходящей частоты?
Может Таймер использовать? и каждую секунду считывать его и потом обнулять?

Я сейчас на уровне развития - 1часть Самоучителдя КЕА и всё. На практике (в "железе"), для тренировки написал программу динамической индикации со счётом нажатий на кнопки +1, -1, ну и ещё несколько работ в "железе" тоже для практики. Потому пока что весьма тяжко, маловато знаний.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 55 , стр: 1 2 All [только новые]


постоянный участник


Пост N: 349
Зарегистрирован: 25.09.09
Откуда: г.Саратов
Рейтинг: 1
ссылка на сообщение  Отправлено: 28.01.13 18:47. Заголовок: Правильно ли я понял..


Правильно ли я понял: есть некая коробочка на вывод "вход" которой может приходить одна из трех частот 67, 52, 40 Гц. На выводе "выход" должны выдаваться, соответственно, 45, 43, 40 Гц.
Скорость реакции на изменение (анализ "входа", перестройка внутреннего генератора, возможные вычисления....) может быть до 1 сек.
Если так, то я бы 1) научился измерять длительность (частоту) входного импульса, чтобы отличать три частоты друг от друга.
Затем 2) научился формировать требуемые частоты на выводе "выход".
Потом связал эти два процесса тремя сценариями соответствия.
Думаю, про измерения импульсов с помощью МК и их формированию написано достаточно. На любом уровне и разными средствами.

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 258
Зарегистрирован: 10.02.11
Откуда: Россия
Рейтинг: 3
ссылка на сообщение  Отправлено: 28.01.13 19:59. Заголовок: fugi1 пишет: 67..


fugi1 пишет:

 цитата:

67>45
52>43
40>40

А если на входе будет 69 или 23, или вообще 0 ? Что делать ? Или частоты будут идти чётко фиксированными ?
И ещё, частота то частотой, форма сигнала какая ?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 7
Зарегистрирован: 28.01.13
Рейтинг: 0
ссылка на сообщение  Отправлено: 28.01.13 22:21. Заголовок: Форма сигнала приход..


Форма сигнала приходит от датчика холла. потому прямоугольник
А вот частота на входе (67-40), да, именно будет разная, от 0 до 68 Гц в зависимости от оборотов мотора вентилятора, а обороты зависят от ШИМ управления мотором от процессора, который и "нюхает" эти частоты, вот только поддерживает проц те самые 40-45 Гц, а этого мААло
Вот потому и надо "преподнести" процессору эти три "фиктивные", т.е. подменённые частоты 40, 43 и 45 гц., когда мотор выдаст от максимума (67Гц) до минимума(40Гц)

Думаю частота "выборки" достаточно не чаще 1 секунды, но можно и чаще

С нулём на входе (нет оборотов) - команда ветвления в зависимости от флага С, если меньше 10Гц, то на выходе 0Гц и по команда по другому кругу
С изменением частот на выходе счётчик с изменяемой переменной Х
Эта переменная получается в результате возврата из addwf,PC
Пока не могу придумать, как получить стабильный интервал измерения частоты на входе, ведь на выходе частота меняется в зависимости от переменной


Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 570
Зарегистрирован: 01.03.11
Рейтинг: 3
ссылка на сообщение  Отправлено: 29.01.13 00:12. Заголовок: Очень сумборно. Напи..


Очень сумборно.
Напишите, алгоритм хотя бы на уровне структурной схемы, что надо делать. "Процессор" это мк? в Вашем понимание.

"как получить стабильный интервал измерения частоты на входе, ведь на выходе частота меняется в зависимости от переменной "

А какая разница, что меняется частота на входе? У частотомеров она тоже в определенном ( и не маленьком) диапазоне. Считайте импульсы за фиксированный промежуток времени. Или измеряйте период. По нему частоту получите. Если нужна в этом помощь, поможем. Только надо понять четко что надо

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 8
Зарегистрирован: 28.01.13
Рейтинг: 0
ссылка на сообщение  Отправлено: 29.01.13 00:44. Заголовок: Вот структурно. htt..


Вот структурно. Вот так надо сделать.



В сплит-системе оборотами мотора внутреннего блока управляет процессор сплита при помощи ШИМ (синхронизированной с 50Гц)
При этом проц сплита получает сигнал от датчика Холла в моторе и таким образом поддерживает обороты.
В моей ситуации программисты сплита ДЭО заложили три поддерживаемые частоты : 40,43,35 гц, т.е. импульсов в сек.

В этом и есть косяк, что этой разницы в несколько импульсов мало, сплит на всех скоростях еле дует.
Вот и появилась задача (пока зима на дворе) практико-материальная. И для мозга труд и толк будет.

В данный момент не могу допереть, как одновременно и выдавать частоту (которая будет меняться) и считать импульсы в 1 сек?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 350
Зарегистрирован: 25.09.09
Откуда: г.Саратов
Рейтинг: 1
ссылка на сообщение  Отправлено: 29.01.13 07:16. Заголовок: fugi1 пишет: В спли..


fugi1 пишет:

 цитата:
В сплит-системе оборотами мотора внутреннего блока управляет процессор сплита при помощи ШИМ (синхронизированной с 50Гц)


"Гусь заговорил громко, горячо и непонятно." - из детской сказки. Не обижайся, но если решил ставить МК, то придется учиться. Возможно несколько больше узнать, чем нужно для задачи. Зажечь светодиод просто, управлять им через МК - совсем другое. Задачу придется решать тебе и доступными тебе средствами. Отрешись для начала от флажков и переменных. Вообрази себя МК. Что ты получаешь извне, что ты можешь как МК и что надо выдать потребителю. Алгоритм работы устройства за тобой. Попробуй без фантазии и лирики описать его коротко и внятно 1)...,2)...3)...Это самая трудная часть задачи, я думаю.
Вопросы заданы, советов достаточно. Дело за тобой.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 9
Зарегистрирован: 28.01.13
Рейтинг: 0
ссылка на сообщение  Отправлено: 29.01.13 08:12. Заголовок: Я не обижаюсь и учит..


Я не обижаюсь и учиться не против ...да вся жизнь есть учёба... (чессно сказать, не пойму что именно не понятно во фразе выше?)

Вячеслав пишет:

 цитата:
и лирики описать его коротко и внятно 1)...,2)...3



fugi1 пишет:

 цитата:
сли на входе X (Гц), то на выходе Y (Гц)
67>45
52>43
40>40



1) организовать учёт импульсов за 1 сек.
2) задать соответствие: если на входе X, то на выходе Y
3) выдать на выход количество импульсов Y

4) если на входе (Х) 10 и менее импульсов, то на выходе ноль (нет оборотов)
Всё.


Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 129
Зарегистрирован: 01.03.11
Рейтинг: 0
ссылка на сообщение  Отправлено: 29.01.13 11:08. Заголовок: Давайте зайдём с дру..


Давайте зайдём с другой стороны. На каком контроллере вы это собираетесь делать? Это к тому, что если на pic84 то это одно а если на контроллере содержащем встроенные модули то это другое.

1) организовать учёт импульсов за 1 сек.
подавайте импульсы на RB0, и считайте их по прерываниям.

2) задать соответствие: если на входе X, то на выходе Y
Проще некуда. Вычисляемый переход по таблице.

3) выдать на выход количество импульсов Y
Взяли из таблицы значение и Y и дёрнули ногой контроллера Y раз.



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 597
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг: 1
ссылка на сообщение  Отправлено: 29.01.13 12:33. Заголовок: Пока описывал igor ..


Пока описывал igor вывел почти тоже самое!
А на проц деу от холла меандр идёт, или короткие импульсы? Судя по тому, что после триггера на 155ТМ2 деу адекватно реагирует, можно и меандр. Тогда:
1. задействовать прерывание по фронту, запускаем таймер с предделителем (если не мудрить и использовать внутренний ген. 4Мгц, 1м.ц. 1мкс, *Кд - получим разрешение (точность) определения частоты) и начинаем отсчёт 1 сек. За это время подсчитываем количество фронтов от холла.
2. Сравниваем (вычитаем) с константами 40, 52 и 67. Три сценария
а) Х-40= отрицательное число, устанавливаем на выходе частоту меандра равную измеренной, т.е. Х. Если = положительное, то
б) вычитаем Х-9 (типа обманываем и ждём пока не увеличатся обороты до 43). Уже этот результат запоминаем. Затем сравниваем (вычитаем) (Х-9)-43= Если отрицательное, то устанавливаем частоту на выходе (Х-9). Проц деу будет получать уже частоту ниже на 9Гц, чем на входе. Если разница положительна, то из полученных (Х-9)вычитаем 13, запоминаем, и на выходе устанавливаем (Х-9)-13.
Это и будет 1 цикл программы, равный примерно 1 сек.
Выход сделать бит ориентированной командой bsf и bcf через равные промежутки времени, которые будут определяться переменной из регистра, в котором лежит Х или (Х-9) или (Х-9)-13.
Как то так я себе представляю.
P.S. Все эти вычисления займут малое время, проскочит лишь один период от датчика, что совершенно не страшно. А вот частота на выходе будет меняться 1 раз в секунду.

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 571
Зарегистрирован: 01.03.11
Рейтинг: 3
ссылка на сообщение  Отправлено: 29.01.13 13:04. Заголовок: Вот удобная программ..


Использовать два таймера.
Один таймер в режиме счетчика запускается при фронте имп. на входе. и выключается при заднем фронте. Получили длительность. х2 Получаем период. 1/T получаем частоту.
Но частоту можно не получать и период по сути не нужен. Нам индикация не нужна.
Нам достаточно программного компаратора. в котором по длительности ( конкретное значение) сравнить с ранее рассчитанными значениями длительности для нужных частот.
В зависимости от полученного результата по таблице мы получаем значение для предустановки 2 таймера, который формирует длительность импульса выходного сигнала.
Очень быстрая реакция. Так при частоте 60Гц это 8мс это мы уже измерили входную частоту. И максимум через 100мкс ( при кварце 4МГц) сформировали выходную последовательность


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 598
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг: 1
ссылка на сообщение  Отправлено: 29.01.13 14:18. Заголовок: MAZ пишет: Один тай..


MAZ пишет:

 цитата:
Один таймер в режиме счетчика запускается при фронте имп. на входе. и выключается при заднем фронте. Получили длительность. х2 Получаем период. 1/T получаем частоту.


Но это при условии что с холла идёт меандр, автор так и не уточнил. Если это так, то полностью согласен с тобой, и задача (а так же и скорость реакции) упрощается (ускоряется).
Если бы их увидеть хотя бы на стандартных частотах 40, 43 и 45 Гц, уже можно сделать вывод о методе измерения частоты, или считать период от фронта к фронту и сравнивать с константами. Но при этом замеры делать через период, в одном замерять, в другом делать вычисления и устанавливать выход. И так по кругу.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 10
Зарегистрирован: 28.01.13
Рейтинг: 0
ссылка на сообщение  Отправлено: 29.01.13 15:12. Заголовок: igor пишет: 1) орга..


igor пишет:

 цитата:
1) организовать учёт импульсов за 1 сек. подавайте импульсы на RB0, и считайте их по прерываниям. 2) задать соответствие: если на входе X, то на выходе Y Проще некуда. Вычисляемый переход по таблице. 3) выдать на выход количество импульсов Y Взяли из таблицы значение и Y и дёрнули ногой контроллера Y раз.



пункт 2 и 3 я в принципе так и планировал.
Вот с п.1 сложнее

Я сегодня прицепил Tmr0 на вход RA4 и таким образом планировал посчитать импульсы за 1 сек. и потом к этим 0-67Гц привязываться, сейчас понял, что это долго (целая 1 сек)
А теперь вижу, что можно гораздо проще: просто считать длительность импульса.
Датчик Холла на выходе даёт лог 1 или 0, а скважность зависит от того, как на заводе придумали, но в принципе, я думаю это не важно, длительность импульса всегда будет связана с оборотами.
Таким образом можно всего за один импульс измерить частоту (посчитав время от переднего до заднего фронта)
Ну, если так нельзя, то прийдётся считать, как SanSanich сказал, от фронта к фронту...
Я правильно понимаю?

Вообще желательно сделать не три частоты на выходе, а зависимость частот, с "прилепелнеим" с этим трём опорным, т.е. вообще хорошо, если 40 Гц и ниже частота вход->выход будет идти 1:1

PS. К сожалению "на меандр" посмотреть не могу, осциллографа нет (всё хожу облизуюсь, да цена кусается)

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 599
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг: 1
ссылка на сообщение  Отправлено: 29.01.13 15:28. Заголовок: fugi1 пишет: Вообще..


fugi1 пишет:

 цитата:
Вообще желательно сделать не три частоты на выходе, а зависимость частот, с "прилепелнеим" с этим трём опорным, т.е. вообще хорошо, если 40 Гц и ниже частота вход->выход будет идти 1:1


Ну я так и написал в алгоритме, а вот далее от исходной частоты просто сдвигаемся на константу, при этом динамика остаётся связанной со входной. Пропорциональность не нужна, растёт на входе, растёт и на выходе, только на константу ниже.
А что за МК? Чтоб в протеусе проект сделать!

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 11
Зарегистрирован: 28.01.13
Рейтинг: 0
ссылка на сообщение  Отправлено: 29.01.13 18:00. Заголовок: тип мк в заголовке. ..


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


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 600
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг: 1
ссылка на сообщение  Отправлено: 29.01.13 18:14. Заголовок: Вот что получилось в..


Вот что получилось в расчётах, только МК я предпочёл другой, но это не важно.
Вполне подойдёт PIC12F629 по цене в 1$.
На вход GP2/INT (5 нога) подаём импульсы с холла.
Разрешаем прерывания по переднему фронту и запускаем таймер. Останавливаем его опять же по переднему фронту.
Если использовать TMR0 с внутренним тактированием, а МК на 4Мгц, то 1 м.ц. будет 1мкс.
Максимальное время подсчёта без переполнения будет 256*256=65536 мкс, или 15.26Гц. Если не критично считать, что до 16Гц (а не 10 Гц как планировалось) будут начальными, с которых начнётся анализ входной частоты и до этого значения на выходе будет 0, то это только на руку. По переполнению TMR0 мы просто будем блокировать выход. Далее значение частоты определяем числом в таймере с шагом в 256 мкс, что весьма не плохо для нашей задачи. Допустим для 40Гц это будет число (1/40)/0.000256=97.66, а для частоты 70Гц (1/70)/0.000256=55.8. Так как числа у нас будут только целые, соответственно 97 и 55. При обратном преобразовании этих значений получаем задержки для полупериода и частоту на выходе. Допустим 90 это 90*128=11520 + 11520 = 43.4Гц, 96 это 96*128*2=24576 мкс или 40.69Гц, 97 это 40.27Гц,98 это 39.86Гц. Если надо очень точно частоту на выходе устанавливать, то по таблице можно, правда значений много будет. А вообще проверка покажет, устойчивы ли будут обороты.
Единица в таймере на разной частоте будет иметь разный вес, но если взять нужные нам, 52Гц это (1/52)/0.000256=75, а нам нужна частота на выходе 43Гц, что соответствует числу (1/43)*1000000/256=90.84, округляем до 91. Так как зависимость частоты на входе и числа в таймере у нас обратная, то после значения в таймере 97 мы прибавляем нужную нам разницу 16 (91-75) и получам 97+16=113, выдавая на выходе 1/(113*256/1000000)= 34.5Гц. Дэу соответственно будет подымать обороты до нужных ей 43Гц, что в реале с датчика соответствует 52Гц или 75 в таймере, 75+16=91 для формирования выхода.
Тоже самое для второго порога.
Надо проверить в протеусе и в железе, датчик у меня есть из вентилятора, благодаря MAZу!!!

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 13
Зарегистрирован: 28.01.13
Рейтинг: 0
ссылка на сообщение  Отправлено: 29.01.13 19:02. Заголовок: SanSanich пишет: Ну..


SanSanich пишет:

 цитата:
Ну я так и написал в алгоритме


Вы написали, а мне всё это надо "сквозь себя" пропустить, чтобы усвоить, потому и переписываю. как вижу и понял я.

 цитата:
Надо проверить в протеусе и в


Ой-ой-ой :-) вы так за меня всё домашнее задание сделаете

А теперь, что я понял, проверьте пжлста...
1) 65536 мкс это максимальная длительность ОДНОГО импульса, которую мы сможем измерить и соответственно самая минимальная частота?

2) Таймер, как я понял через предделитель? Значит в итоге в таймере будет лежать число до 255? при переполнении можем выдавать на ВЫХОД команду НОЛЬ? (с "блокировкой" дальнейшего счёта) считая, что оборотов нет.

3) Может тогда полученное в таймере число использовать для addwf,PC? Правда прийдётся много строк писать (или прикинуть минимальную длительность и потом перед переходом в ПП addwf,PC отминусовывать это число от таймера?) Я не знаю, как применять таблицу.

4) Если использовать addwf,PC, то оттуда мы можем получить (вписать там) любую константу, которую и можно использовать для формирования частоты выхода

В таком случае не будет порогов, за исключением ухода в ПП "ноль оборотов" при переполнении таймера.

Завтра на работе вычислю сколько импульсов на один оборот (хотя-бы +/-) и может и скважность. Для датчика холла динамика ведь значения не имеет.

А вообще мне самому надо пытаться допереть как такую программу писать. Буду пока этим заниматься.

Остался вопрос: может ли таймер работать параллельно с основной программой или он должен быть включён в общее кольцо (в общий. полный цикл)?

PS. у нас 629 - 2$ а 628 - 4$

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 572
Зарегистрирован: 01.03.11
Рейтинг: 3
ссылка на сообщение  Отправлено: 29.01.13 19:04. Заголовок: датчик у меня есть и..


датчик у меня есть из вентилятора, благодаря MAZу
Не надо на меня наговаривать.
Думаю что с датчика Холла будет меандр. Частота относительно высока. Фронты по длительности терпимые.
И предусмотреть проверку,что длительность импульса не может быть больше какого то значения. А то будет 0,005Гц и измерять нечего
1. пункт 65535 там еще 0 надо учитывать. Переведите FFFF в 10-ю. После этого таймер переполнится. И никто не мешает в какой то счетчик + 1 и считать дальше до переполнения. Так что максимально, можно посчитать много.

2) не понял в чем вопрос. конечно по переполнения таймера поднимается флаг или происходит прерывание (если включено) а дальше что душе угодно вкл или выкл.

3) для addwf,PC? Это я догадываюсь название вычисляемого перехода (ВП)? Правда прийдётся много строк писать вам их разве жалко?
Строк не сильно много. Главное определиться, как привязать к числам от 0 до N входную длительность. И при переходе по ВП на это число вернуть в программу новое значение.
4) Это надо обдумать и рассчитать на бумаге.
Про пороги.
Ну например. Мы получаем частоту 40 а порог 45. если меньше порога, присваиваемым число 0 и уходим в ВП где грузим в прогу константу. Как только больше 45 , присваиваемым число 1 и уходим в ВП где грузим в прогу новую константу . Вот и таблица простенькая. Это типа методика. Но с ней интересные вещи можно делать.


Остался вопрос: Таймер работает независимо от программы.
PS. 629 - можно купить в Тритоне. 35р. Ну и за 60( пачка сигарет) на мой взгляд терпимо

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 14
Зарегистрирован: 28.01.13
Рейтинг: 0
ссылка на сообщение  Отправлено: 29.01.13 19:30. Заголовок: 1/0.065535=15Гц Част..


1/0.065535=15Гц
Частота ниже не требуется, потому, думаю заморачиваться с +1 смысла нет, лучше переполнение таймера привязать к отсутствию импульсов, я в посте выше об этом писал.
MAZ пишет:

 цитата:
Правда прийдётся много строк писать вам их разве жалко?


вот и я о том... что не жалко.. зато можно каждой сторочке - свою частоту.

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 573
Зарегистрирован: 01.03.11
Рейтинг: 3
ссылка на сообщение  Отправлено: 29.01.13 19:32. Заголовок: могу кинуть программ..


могу кинуть программку почти вся на вычисляемых переходах. Только в личку. Человек которому делал, просил сильно не раскидываться.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 15
Зарегистрирован: 28.01.13
Рейтинг: 0
ссылка на сообщение  Отправлено: 29.01.13 19:35. Заголовок: А программка поможет..


А программка поможет? потому как, как ВП оформить это не проблема, я делал

Мне кажеться проще много строк написать (впрочем действительно не так и много) для разных частот

изначально надо измерить минимальную длительность импульса (на максимальных оборотах) или просто вычислить.
Пример:
допустим измерили и получили минимальную длительность 135 (берём запас 15 = 150)
Значи если:
1) получаем в таймере 160, то 160 минус 150 = 10, значит копируем 10 в W и идём в ВП в которой максимальная частота
2) получаем в таймере 250, то 250 минус 150 = 100, movfw .100 -> call ВП (на строчку 100) в которой вписана минимальная частота

ВП это и есть таблица или нет?

 цитата:
Разрешаем прерывания по переднему фронту и запускаем таймер. Останавливаем его опять же по переднему фронту.


как это реализовать?
и ещё, ну написал я прогу, куда и каким образом выкладывать, чтобы показать?

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 574
Зарегистрирован: 01.03.11
Рейтинг: 3
ссылка на сообщение  Отправлено: 29.01.13 19:37. Заголовок: Если делал, то без в..


Если делал, то без вопросов. Я не знаю, как применять таблицу. Я это прочел


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 601
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг: 1
ссылка на сообщение  Отправлено: 29.01.13 21:11. Заголовок: цитата: Разрешаем пр..



 цитата:
цитата:
Разрешаем прерывания по переднему фронту и запускаем таймер. Останавливаем его опять же по переднему фронту.
как это реализовать?
и ещё, ну написал я прогу, куда и каким образом выкладывать, чтобы показать?


Самому интересно!
Кто кодом может кинуть?!!!
Чтоб вставить асм надо нажать 7-ю слева кнопку с циферками 123 и вставить
123 
456
789

А зачем эти ВП? Константами мне кажется проще, но решать автору

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 16
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг: 0
ссылка на сообщение  Отправлено: 29.01.13 21:30. Заголовок: До ВП или констант н..


До ВП или констант наверное пока рано... ;-) наверное оставим на потом

Какая команда запускает и какая останавливает Tmr0 ?
Я так понял таймер подключен на внутренний такт CLKOUT через предделитель 256

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 575
Зарегистрирован: 01.03.11
Рейтинг: 3
ссылка на сообщение  Отправлено: 29.01.13 22:15. Заголовок: Нет такой команды. Н..


Нет такой команды. Но придумать что нибудь можно.
Хотя лучше воспользоваться TMR1.
Если TMR0. Он тактируется тактовыми импульсами мк или внешними. Я думаю если переключить в режим внешнего тактирования. А в нужный момент в режим внутреннего, то это и будет его включение и выключение. Зачем использовать предделитель, который не доступен для чтения? Вам же нужна информация. Я намекал, что после прерывания (255) +1 к программному счетчику а он может быть и двухбайтный. вот Вам и предделитель.
Да ВП на амсе это работа с таблицами

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 17
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг: 0
ссылка на сообщение  Отправлено: 29.01.13 22:27. Заголовок: О как... Придумать? ..


О как...
Придумать? Я например придумал так:

при первом фронте импульса на входе INT
1. вход в ПП прерывания
2. ветвление
3. clrf Tmr0
4. return

при следующем фронте (при прерывании)
1. вход в ПП прерывания
2. ветвление
3. movf Tmr0,W (получили результат в W для использования)
4. return
*******************
предделитель позволит не задействовать программу и получать результат, при этом 255 градаций более чем достаточно
*****************
Я учился на 84 ПИКе (по КЕА), он же есть в распоряжении для экспериментов, но в нём лишь один Tmr0

Сижу. вот кумекаю с моими скудными познаниями наперевес :-)

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 576
Зарегистрирован: 01.03.11
Рейтинг: 3
ссылка на сообщение  Отправлено: 29.01.13 22:40. Заголовок: Нормально. А что за ..


Нормально. А что за ветвление?
1. Настраиваем прерывание от INT (по переднему фронту) и от TMR0 по переполнению

2 В обработчике прерывания
Если от INT:
- проверить какой флаг прерывания по переднему фронту или по заднему
- если по переднему, clrf TMR0; clrf счетчик; настроить прерывание по заднему
- если по заднему то скопировать TMR0 в буфер TMR0, счетчик скопировать в буфер счетчика, настроить прерывание по переднему.
- сбросить флаг прерывания от INT
Если от TMR0:
- +1 к счетчику ( можно двухбайтному)
- сбросить флаг прерывания TMR0
retfie
Пока идет счет следующей длительности обрабатываем данные из буфер TMR0 и буфер счетчика
по времени это целый период
12F629 встроенный генератор 4МГц (кварц не нужен) есть и TMR1. 8 выводов


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 18
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг: 0
ссылка на сообщение  Отправлено: 29.01.13 23:08. Заголовок: В принципе я уже поч..


В принципе я уже почти дописал, завтра мож кусок кода ПП прерывания покажу, доделать надо..
Спокойной ночи! И спасибо за помощь!
*************** не терпиться ;-)
;           ПП прерывания контороль Таймера 
;*******************************************************************************************

Int movwf W_Temp ; Скопировать содержимое регистра W в регистр W_Temp.
movf Status,W ; Скопировать содержимое регистра Status в регистр W.
movwf Stat_Temp ; Скопировать содержимое регистра W в регистр Stat_Temp.

btfsc Zm,0 ; проверка состояния нулевого байта рег. Zm и выбор двух сцен.
goto Int_Out

bsf Zm,0 ; единицу в нулевой регистр Zm
clrf Tmr0 ; Сброс таймера (начало отсчёта)
goto EndInt

Int_Out bcf Zm,0 ; ноль в нулевой регистр Zm
movfw Tmr0 ; копируем содержимое таймера (сколько он там насчитал?)
movwf Const_Y ; вписуем во временный регистр (оттуда потом в ВП)
clrf Tmr0 ; ещё раз сбрасываем таймер (чтоб не переполнился)

;******************************************
; Возврат из ПП прерывания
;**********************************************

EndInt bcf IntCon,1 ; Сброс флага прерывания по INT.

movf Stat_Temp,W ; Скопировать содержимое регистра Stat_Temp в регистр W.
movwf Status ; Скопировать содержимое регистра W в регистр Status.
swapf W_Temp,F ; Поменять местами старший и младший полубайты регистра W_Temp
; с сохранением результата операции в нем же.
swapf W_Temp,W ; Поменять местами старший и младший полубайты регистра W_Temp
; с сохранением результата операции в регистре W.
retfie ; Возврат из прерывания по стеку.


пояснения:
Zm,0 используется для переключения между двумя сценариями, не знаю, мож есть способ лучше, этот я надумал сам
В результате, начало отсчёта происходит при первом прерывании, окончания счёта нет, есть снятие результата при втором прерывании.
Надо в МПЛабе погонять посмотреть на регистр Tmr0 (если получиться ;-))

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 577
Зарегистрирован: 01.03.11
Рейтинг: 3
ссылка на сообщение  Отправлено: 30.01.13 00:23. Заголовок: Мне кажется я Вам лу..


Мне кажется я Вам лучше выше предложил вариант. Во первых, непрерывно. Во вторых, всегда измеряем импульс.

movfw Tmr0 ; копируем содержимое таймера (сколько он там насчитал?)
movwf Const_Y ; вписуем во временный регистр (оттуда потом в ВП)
Вам разве хватит длительность 255мкс?
movfw Tmr0 лучше записывать так movf TMR0,W более явная запись

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 602
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг: 1
ссылка на сообщение  Отправлено: 30.01.13 01:31. Заголовок: MAZ пишет: movwf Co..


MAZ пишет:

 цитата:
movwf Const_Y ; вписуем во временный регистр (оттуда потом в ВП)
Вам разве хватит длительность 255мкс?


Это если с предделителем 256
Сань, а если там не меандр? Как счётчик заставить считать от фронта к фронту?
Что если запустить счётчик и пусть считает. Настроить прерывание по переднему фронту, уйти в прерывание, считать данные счётчика и флага переполнения, обнулить счётчик и флаги переполнений, отсчёт пошёл. Сброс прерываний и опять настройка на передний фронт. Далее математика и тд, настройка выхода.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 19
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг: 0
ссылка на сообщение  Отправлено: 30.01.13 08:05. Заголовок: SanSanich пишет: Са..


SanSanich пишет:

 цитата:
Сань,

это MAZ ? тут все Сани? :-)

**********
думаю, последнее предложение будет проще..., в смысле по каждому фронту проводить цикл опреаций: считывание>**>сброс > новый круг

*************

В общем проверил на моторе:
там чёткий меандр, соответственно :

1)максимальные обороты 68 Гц
1/68=14705мкс /256= 57

2)Минимальные обороты берём 16Гц
1/16=62500мкс/256=244

Эти рассчёты Вы уже выше писали..

в общем, выйдет около 200 строк таблицы





Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 20
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг: 0
ссылка на сообщение  Отправлено: 30.01.13 09:55. Заголовок: тогда выходит где-то..


тогда выходит где-то так...

Int         movwf      W_Temp      ; Скопировать содержимое регистра W в регистр W_Temp. 
movf Status,W ; Скопировать содержимое регистра Status в регистр W.
movwf Stat_Temp ; Скопировать содержимое регистра W в регистр Stat_Temp.

btfss IntCon,2 ; проверяем бит переполнения таймера
goto NoPPT ; если нет, то обходим след. 4 строки

clrf Const_Y ; очищаем регистр
bcf IntCon,2 ; сбрасуем флаг переполнения таймера
clrf Tmr0 ; обнуляем таймер
goto EndInt ; обходим следующие неск. строк - идём на выход

NoPPT movf Tmr0,W ; копируем содержимое таймера (сколько он там насчитал?)
movwf Const_Y ; вписуем во временный регистр (оттуда потом в ВП)
clrf Tmr0 ; обнуляем таймер

EndInt bcf IntCon,1 ; Сброс флага прерывания по INT.

movf Stat_Temp,W ; Скопировать содержимое регистра Stat_Temp в регистр W.
movwf Status ; Скопировать содержимое регистра W в регистр Status.
swapf W_Temp,F ; Поменять местами старший и младший полубайты регистра W_Temp
; с сохранением результата операции в нем же.
swapf W_Temp,W ; Поменять местами старший и младший полубайты регистра W_Temp
; с сохранением результата операции в регистре W.
retfie ; Возврат из прерывания по стеку.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 603
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг: 1
ссылка на сообщение  Отправлено: 30.01.13 10:11. Заголовок: fugi1 пишет: В обще..


fugi1 пишет:

 цитата:
В общем проверил на моторе:
там чёткий меандр


А как без осцела узнали?
Если это так, то проще будет как Александр (MAZ) предложил. Но универсальнее всё же период мерить.
Если с таблицей, то можно вообще на выходе фиксированные частоты получать, Гц в Гц.
В протеусе будете модулировать? Интересно будет пощупать! Но мне ещё покоя не даёт вариант с вычитанием, но это уже потом попробую как альтернативу.
Ждём пилотного листинга на тест-драйв!

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 21
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг: 0
ссылка на сообщение  Отправлено: 30.01.13 10:23. Заголовок: без осцила повесил с..


без осцила повесил светодиод через резюк на выход мотора и считал по лопастям вентилятора их там 30 штук, точности достаточно, 5 лопастей=один полупериод.

если применять вышенаписанный код, то на весь процесс анализа уйдёт грубо говоря 16 мкс. с которыми можно не считаться

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 578
Зарегистрирован: 01.03.11
Рейтинг: 3
ссылка на сообщение  Отправлено: 30.01.13 11:25. Заголовок: это MAZ ? тут все Са..


fugi1 пишет:

 цитата:
это MAZ ? тут все Сани?


Есть еще и Сан Санычи

Давайте пока опустим стандартную процедуру сохранения и восстановления в прерывании.
По тексту. Мне кажется я хорошо написал типа алгоритма выше. Ну ладно напишу обработчик.
Еще раз напомню. Мы используем TMR0 и не используем предделитель. Потому что, предделитель не доступен для чтения.
Поэтому используем дополнительный регистр chethik. в котором считаем сколько было переполнений TMR0 во время счета длительности импульса. Таки образом мы можем посчитать грубо длительность 65мс или до 7,6Гц .
Пусть у нас минимальная частота (контроль) 40Гц. 12,5мс Что даже очень с запасом.
Будем использовать:
OPTION_REG, INTEDG ; разрешаем от INT 1-прерывание по переднему фронту 0- по заднему
INTCON,T0IF ; флаг прерывания (переполнения) от TMR0
INTCON,INTF ; флаг прерывания от INT


        org 0x04                        ; вектор прерывания  
; стандартная процедура сохранения
; проверяем от чего прерывание.
btfsc INTCON,INTF ; прерывание от INT?
call obrab_INT ; да обрабатываем прерывание от INT
btfsc INTCON,T0IF ; прерывание (переполнение) от TMR0?
call obrab_TMR0 ; да обрабатываем прерывание от TMR0
; стандартная процедура восстановления
retfie

obrab_INT ; обрабатываем прерывание от INT

btfsc OPTION_REG, INTEDG ;1-прерывание по переднему фронту 0- по заднему
goto n1 ; если 1 поставить INTEDG в 0 ( пошло измерение длительности)
bsf OPTION_REG, INTEDG ; если 0 поставить INTEDG в 1 (окончили измерять длительность)
movf TMR0,W ;копируем TMR0 в byf_TMR0
movwf byf_TMR0
movf chethik,W ;копируем chethik в byf_chethik
movwf byf_chethik
bcf INTCON,INTF
return

n1
bcf OPTION_REG, INTEDG ; если 0 поставить INTEDG в 1 (начали измерять длительность)
clrf TMR0
clrf chethik
bcf INTCON,INTF
return

obrab_TMR0 ; обрабатываем прерывание от TMR0
incf chethik
bcf INTCON,T0IF ; флаг прерывания (переполнения) от TMR0
return

(можно сделать еще проверку переполнения chethik)

В результате мы получаем, через время равное периоду, длительность импульса (при кварце 4МГц уже в мкс. )
пропорциональную частоте в регистрах byf_chethik( старший)byf_TMR0 (младший)

Если ни чего не забыл.
Ну и программа проверяет число в byf_chethik; byf_TMR0 в каком оно диапазоне от заранее рассчитанного.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 22
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг: 0
ссылка на сообщение  Отправлено: 30.01.13 11:58. Заголовок: брр.. надо сидеть вт..


брр.. надо сидеть втыкать... (в смысле мне)

а про предделитель... его чтение и не требуется, пусть себе делит, а использовать лишь результат деления, т.е. результат в Tmr0, такой точности вполне хватит

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 604
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг: 1
ссылка на сообщение  Отправлено: 30.01.13 12:34. Заголовок: fugi1 пишет: брр.. ..


fugi1 пишет:

 цитата:
брр.. надо сидеть втыкать... (в смысле мне)

а про предделитель... его чтение и не требуется, пусть себе делит, а использовать лишь результат деления, т.е. результат в Tmr0


Мысли сходятся!
А вообще приведённый пример MAZ более правильный и точный. При желании можно очень точно вычислить период, с точностью 1мкс. Ну а регистров хватает, жрать не просят. Да и далее уже более гибко частоту на выходе можно устанавливать.
Пора инициализировать МК и запускать проект, чтоб куски кода не расползлись! Кстати, сторожевой стоит использовать? Вот там предделитель может и понадобиться.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 23
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг: 0
ссылка на сообщение  Отправлено: 30.01.13 13:36. Заголовок: сторожевой? да, было..


сторожевой? да, было бы неплохо
только я не понял, у сторожевого время "на раздумья" 18 микросекунд или миллисекунд? (0,000018/0,018)?

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 131
Зарегистрирован: 01.03.11
Рейтинг: 0
ссылка на сообщение  Отправлено: 30.01.13 13:59. Заголовок: миллисекунд. Сторож..


миллисекунд.
Сторожевой таймер в принципе не нужен. На нём Корабельников Е. очень заострил внимание. Якобы без него-кранты. Ничего подобного. Если программа написана правильно то она и сбоить не должна. А если нет, то и WDT не поможет.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 24
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг: 0
ссылка на сообщение  Отправлено: 30.01.13 14:13. Заголовок: В принципе, я уже на..


В принципе, я уже начал, потому попробую сделать сперва так, а потом можно и другие варианты попробовать
Получилось примерно так: (определение регистров сюда не включал, и так много)
осталось Таблицу рассчитать и дописать


==================      ============ С Т А Р Т ===============      ========================= 
;=============================================================================================

Start clrf IntCon ; Запрет всех прерываний.
clrf Tmr0 ; Сброс в 0 содержимого регистра TMR0.

bsf Status,5 ; банк 1

movlw b'11010111' ; Предделитель 256 перед TMR0
movwf OptionR ; внутренний такт CLKOUT
; прерывание INT по переднему фронту

movlw b'00000001'
movwf TrisB ; определение выходы и вход прерываний RNB0/INT

bcf Status,5 ; банк 0

movlw b'10010000'
movwf IntCon ; разрешение прерываний по RB0/INT


;**************************************************************************
;
; получение константы для задания частоты на выходе
;
;***************************************************************************

Cicle bsf Status,0 ; в единицу бит С регистра Статус
movlw .57 ;
subwf Const_Y,W ; константу в регистр для ВП

btfss Status,0 ; проверяем бит С, если 0, то след.строка
clrf W ; очистка аккумулятора
call Table ; переход в ВП

; *************************************************************************
;
; ПП вывода выходной частоты
;
;*************************************************************************


Loop movwf Const_M

movfw Const_M
movwf Sec_3

OnPort bsf PortB,7

movlw .13
movwf Sec_2

Loop_3 movlw .3
movwf Sec_1

Loop_4 decfsz Sec_1,F
goto Loop

decfsz Sec_2,F
goto Loop_3

decfsz Sec_3,F
goto OnPort


movfw Const_M
movwf Sec_3

OffPort bcf PortB,7

movlw .13
movwf Sec_2

Loop_7 movlw .3
movwf Sec_1

Loop_8 decfsz Sec_1,F
goto Loop_8

decfsz Sec_2,F
goto Loop_7

decfsz Sec_3,F
goto OffPort

goto Cicle


;*******************************************************************************************
; ПП прерывания, очистка-считывание Таймера
;*******************************************************************************************


Int movwf W_Temp ; Скопировать содержимое регистра W в регистр W_Temp.
movf Status,W ; Скопировать содержимое регистра Status в регистр W.
movwf Stat_Temp ; Скопировать содержимое регистра W в регистр Stat_Temp.

btfss IntCon,2 ; проверяем бит переполнения таймера
goto NoPPT ; если нет, то обходим след. 4 строки

movlw .255
movwf Const_Y ; вписываем максимальное число
bcf IntCon,2 ; сбрасуем флаг переполнения таймера
clrf Tmr0 ; обнуляем таймер
goto EndInt ; обходим следующие неск. строк - идём на выход

NoPPT movfw Tmr0 ; копируем содержимое таймера (сколько он там насчитал?)
movwf Const_Y ; вписуем во временный регистр
clrf Tmr0 ; обнуляем таймер

EndInt bcf IntCon,1 ; Сброс флага прерывания по INT.

movf Stat_Temp,W ; Скопировать содержимое регистра Stat_Temp в регистр W.
movwf Status ; Скопировать содержимое регистра W в регистр Status.
swapf W_Temp,F ; Поменять местами старший и младший полубайты регистра W_Temp
; с сохранением результата операции в нем же.
swapf W_Temp,W ; Поменять местами старший и младший полубайты регистра W_Temp
; с сохранением результата операции в регистре W.
retfie ; Возврат из прерывания по стеку.

;*******************************************************************************************

Table addwf PC,F

retlw .163 ; 47


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 25
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг: 0
ссылка на сообщение  Отправлено: 30.01.13 17:22. Заголовок: Подправил программу,..


Подправил программу,(снова код выкладывать не буду, много места занимает) завтра буду проверять, сегдоня устал и ещё дела есть, и так много времени убил
Спасибо Вам, может я и не по Вашему сделал, но благодаря Вам понял многие отправные точки и алгоритм работы, т.е. камни преткновения разрушены ;-)
Прогнал в МПЛабе пошагово, вроде правильно, а железо затра покажет.
Таблицу тоже сделал, ..даа не такая уж и простая эта таблица, много букф получилось.
Ещё раз спасибо!

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 579
Зарегистрирован: 01.03.11
Рейтинг: 3
ссылка на сообщение  Отправлено: 30.01.13 22:00. Заголовок: На здоровье! А по на..


На здоровье! А по нашему и не надо. Все надо по своему, но смотреть, может кто и лучше сделал.

Спасибо: 1 
ПрофильЦитата Ответить
администратор




Пост N: 605
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг: 1
ссылка на сообщение  Отправлено: 31.01.13 09:26. Заголовок: MAZ пишет: На здоро..


MAZ пишет:

 цитата:
На здоровье! А по нашему и не надо. Все надо по своему, но смотреть, может кто и лучше сделал.


На все 100!!!
Но, думаю, у автора ещё будут вопросы.

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 26
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг: 0
ссылка на сообщение  Отправлено: 31.01.13 12:31. Заголовок: Мммда, вопросы тольк..


Мммда, вопросы только начинаются :-)
И первый (хотя уже далеко не первый) вопрос: Уход в ПП прерываний происходит при:
1) перепаде на входе INT от 0 к 1, т.е. при фронте, в момент перепада (ессно, в регистрах всё установлено )
2) наличии на INT лог 1, т.е. пока на INT лог 1, то ПП прерываний будет видеть лог 1 и всё время ходить по кругу

должно быть как бы 1)

Если бит TOIE (разрешить прерывания по переполнению Tmr0) в 0, т.е. прерывания по переполнению запрещены, то при переполнении таймера флаг TOIF поднимется?
(пока писал, подумал, что этот вопрос можно в МПЛабе самому решить)
т.е.
3) это флаг переполнения ТМР0 или
4) это флаг фактапрерывания по переполнению?

вроде как должно быть 3)

И про вопросы... по ходу дела.. надо научиться 1-Wire, т.е. хочу научиться связывать DS18B20 и МК, подскажите где узнать...



Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 27
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг: 0
ссылка на сообщение  Отправлено: 31.01.13 14:36. Заголовок: Возникла мысль-вопро..


Пол дня убил, чтобы понять, что ПП прерываний надо разместить в самом верху.

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 132
Зарегистрирован: 01.03.11
Рейтинг: 0
ссылка на сообщение  Отправлено: 31.01.13 17:56. Заголовок: Флаги поднимаются не..


Флаги поднимаются независимо от того, разрешены прерывания или нет.

Спасибо: 1 
ПрофильЦитата Ответить
moderator




Пост N: 580
Зарегистрирован: 01.03.11
Рейтинг: 3
ссылка на сообщение  Отправлено: 31.01.13 18:02. Заголовок: я же писал org 0x..


я же писал
org 0x04 ; вектор прерывания
а расположить где угодно. компилятор видит что с 4-ой строчки в памяти программ

насчет флагов. откуда компилятору знать. надо включать прерывание или нет?
насчет их сбросов я тоже писал
Тут проблемы с отправкой файлов и рисунков. Можно перейти на чипмк. Там проще кидаться описанием на русском DS18B20

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 28
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг: 0
ссылка на сообщение  Отправлено: 31.01.13 19:01. Заголовок: MAZ пишет: Можно пе..


MAZ пишет:

 цитата:
Можно перейти на чипмк


ОК! Эту программу тут добью и на чипмк...
MAZ пишет:

 цитата:
org 0x04 ; вектор прерывания


это я то вписал, вот только не догнал, что в этой 0х04 надо или начало программы прерываний ставить или переход на ПП прерываний, а я вверху Старт разместил..
Ничего, выстраданная ошибка крепче в память врезается.
За пояснение про флаги спасибо


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 351
Зарегистрирован: 25.09.09
Откуда: г.Саратов
Рейтинг: 1
ссылка на сообщение  Отправлено: 31.01.13 19:07. Заголовок: fugi1 пишет: то ПП..


fugi1 пишет:

 цитата:
то ПП прерываний будет видеть лог 1 и всё время ходить по кругу


Измените, долго не отслеживал ход. Что-то точно пропустил.
Заметь, что есть в рг. OPTION_REG бит 6 (INTEDG). Он определяет, выбор активного фронта сигнала на входе внешнего прерывания INT. Им можешь задать, какой ФРОНТ будет ожидать программа обработки прерывания.
Задай его в основной части или где. Главное - раньше, чем может прийти прерывание.
Сам делал так: писал часть программы (макрос, ПП, как хочешь назови), она должна быть достаточно короткой (чтобы не пропустить следующее событие - прерывание). В начале макроса ( о сохранении данных в рг. W STATUS и их восстановлении надо позаботится отдельно) убеждался, что флаг ожидаемого прерывания установлен (это бит INTF регистра INTCON, запрещал прерывание местное (в данном случае надо сбросить в 0 разряд INTE регистра INTCON. Далее - собственно код обработки прерывания, сбрасываю флажок местного прерывания INTF, разрешал местное прерывание 1 в INTE.
Не забывай в основной части программы разрешить глобальное прерывание (разряд GIE регистра INTCON)
Может сумбурно, описал как умел. Сделай себе "рыбу" из команд для макроса прерывания с комментариями, чтобы не забыть чего.
Сейчас от асм отпал, просто рефлексия.
Удачи.

Спасибо: 1 
ПрофильЦитата Ответить
moderator




Пост N: 581
Зарегистрирован: 01.03.11
Рейтинг: 3
ссылка на сообщение  Отправлено: 31.01.13 19:43. Заголовок: fugi1 пишет: в этой..


fugi1 пишет:

 цитата:
в этой 0х04


Именно там и ставится вектор прерывания.
а в org 0x03 или раньше можно поставить goto Start

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 29
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг: 0
ссылка на сообщение  Отправлено: 31.01.13 20:15. Заголовок: Вячеслав пишет: Сде..


Вячеслав пишет:

 цитата:
Сделай себе "рыбу"


не понял, про рыбу..

В моём случае выбор фронт/спад не важен, т.к. по совету СанСаныча, я сделал: прер>опрос Tmr0 > сохр результата>очистка Tmr0>выход (там-же опрос переполнения таймера) всё за один цикл.
Прерывание "случайно" тоже не случиться, ибо после запуска сплита выдержка около 3-5 сек, а потом старт мотора

Всё, народ :-))))))))))))))
просто переместил вверх списка ПП прерывания и всё заработало. Так, что написанная вчера программа была рабочая (кроме 2-х ошибок с ветвлением)

Даже рассчётные частоты (прописанные в ВП) попал 1:1, чего хотел, то и получил.
Всем огромное спасибо!!!

И ещё вопрос возник, как перевести МК на внутренний генератор, чтобы кварц не использовать, здесь такая точность не нужна.

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 582
Зарегистрирован: 01.03.11
Рейтинг: 3
ссылка на сообщение  Отправлено: 31.01.13 20:46. Заголовок: fugi1 пишет: я сде..


fugi1 пишет:

 цитата:
я сделал: прер>опрос Tmr0 > сохр результата>очистка Tmr0>выход (там-же опрос переполнения таймера) всё за один цикл.


Здесь ключевое. от чего прерывание. Т.е. постоянно мерим между передними фронтами или задними. Таким образом просто мерим период. Можно и так, только долго ждать результата.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 606
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг: 1
ссылка на сообщение  Отправлено: 01.02.13 00:41. Заголовок: MAZ пишет: Можно и ..


MAZ пишет:

 цитата:
Можно и так, только долго ждать результата.


В железе будет видно, но что то мне подсказывает, что всё прокатит. Тем более 3 периода за оборот двигателя с его суперплавностью вращения. тут даже 1 раз в секунду замер пойдёт. Для других целей может и нет, но задача под кондишку.
Я тут тоже проект заканчиваю, задачка попроще, но тоже многое для себя прояснил. Как будет готова, выложу.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 30
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг: 0
ссылка на сообщение  Отправлено: 01.02.13 07:48. Заголовок: Уже прокатило :-) fu..


Уже прокатило :-)
fugi1 пишет:

 цитата:
Всё, народ :-)))))))))))))) просто переместил вверх списка ПП прерывания и всё заработало.



В этой задаче именно такой период (от фронта к фронту) и оказался удобен. Перед таймером - делитель 256, в таймере за 1 период лежит число, из которого диапазон от 57 до 140 используется для ВП
Всем ещё раз спасибо!

Скрытый текст

добавил сторожа, временные параметры не жёсткие, а перестраховка не помешает.
fugi1 пишет:

 цитата:
как перевести МК на внутренний генератор, чтобы кварц не использовать, здесь такая точность не нужна.


и ещё непонятка вылезла... если питаю МК от +5 вольт сплита, то упорно не работает, развязка на диоде+680мкф+0.1мкф не помогают, вот здесь чудеса какие-то


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 31
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг: 0
ссылка на сообщение  Отправлено: 01.02.13 11:19. Заголовок: Всё, сплит собрал, с..


Всё, сплит собрал, сейчас стоит на прогонке. Поставил кварц и 7805 на питание, ну, и как говорил в программе включил сторожа

зарегился на chipmk.ru под логином wind, впервые за несколько лет сменил логин, (fugi1 - происходит от Беглецов)

на ЧИПМК создал тему ЧАСЫ


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 607
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг: 1
ссылка на сообщение  Отправлено: 01.02.13 13:29. Заголовок: fugi1 пишет: Всё, с..


fugi1 пишет:

 цитата:
Всё, сплит собрал, сейчас стоит на прогонке.


Мои поздравления!

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 55 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 8
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет



Создай свой форум на сервисе Borda.ru
Текстовая версия