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

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

Статус: Offline

Есть несколько вопросов по программе. Сильно не судите я только учусь, может идеи у меня с долей маразма но все таки. Первое что я не могу понять это АЦП: какие значения записываются в пременую? И второе это по метке ingect:
Если порт if portA.1 = 1 тогда выполняется pulsout portb.1 xx + InTime
И сразу за ним goto main
А если порт portA.1 = 0 тогда возвращаемся к метке ingect:
Ну по крайней мере мне нужно чтобы так было.
Все ли я правильно сделал????

Define ADC_BITS 8
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 50
xx con 400 ; 4 мсек
InTime var byte
TrisB = %00000000
TrisA = %11111111
ADCON1 = %00000010
main:
portb.0 = 0
ADCIN portA.0, InTime
ingect:
if portA.1 = 1 then
pulsout portb.1 xx + InTime
else
if portA.1 = 0 then ingect
goto main

ЯНДЕКС Дата: 17.05.2009
Dmitry Дата: Вс, 17.05.2009, 22:51  |                                                                                                                Сообщение # 2
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 157
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Пара замечаний:
Порт А, похоже, сконфигурирован на 5 аналоговых входов (какой пик?)
Чтение бита с аналогового входа porta.0 всегда даст 0.

Стоит выравнивание результата по левому краю (adcon1.7 = 0). Может, для команды ADCIN с восьмибитным результатом это и не приципиально, не пробовал. Но лучше поставить по правому краю.

т.е.:
ADCON1 = %10001110 '(по правому краю и аналоговый вход только porta.0)

В переменную InTime должно записаться число от 0 (0 в) до 255 (+5 В)

Ну и после else второй if не нужен, т.к. у цифрового входа может быть только два значения

Итого:

Code

Define ADC_BITS 8    
Define ADC_CLOCK 3    
Define ADC_SAMPLEUS 50    
xx con 400 ; 4 мсек    
InTime var byte    
TrisB = %00000000    
TrisA = %11111111    
ADCON1 = %10001110

main:      portb.0 = 0    
                ADCIN 0, InTime    
ingect:     if portA.1 = 1 then    
                    pulsout portb.1, xx + InTime    
                else    
                   goto ingect
                endif
                goto main

Сообщение отредактировал Dmitry - Вс, 17.05.2009, 22:55
xxxmonejall Дата: Ср, 20.05.2009, 12:31  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Большое спасибо. Хоть что-то стало понятным!

Добавлено (20.05.2009, 12:31:32)
---------------------------------------------
А пик у нас PIC16F877A.

Dmitry Дата: Чт, 21.05.2009, 23:23  |                                                                                                                Сообщение # 4
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 157
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Quote (xxxmonejall)
А пик у нас PIC16F877A.

Как я буквально позавчера обнаружил (в кои-то веки зашел на микрочип.ком :-) ) -
это уже устаревший процессор. Его преемник PIC16F887 и стоит где-то в 1,8 раза дешевле (в т.ч. и у нас в магазине) и по возможностям его перекрывает (например, работает начиная с 2,2 в). По ножкам совместим полностью, программно, можно считать, тоже. Так что имейте ввиду.

Сообщение отредактировал Dmitry - Чт, 21.05.2009, 23:25
xxxmonejall Дата: Чт, 21.05.2009, 23:55  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Спасибо. А JDM-мом его можно зашить????
Dmitry Дата: Пт, 22.05.2009, 00:21  |                                                                                                                Сообщение # 6
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 157
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Если он у программатора в списке есть (я шью с помощью IC-prog, в т.ч. и через JDM), то да.
xxxmonejall Дата: Пн, 25.05.2009, 00:55  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Как в программу вставить прерывание.
Чтобы программ ждала появления импульса на порте portA.1
и аж тогда выполняла pulsout portb.1, xx + InTime
Code
@ device pic16F877A, xt_osc, wdt_off, protect_off, pwrt_on
DEFINE OSC 20
Define ADC_BITS 8
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 50
xx con 400 ; 4 ìñåê
InTime var byte
TrisB = %00000000
TrisA = %11111111
ADCON1 = %10001110
porta = 0
portb = 0
portc = 0

main: portb.0 = 0
ADCIN 0, InTime

ingect:
Вот сюда я так думаю..... чето оно мне не дается, я просто не могу понять как оно работает????

if portA.1 = 1 then
pulsout portb.1, xx + InTime
else
goto ingect
endif
goto main

Сообщение отредактировал xxxmonejall - Пн, 25.05.2009, 01:00
DIKTATOR Дата: Пн, 25.05.2009, 23:59  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 76
Репутация: 2   ±
Замечания:   ±
На сайте с 24.07.2008

Статус: Offline

Как в программу вставить прерывание.
Чтобы программ ждала появления импульса на порте portA.1
и аж тогда выполняла pulsout portb.1, xx + InTime

