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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Модератор форума: ivan_fd  
Форум Picbasic.ru » Программирование МК » PicBasicPro » Формирование импульса после сигнала.
Формирование импульса после сигнала.
xxxmonejall Дата: Чт, 28.05.2009, 18:20  |                                                                                                                Сообщение # 16
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Quote (demanik)
Теоретически должен. Импульс ловить на прерываниях и выдавать на выход импульс считая длительность таймером конец импульса по переполнению таймера тоже через прерывание. паралельно читать АЦП.

А не могли бы вы поподробней, росказать как это все должно происходить????

vladh Дата: Пт, 29.05.2009, 07:46  |                                                                                                                Сообщение # 17
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Я говорил о 100 герцах!!!!!!!!
vladh Дата: Сб, 30.05.2009, 06:20  |                                                                                                                Сообщение # 19
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Действительно 100 Гц. Куда меня понесло? Тогда приведенный мною код Вашей программы будет работать как Вам надо.
Удачи.
demanik Дата: Сб, 30.05.2009, 11:38  |                                                                                                                Сообщение # 20
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 448
Репутация: 10   ±
Замечания:   ±
На сайте с 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
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Нет оператор условия здесь не нужен. Так как мы в самом начале в строке:
Quote (vladh)
INTCON = $90 ' Включаем рузрешение прерываний по входу INT

определили источник прерывания на которое должна реагировать программа.
ЯНДЕКС Дата: 30.05.2009
xxxmonejall Дата: Сб, 30.05.2009, 19:57  |                                                                                                                Сообщение # 22
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

А где можно почитать про эти прерывания???? И что оно такое?????
demanik Дата: Сб, 30.05.2009, 20:52  |                                                                                                                Сообщение # 23
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 448
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (xxxmonejall)
А где можно почитать про эти прерывания

Ишите в книгах. Тут насайте немного есть.


Попробуй всё и вся... может быть пол...

vladh Дата: Сб, 30.05.2009, 21:02  |                                                                                                                Сообщение # 24
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 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

Прикрепления: 6099964.jpg (72.3 Kb) · 7446055.jpg (119.1 Kb) · 6990274.jpg (51.9 Kb)

Сообщение отредактировал xxxmonejall - Вс, 31.05.2009, 01:27
vladh Дата: Вс, 31.05.2009, 06:31  |                                                                                                                Сообщение # 26
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Вот видите, что бы я без вас делал. Большое спасибо!!!!!!!

Добавлено (08.06.2009, 17.08.06)
---------------------------------------------
Подскажите пожалуйста какой лучше выбрать недорогой микроконтроллер, чтобы у него было 4 канала АЦП и работал на частоте 20 мгц???

xxxmonejall Дата: Пн, 08.06.2009, 18:16  |                                                                                                                Сообщение # 28
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Прикрепления: 2823652.jpg (39.8 Kb) · 6049620.jpg (39.4 Kb)
slavauk Дата: Ср, 10.06.2009, 20:52  |                                                                                                                Сообщение # 29
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 64
Репутация: 3   ±
Замечания:   ±
На сайте с 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)
---------------------------------------------
Сегодня целый день небыло нечальства на работе. smile
Написал решение задачи с использыванием прерывания.
Компилится без ошибки,но роботоспособность проверить нечем.
Коментарии не писал ,так как вроде и так все понятно
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
Репутация: 0   ±
Замечания:   ±
На сайте с 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

Прикрепления: 9138099.jpg (50.7 Kb) · 6446844.jpg (49.4 Kb) · 2080947.jpg (22.5 Kb) · 1042686.jpg (46.9 Kb) · 2514637.jpg (46.8 Kb)

Сообщение отредактировал xxxmonejall - Вс, 21.06.2009, 17:56
Форум Picbasic.ru » Программирование МК » PicBasicPro » Формирование импульса после сигнала.
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск: