Помогите разобраться с программой
|
|
retas |
Дата: Сб, 05.03.2011, 11:13 | Сообщение # 16 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
445
Замечания:
±
На сайте с 10.09.2007
Статус:
Offline
|
1. На счет доп.ЛОГИКИ - оно дало бы только возможность ОДНОВРЕМЕННО следить за двумя сигналами. МК этого в принципе не может, но пожалуй с вашим подходом (с INT и CCP) вроде должно получиться - у меня такого опыта нет. 2. Какой либо сигнал на выходе логики, появлялся бы только при появлении хоть какого то сдвига между имп. 3. Как то я не пойму "это я рассчитаю только смещение, а мне необходимо знать и ширину"? ПМ, смещение и есть ширина, только выражена в тактах таймера. 4. По вами представлену алгоритму программы, выходит что вам не требуется одновременно следить за несколькими сигналами да и что сравнивать - получили, скажем, 10 импульсов и ширину импульса в 1мс?! 5. По ранее вами написанному "посчитать количество импульсов на оборот от начала отсчета", так вам нужно в МК иметь четко заданную длительность равную необходимой длительности импульса с датчика и её сравнивать с реально получаемой с датчика. Удачи.
Сообщение отредактировал
retas - Сб, 05.03.2011, 11:14
|
|
|
|
Axell |
Дата: Сб, 05.03.2011, 12:14 | Сообщение # 17 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 25.02.2011
Статус:
Offline
|
Quote (retas) По ранее вами написанному "посчитать количество импульсов на оборот от начала отсчета", так вам нужно в МК иметь четко заданную длительность равную необходимой длительности импульса с датчика и её сравнивать с реально получаемой с датчика. Посмотрите выше проект, там это реализовано уже...Мне не надо сравнивать в мк ничего, просто подсчитать кол-во импульсов..Какое должно быть мне уже заранее известно, просто нуно знать, правильно ли оно или нет.. Quote (retas) Как то я не пойму "это я рассчитаю только смещение, а мне необходимо знать и ширину"? ПМ, смещение и есть ширина, только выражена в тактах таймера. Ширина -- это длительность положительного фронта импульса..Импульсы подаются смещенными друг относительно друга..Мне нуно знать величину смещения в тактах и длительность импульса, что бы понять в какую сторону смещен -- для дальнейшей настройки..См. рисунок выше. Quote (retas) По вами представлену алгоритму программы, выходит что вам не требуется одновременно следить за несколькими сигналами да и что сравнивать - получили, скажем, 10 импульсов и ширину импульса в 1мс?! В принципе так оно и есть..Просто на мк заводится три канала с импульсами и в зависимости от выбранной программы выполнять действия... Но..Главные вопросы у меня написаны в предыдущем посте..По поводу прогаммы..
Сообщение отредактировал
Axell - Сб, 05.03.2011, 12:14
|
|
|
|
ADMIN |
Дата: Сб, 05.03.2011, 12:36 | Сообщение # 18 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1082
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
На ЖКИ подходит 6 ног минимум. Второе, прерывания можно настроить в том месте, где они тебе будут нужны. Подпрограммы оформляются так: sub function function_name(...) as return_type <объявление локальных переменных> ... end sub В теле Main подпрограмма вызовется как function_name() Прочитай в справке Microbasic - Program organization. Потом, зачем считать нажатия кнопок? Думаю, что по одному таймеру ты можешь начать счет ширины одного импульса, а по приходе второго, не сбрасывать таймер, а зафиксировать в переменную смещение, и продолжать счет всей ширины импульса. Ну как-то так
|
|
|
|
Axell |
Дата: Пт, 11.03.2011, 00:22 | Сообщение # 19 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 25.02.2011
Статус:
Offline
|
Подскажите плиз... Использую модуль ССР, настрроил на захват по переднему фронту.Нуно в теле программы переключится на захват по заднему и расчитать разницу..Подскажите плиз как это сделать, а то мне не очень понятно из документации.. И исче..Я так понимаю, что захваченное значение TMR1 нуно сохранять в регистр или в область памяти,что бы потом произвести математические действия. подскажите плиз как правильно это делать(сохранять)..Я пытался сохранять в переменную(это не правильно)-- оно меняется с каждым изменением значения захвата.. Спасибо..
|
|
|
|
ADMIN |
Дата: Пт, 11.03.2011, 05:00 | Сообщение # 20 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1082
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
А где вчерашний вариант? В этом варианте получается, что значение переменной меняется с каждым изменением значения захвата потому, что оно стоит в теле программы, а не в прерывании: Code while TRUE Delay_Ms(200) if PORTB.5 = 0 then pulse= 0 TMR1H = 0 TMR1L = 0 CCPR1L = 0 'А здесь постоянно обнуляется CCPR1 CCPR1H = 0 T1CON.0 = 0
end if
pulse = (TMR1H*256)+TMR1L imp_2 = CCPR1L + (CCPR1H*256) shirina = imp_1 - imp_2 'Здесь постоянно происходит вычитание и так до бесконечности
WordToStr(pulse,pulse_ex) Lcd_Out(1,3, pulse_ex)
WordToStr(imp_2,null_ex) Lcd_Out(2,3,null_ex)
WordToStr(shirina,shiri na_ ex) Lcd_Out(1,11,shirina_ex )
WordToStr(imp_1,imp_1_ex) Lcd_Out(2,11,imp_1_ex ) wend Вариант, который я отправил вчера, содержал две строчки - CCP1CON = 0x05(включает захват по переднему фронту), и CCP1CON = 0x04(включает захват по срезу импульса). Причем этот вариант работал(там нужно было только учесть время в нахождения в прерывании). В момент прихода импульса устанавливается флаг CCP1IF, что вызывает прерывание. В прерывании проверяем, если включен захват по переднему фронту, то значение CCPR1L и CCPR1H закидываем в переменную(это будет точка отсчета ширины импульса) и устанавливаем прерывание по срезу импульса. Потом сбрасываем флаг прерывания CCP1IF и ждем следующего прерывания по срезу. Как только мы вошли в прерывание, то вычитаем текущее значение CCPR1 и значение начала отсчета ширины импульса. Получаем ширину.Что там не понравилось?
|
|
|
|
Axell |
Дата: Пт, 11.03.2011, 06:37 | Сообщение # 21 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 25.02.2011
Статус:
Offline
|
Quote (ADMIN) А где вчерашний вариант? Извините за дублирование. Просто на момент написания этого ответа мой ясчик еще был пуст.. Сча все есть и будем разбираться.. Спасибо Вам..
|
|
|
|
Axell |
Дата: Пт, 11.03.2011, 20:50 | Сообщение # 22 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 25.02.2011
Статус:
Offline
|
Уважаемый ADMIN подскажите плиз, как в ПРОТЕУСЕ подать вот такие 2 последовательности импульсов на разные входа со смещением..А то как не кручу у меня хоть по одному фронту но совпадает.. Спасибо
|
|
|
|
DAlexV |
Дата: Пт, 11.03.2011, 23:22 | Сообщение # 23 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
655
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
"Бог в Помощь !!!" (м.ф. Жил был пес) Берем 2 источника прямоугольных импульсов. Частота у обоих одинаковая(какая требуется). Смещение регулируем в генераторе B (задержкой первого фронта) схему прицепил. Успехов 
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
ADMIN |
Дата: Сб, 12.03.2011, 07:51 | Сообщение # 24 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1082
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Применительно к PIC можно использовать 2 таймера. Один использовать для генерации одной последовательности, другой - для другой. Главное - это вычислить точное время нахождения в прерывании для точной генерации.
|
|
|
|
Axell |
Дата: Сб, 19.03.2011, 00:21 | Сообщение # 25 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 25.02.2011
Статус:
Offline
|
Подскажите плиз, почему проект в протеусе работает в идеале, а как соберу в железе то со счетом начинается свистопляска... Нет стабильности в измерении импульсов..Даже при измерении ширины на каждом импульсе разное значение, хотя импульсы поступают с одинаковым периодом..Правда не такие идеальные, как в Потеусе(у меня есть маленьие срезы на заднем фронте), но все же почему так... ПыСы.Пробовал подовать на контроллер через делитель -- становилось лучше, но не идеально.. Программа нужна для проверки вот такого устройства...Только на приведенной схеме 15В, а у меня устройства на 5В...Принцип один и тот же.. И исче вопрос, как измеряется скважность..?? В доке написано так : конфигурируем на захват по пер.фронту - сохраняем, конфиг.по заднему - высчитываем, конфиг. опять по переднему- высчитываем - сдесь судя по докум. должно сохранится первое и последнее значение, а у меня первое почемуто перепиcываетя последним и ничего не получается..Почему так.? Code if CCP1CON = 0x05 THEN imp_1= CCPR1L + (CCPR1H*256) CCP1CON= 0x04 imp_2 = CCPR1L + (CCPR1H*256) ELSE CCP1CON= 0x05 W = (CCPR1L + (CCPR1H*256)) - imp_2 T=(CCPR1L + (CCPR1H*256)) - imp_1 S=T / W end if Добавлено (19.03.2011, 00.21.40) --------------------------------------------- C предыдущим вопросом разобрался... Возник другой вопрос.. Как правильно вывести результат деления, который получается дробным... Например : двоичный код (0001) / двоичный код (0010) = результат в десятичном (0.5) Как правильно ето оформить в программе..??
Сообщение отредактировал
Axell - Сб, 19.03.2011, 00:23
|
|
|
|
Men |
Дата: Чт, 15.03.2012, 16:31 | Сообщение # 26 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
2
Замечания:
±
На сайте с 15.03.2012
Статус:
Offline
|
Доброго времени!!!На просторах интернета попалась программка...скопировав ее захотелось немного поучится в освоении программирования на примере простой программки.Пытаюсь ее компилировать...а mikroBasic v7.0.0.2 не хочет ничего делать....Помогите пожалуйста....может что то не так в программе...или подскажите что нужно сделать....чтобы получить HEX ?Заранее спасибо!!!
|
|
|
|
ivan_fd |
Дата: Чт, 15.03.2012, 17:46 | Сообщение # 27 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
891
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Так это не проект, а какой то набор букв. Посмотрите на примеры среды разработки, там много всего. И скачайте свежий компилятор.
|
|
|
|