Сам я никогда прерывания ещё не использовал.
Code
пример без прерывания:
maindik:
if portb.0 = 1 then maindikos
'тут ваша основная программа
goto maindik

maindikos:
portb = %00001000
pause 10
portb = %00000100
pause 10
portb = %00000010
pause 10
portb = %00000001
pause 10
goto maindik

пример без прерывания2:
maindik:
if portb.0 = 1 then maindikos
'тут ваша основная программа
goto maindik

maindikos:
if portb.0 = 0 then maindik 'когда на портБ перестанет подаваться сигнал 1 , программа перейдёт к метке maindik
'тут ваша основная прогамма
goto maindik


Используйте симулятор ПРОТУЕС !!! Реальная вещь!!
Я снова тут, но не всегда свободен.
xxxmonejall Дата: Вт, 26.05.2009, 00:30  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Пример с паузами отпадает сразу. Никах пауз. В этой программе нужно большое быстродействие!!!!
holyuser Дата: Вт, 26.05.2009, 01:14  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 228
Репутация: 5   ±
Замечания:   ±
На сайте с 12.12.2007

Статус: Offline

По сути это не прерывание, а ожидание определенного события.
Если, ожидая событие, процессор ничего другого не должен делать,
то самую быструю реакцию на событие, в Вашем случае,
можно сделать так:
Code
xx con 400  
InTime var byte  

main:  
ADCIN 0, InTime  
ingect:  
IF portA.1 = 0 THEN ingect   'ожидание в пустом цикле
PULSOUT portB.1, xx + InTime  'событие наступило - выполняем что надо
GOTO main

Притом, надо быть уверенным, что во время выполнения PULSOUT portB.1,...
ожидаемое событие не наступит снова, если это случится,
то оно будет пропущено.
vladh Дата: Вт, 26.05.2009, 05:20  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Проходя мимо решил сделать несколько своих замечаний на поставленные автором топика вопросы. Итак:
Quote (xxxmonejall)
какие значения записываются в пременую?

1. В переменную InTime записывается результат аналого-цифрового преобразования произведенного в канале PORTA.0(в данном случае). А, что такое АЦП Вы можете прочитать хотя бы здесь: http://ru.wikipedia.org/wiki/Аналого-цифровой_преобразователь
2. Второй Ваш вопрос (по метке ingect:) заявлен но не сформулирован. Поэтому не ясно, что вам непонятно с этой меткой.
3. Как Вам уже указал Dmitry из Вашего определения:
Quote (xxxmonejall)
ADCON1 = %00000010
следует, что все четыре входа порта А настроены как как аналоговые входы, поэтому ожидать того, что PORTA.1 будет анализировать цифровую ситуацию бесполезно. Как правильно замечно там всегда будет - 0.
4. Прерывания в работе этого микроконтроллера могут производится только по изменению уровня сигнала на выводах PORTB.4-PORTb.7 и по появлению импульса на выводе PORTB.0. Поэтому если Вам нужна обработка прерываний по появлению импульса, заведите этот импульс на вывод PORTB.0.
Удачи
ЯНДЕКС Дата: 26.05.2009
demanik Дата: Чт, 28.05.2009, 11:46  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 448
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Вам нужно замерять приход импульса 5V или измерять напряжение импульса? Напишите более детально на что должен реагировать кристал.

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

xxxmonejall Дата: Чт, 28.05.2009, 12:12  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Мне нужно сначала снять сигнал с АЦП от 0 дщ 5 в тоисть 0 до 255.
Потом при появление импульса допусти на выводе РБ1 подать импульс на вывод РБ2 длиной в 4мс + значение АЦП. Только вот в чем проблема будет ли успевать контролер если Управляющие импульсы на порте РБ1 будут приходить с частотой в 100 Гц????

Сообщение отредактировал xxxmonejall - Чт, 28.05.2009, 12:12
demanik Дата: Чт, 28.05.2009, 14:32  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 448
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (xxxmonejall)
Только вот в чем проблема будет ли успевать контролер

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


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

vladh Дата: Чт, 28.05.2009, 15:50  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Quote (xxxmonejall)
Только вот в чем проблема будет ли успевать контролер если Управляющие импульсы на порте РБ1 будут приходить с частотой в 100 Гц????

Все зависит от выбора частоты задающего генератора микроконтроллера. Например, если у Вас схема будет работать от внешнего генератора с частотой 400 кГц и ниже, то не будет успевать. Это предельная частота для Вашего случая. Т.к. 400/4 = 100 кГц - такова будет частота командных циклов. Поэтому у Вас частота однозначно должна быть выше 400 кГц.

Сообщение отредактировал vladh - Чт, 28.05.2009, 15:51
Форум Picbasic.ru » Программирование МК » PicBasicPro » Формирование импульса после сигнала.
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск: