Формирование импульса после сигнала.
|
|
xxxmonejall |
Дата: Чт, 28.05.2009, 18:20 | Сообщение # 16 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Quote (demanik) Теоретически должен. Импульс ловить на прерываниях и выдавать на выход импульс считая длительность таймером конец импульса по переполнению таймера тоже через прерывание. паралельно читать АЦП. А не могли бы вы поподробней, росказать как это все должно происходить????
|
|
|
|
vladh |
Дата: Пт, 29.05.2009, 07:46 | Сообщение # 17 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Сегодня я немного повозился с Вашей задачей, и вот какие у меня получились результаты: Вначале необходимо заметить, что на частоте 100 кГц период между импульсами составляет 10 мкс. Это значит, что строчка определения Define ADC_SAMPLEUS 50 Идет в разрез с исходным условием (частота 100 кГц). Это значит, что далеко не после каждого импульса этой частоты вы сможете сформировать импульс, длительность которого зависит от уровня аналогового сигнала. Обычно этот период рекомендуется задавать ~ 15 мкс. Но и этот интервал как видите, превышает минимальных 10 мкс, а плюс еще надо отвести время на разряд конденсатора в канале АЦП. Поэтому для решения Вашей задачи, было бы лучше, если бы Вы более точно описали то, что Вы хотите сделать. По поводу прерываний. Если закрыть глаза на все сказанное выше и еще на работу оператора pulsout, то Вашу программу можно было бы записать как: Define ADC_BITS 8 Define ADC_CLOCK 3 Define ADC_SAMPLEUS 15 OPTION_REG = $7f ' Подключаем подтягивающие резисторы в PORTB On Interrupt Goto myint ' Определяем подпрограмму обработки прерываний INTCON = $90 ' Включаем рузрешение прерываний по входу INT InTime var byte TrisB = %00000001 TrisA = %11111111 ADCON1 = %00000010 main: portb.0 = 0 ADCIN portA.0, InTime goto main myint: Disable ' Отключаем обработку всех прерываний pulsout portb.1,2 + InTime INTCON.1 = 0 ' Очищаем флаг прерывания Resume ' Возвращаемся в основную программу Enable
Сообщение отредактировал
vladh - Пт, 29.05.2009, 07:48
|
|
|
|
xxxmonejall |
Дата: Пт, 29.05.2009, 23:18 | Сообщение # 18 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Я говорил о 100 герцах!!!!!!!!
|
|
|
|
vladh |
Дата: Сб, 30.05.2009, 06:20 | Сообщение # 19 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Действительно 100 Гц. Куда меня понесло? Тогда приведенный мною код Вашей программы будет работать как Вам надо. Удачи.
|
|
|
|
demanik |
Дата: Сб, 30.05.2009, 11:38 | Сообщение # 20 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
448
Замечания:
±
На сайте с 11.12.2007
Статус:
Offline
|
Обработчик прерываний лучше сделать так: myint: Disable ' Отключаем обработку всех прерываний IF INTCON.1 = 1 THEN pulsout portb.1,2 + InTime INTCON.1 = 0 ' Очищаем флаг прерывания ENDIF Resume ' Возвращаемся в основную программу Enable
Попробуй всё и вся... может быть пол...
|
|
|
|
vladh |
Дата: Сб, 30.05.2009, 13:17 | Сообщение # 21 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Нет оператор условия здесь не нужен. Так как мы в самом начале в строке: Quote (vladh) INTCON = $90 ' Включаем рузрешение прерываний по входу INT определили источник прерывания на которое должна реагировать программа.
|
|
|
|
xxxmonejall |
Дата: Сб, 30.05.2009, 19:57 | Сообщение # 22 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
А где можно почитать про эти прерывания???? И что оно такое?????
|
|
|
|
demanik |
Дата: Сб, 30.05.2009, 20:52 | Сообщение # 23 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
448
Замечания:
±
На сайте с 11.12.2007
Статус:
Offline
|
Quote (xxxmonejall) А где можно почитать про эти прерывания Ишите в книгах. Тут насайте немного есть.
Попробуй всё и вся... может быть пол...
|
|
|
|
vladh |
Дата: Сб, 30.05.2009, 21:02 | Сообщение # 24 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Во первых здесь http://www.microchip.ru/files/d-sheets-rus/pic16_8.pdf Во вторых надо смотреть хелп в Вашй прогамме-компиляторе. ну и моё Интернет -издание
Сообщение отредактировал
vladh - Сб, 30.05.2009, 21:07
|
|
|
|
xxxmonejall |
Дата: Вс, 31.05.2009, 01:22 | Сообщение # 25 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Ничего не работает. Не знаю в чем проблема. Значение не время выходного импульса не меняется. @ device pic16F877A, xt_osc, wdt_off, protect_off, pwrt_on DEFINE OSC 20 Define ADC_BITS 8 Define ADC_CLOCK 3 Define ADC_SAMPLEUS 15 OPTION_REG = $7f On Interrupt Goto myint INTCON = $90 InTime var byte TrisB = %00000001 TrisA = %11111111 ADCON1 = %00000010 main: portb.0 = 0 ADCIN portA.0, InTime goto main myint: Disable IF INTCON.1 = 1 THEN pulsout portb.1,2 + InTime INTCON.1 = 0 ENDIF Resume Enable
Сообщение отредактировал
xxxmonejall - Вс, 31.05.2009, 01:27
|
|
|
|
vladh |
Дата: Вс, 31.05.2009, 06:31 | Сообщение # 26 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Зря Вы растраиваетесь. У Вас эта программа работает. По поводу условного оператора я уже говорил ранее. Он здесь лишний. Но если Вам это сильно нравится можете оставить - он не мешает. У меня есть замечания по моделируемой схеме. Во-первых выкиньте из схемы кварц с конденсаторами. Они здесь не нужны. Схема будет моделироваться и без них (ещё и быстрее). Так как у Вас стоит команда: pulsout portb.1,2 + InTime Которая работает с микросекундами, а развертка вашего осцилоскопа установлена на разрешение 10 мс, то естественно вы и не замечаете микросекундных изменений. Так, что если Вы всё это учтете, то увидите работу схемы и программы. Удачи. Ну а по третьему рисунку можно сказать, что Протеус просит Вас увеличить время для АЦП. Сделайте его 25-30 и все замечания пропадут.
Сообщение отредактировал
vladh - Вс, 31.05.2009, 07:56
|
|
|
|
xxxmonejall |
Дата: Пн, 08.06.2009, 17:08 | Сообщение # 27 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Вот видите, что бы я без вас делал. Большое спасибо!!!!!!! Добавлено (08.06.2009, 17.08.06) --------------------------------------------- Подскажите пожалуйста какой лучше выбрать недорогой микроконтроллер, чтобы у него было 4 канала АЦП и работал на частоте 20 мгц???
|
|
|
|
xxxmonejall |
Дата: Пн, 08.06.2009, 18:16 | Сообщение # 28 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
И снова непонятки!!!!!! На канале Б у нас импульсы с частотой в 10 Гц. На канале А должен быть одиночные импульсы в 35 микросекунд, а их там целая куча в чем фишка та??? Добавлено (08.06.2009, 18.16.54) --------------------------------------------- Code А вот код програмы...... TrisB = %11111110 TrisA = %11111111 main: if portb.1 = 1 then goto ingect1 if portb.2 = 1 then goto ingect2 if portb.3 = 1 then goto ingect3 if portb.4 = 1 then goto ingect4 goto main ingect1: if portb.0 = 1 then pulsout portb.5, 200 else goto main endif goto ingect1
ingect2: if portb.0 = 1 then pulsout portb.5,250 else goto main endif goto ingect2 ingect3: if portb.0 = 1 then pulsout portb.5,300 else goto main endif goto ingect3 ingect4: if portb.0 = 1 then pulsout portb.5,350 else goto main endif goto ingect4
|
|
|
|
slavauk |
Дата: Ср, 10.06.2009, 20:52 | Сообщение # 29 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
64
Замечания:
±
На сайте с 14.03.2009
Статус:
Offline
|
Фишка в том,что оператор IF совершенно не подхдит для отслеживания импульса. В то время ,пока на входе "1", программа успевает несколько раз пройти через оператор. Поэтому на выходе столько импульсов,сколько раз программа прошла через IF...THEN....ENDIF. Может попробуеш так Code TrisB = %11011110 TrisA = %11111111 main: if portb.1 = 1 then goto ingect1 if portb.2 = 1 then goto ingect2 if portb.3 = 1 then goto ingect3 if portb.4 = 1 then goto ingect4 goto main ingect1: if portb.1 = 0 then pulsout portb.5, 200 else goto ingect1 endif goto main
ingect2: if portb.2 = 0 then pulsout portb.5,250 else goto ingect2 endif goto main
ingect3: if portb.3 = 0 then pulsout portb.5,300 else goto ingect3 endif goto main
ingect4: if portb.4 = 0 then pulsout portb.5,350 else goto ingect4 endif
goto main Добавлено (10.06.2009, 20.52.54) --------------------------------------------- Сегодня целый день небыло нечальства на работе. Написал решение задачи с использыванием прерывания. Компилится без ошибки,но роботоспособность проверить нечем. Коментарии не писал ,так как вроде и так все понятно Code flag var byte TrisB=%11011111 TrisA=%11111111 flag=0 on interrupt goto imp INTCON=%10010000
main: if portb.1=1 and flag=1 then pulsout portb.5, 200 flag=0 endif
if portb.2=1 and flag=1 then pulsout portb.5,250 flag=0 endif
if portb.3=1 and flag=1 then pulsout portb.5,300 flag=0 endif
if portb.4=1 and flag=1 then pulsout portb.5,350 flag=0 endif flag=0 goto main
disable imp: flag=1 intcon.1=0 resume enable end end
вход импульсов - RB0 кнопки - RB1,RB2,RB3,RB4
Сообщение отредактировал
slavauk - Пн, 08.06.2009, 22:34
|
|
|
|
xxxmonejall |
Дата: Вс, 21.06.2009, 17:51 | Сообщение # 30 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Все таки остались непонятки с программой! Это при значение в 1000 и реостат на 0. Вот текст программы: @ device pic16F877A, xt_osc, wdt_off, protect_off, pwrt_on DEFINE OSC 20 Define ADC_BITS 8 Define ADC_CLOCK 3 Define ADC_SAMPLEUS 25 OPTION_REG = $7f On Interrupt Goto myint INTCON = $90 InTime var byte B1 var byte TrisB = %00000001 TrisA = %11111111 ADCON1 = %00000010 main: portb.0 = 0 ADCIN portA.0, b1 InTime = B1*100 goto main myint: Disable IF INTCON.1 = 1 THEN pulsout portb.5,4000 + InTime INTCON.1 = 0 ENDIF Resume Enable Добавлено (21.06.2009, 17.51.06) --------------------------------------------- А это при 1000 но реостат на макс: 1042686 А это при 1000 но реостат на мин: 6446844 Добавлено (21.06.2009, 17.51.53) --------------------------------------------- Это при 4000 реостат мин: 2514637
Сообщение отредактировал
xxxmonejall - Вс, 21.06.2009, 17:56
|
|
|
|