Формирование импульса после сигнала.
|
|
xxxmonejall |
Дата: Вс, 17.05.2009, 22:01 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 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
|
|
|
|
Dmitry |
Дата: Вс, 17.05.2009, 22:51 | Сообщение # 2 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Большое спасибо. Хоть что-то стало понятным! Добавлено (20.05.2009, 12:31:32) --------------------------------------------- А пик у нас PIC16F877A.
|
|
|
|
Dmitry |
Дата: Чт, 21.05.2009, 23:23 | Сообщение # 4 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Спасибо. А JDM-мом его можно зашить????
|
|
|
|
Dmitry |
Дата: Пт, 22.05.2009, 00:21 | Сообщение # 6 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Если он у программатора в списке есть (я шью с помощью IC-prog, в т.ч. и через JDM), то да.
|
|
|
|
xxxmonejall |
Дата: Пн, 25.05.2009, 00:55 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Пример с паузами отпадает сразу. Никах пауз. В этой программе нужно большое быстродействие!!!!
|
|
|
|
holyuser |
Дата: Вт, 26.05.2009, 01:14 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
228
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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. Удачи
|
|
|
|
demanik |
Дата: Чт, 28.05.2009, 11:46 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
448
Замечания:
±
На сайте с 11.12.2007
Статус:
Offline
|
Вам нужно замерять приход импульса 5V или измерять напряжение импульса? Напишите более детально на что должен реагировать кристал.
Попробуй всё и вся... может быть пол...
|
|
|
|
xxxmonejall |
Дата: Чт, 28.05.2009, 12:12 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 11.12.2007
Статус:
Offline
|
Quote (xxxmonejall) Только вот в чем проблема будет ли успевать контролер Теоретически должен. Импульс ловить на прерываниях и выдавать на выход импульс считая длительность таймером конец импульса по переполнению таймера тоже через прерывание. паралельно читать АЦП.
Попробуй всё и вся... может быть пол...
|
|
|
|
vladh |
Дата: Чт, 28.05.2009, 15:50 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Quote (xxxmonejall) Только вот в чем проблема будет ли успевать контролер если Управляющие импульсы на порте РБ1 будут приходить с частотой в 100 Гц???? Все зависит от выбора частоты задающего генератора микроконтроллера. Например, если у Вас схема будет работать от внешнего генератора с частотой 400 кГц и ниже, то не будет успевать. Это предельная частота для Вашего случая. Т.к. 400/4 = 100 кГц - такова будет частота командных циклов. Поэтому у Вас частота однозначно должна быть выше 400 кГц.
Сообщение отредактировал
vladh - Чт, 28.05.2009, 15:51
|
|
|
|