подсчет количества импульсов
|
|
timerlan |
Дата: Пн, 12.01.2015, 19:28 | Сообщение # 31 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
Это снова я...
все ещё пытаюсь соединить две части кода, чтобы на выходе был такой алгоритм:
-нажимаем некую кнопку, butt -на выходе sv0 появляется лог1, до тех пор, пока на входе sens не появится 3 раза пол. сигнал
цикл повторяется...
код:
TRISB = %00000110 ADCON1 = 6 TRISA = %111111
butt var PORTB.1 butt2 var PORTB.2 sens VAR PORTA.0 SV0 VAR PORTB.0 X VAR BYTE CLEAR PAUSE 100 PORTB =0 X = 0
main: if butt=1 then gosub loop if butt=0 then gosub exit goto main
LOOP: if butt=1 then pause 100 high sv0 endif IF sens=1 THEN pause 80 X=X+1 ENDIF
IF X=3 THEN GOSUB ACT ENDIF
GOTO LOOP
ACT: low SV0 RETURN exit: low sv0 goto mainДобавлено (12.01.2015, 19:28) --------------------------------------------- у меня при нажатии butt это происходит, но при повторном нажатии-нет..пока не сбросишь МК.. Вот и вопрос-как этот алгоритм должен выглядеть? весь вечер бъюсь-ничего толкового....кнопку butt2 пытался встроить, чтобы независимо от прочих условий можно было подать лог1 на sv0 при нажатии на butt2, помогите составить древо цикла плиз....
|
|
|
|
MiXaS |
Дата: Пн, 12.01.2015, 20:55 | Сообщение # 32 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Цитата timerlan ( ) но при повторном нажатии-нет..пока не сбросишь МК.. У меня большое подозрение, что у вас что–то с вашим конструктором. Потому как мой код у вас не работает, count, тоже не заработал, хотя работает без проблем, ваш код глючит. ищите собаку в конструкторе. Проверьте есть ли питание на mclr, может ножки где–то не пропаяны. хотя в вашем коде я ошибку нашел, метка exit заканчивается goto, а вызывается gosub.Думаю стек с ума сошел. замение на ретурн
|
|
|
|
timerlan |
Дата: Вт, 13.01.2015, 02:58 | Сообщение # 33 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
у меня уже тоже такие мысли были, сегодня попробую макетку сделать....
|
|
|
|
ADMIN |
Дата: Вт, 13.01.2015, 03:04 | Сообщение # 34 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Светодиод асегда будет выключен. Что при нажатой, что при отжатой кнопке sv0 сбрасывается в 0. Исправь. И еще: если подпрограмма вызывается gosub, то возвращаться нужно обязательно по return.
|
|
|
|
timerlan |
Дата: Пт, 16.01.2015, 17:37 | Сообщение # 35 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
да, и выход с exit'а сделал через RETURN-эффект тот же.. Добавлено (13.01.2015, 18:07) --------------------------------------------- ADMIN, а в каком месте sv0 постоянно сбрасывается в 0? чет не вижу.. Добавлено (13.01.2015, 18:37) --------------------------------------------- чет ваще понять не могу откуда такая последовательность получается....
нажимаю для запуска butt, на выходе sv0, появляется плюс-мотор крутит, магнит 3 раза замыкает геркон на выводе sens, вывод sv0 в лог нуль,...это выполняется нормально...но почему дальше при нажатии butt нет такого же цикла?!! причем на макетке видно, что PORTB.0 иедва заметно мерцает,когда нажимаешь butt, как будто прога сбрасывает этот вывод или не дает поменять состояние...
вот как этот цикл с условиями должен выглядеть?.... Добавлено (14.01.2015, 03:22) --------------------------------------------- все оказалось просто!
вот в чем разница:
TRISB = %00000110 ADCON1 = 6 TRISA = %111111
butt var PORTB.1 butt2 var PORTB.2 sens VAR PORTA.0 SV0 VAR PORTB.0 X VAR BYTE CLEAR PAUSE 100 portb=0 X = 0
main: if butt=1 then gosub loop if butt=0 then gosub exit goto main
LOOP: if butt=1 then pause 100 high sv0 endif
IF sens=1 THEN pause 80 X=X+1 ENDIF
IF X=3 THEN GOSUB ACT ENDIF
goto loop
ACT: low SV0 pause 200 x=0 RETURN
exit: low sv0 return Добавлено (14.01.2015, 03:22) --------------------------------------------- напрочь забыл про то,что нужно обнулить переменную в конце! Добавлено (16.01.2015, 17:36) --------------------------------------------- это снова я...,подслажите, плиз, что не тау в этом коде
TRISB = %11111110
do var PORTB.1 res var PORTB.2 sens VAR PORTB.3 mot VAR PORTB.0 X VAR BYTE CLEAR PAUSE 100 portb=0 X = 0
chek:
if do=1 then gosub act if do=0 then gosub sb if res=1 then gosub act2 if res=0 then gosub sb goto chek
act: if do=1 then high mot endif
IF sens=1 THEN pause 100 X=X+1 ENDIF
IF X=3 THEN low mot pause 200 x=0 ENDIF goto act act2: high mot pause 4000 low mot return sb: pause 200 return Добавлено (16.01.2015, 17:37) --------------------------------------------- не хочет, зараза нормальнл обслуживать кнопки...
|
|
|
|
ivan_fd |
Дата: Пт, 16.01.2015, 19:07 | Сообщение # 36 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Кнопки, это do и sense??? Схема включения?
Что именно не работает?
|
|
|
|
timerlan |
Дата: Сб, 17.01.2015, 03:02 | Сообщение # 37 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
да это кнопки и есть после выполнения цикла, вызванного одной кнопкой, другая не работает и наоборот...
|
|
|
|
MiXaS |
Дата: Сб, 17.01.2015, 12:54 | Сообщение # 38 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Цитата timerlan ( ) да это кнопки и естьпосле выплнениния цикла, вызванного одной кнопкой, другаяне работает и наоборот... ого! Это на каком языке написано?!
|
|
|
|
ivan_fd |
Дата: Сб, 17.01.2015, 17:30 | Сообщение # 39 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Схему подключения нарисуйте. А то ничего не понятно.
|
|
|
|
ADMIN |
Дата: Сб, 17.01.2015, 20:01 | Сообщение # 40 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Цитата timerlan ( ) ADMIN, а в каком месте sv0 постоянно сбрасывается в 0? чет не вижу.. Ну вот: Цитата timerlan ( ) main: if butt=1 then gosub loop if butt=0 then gosub exit goto main А в подпрограммах loop и exit sv0 сбрасывается в 0.
|
|
|
|
timerlan |
Дата: Вс, 18.01.2015, 09:20 | Сообщение # 41 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
вот примерная схема Добавлено (18.01.2015, 08:43) --------------------------------------------- S1 S2-кнопки do и res, кнопка S3 -sens(это, собственно, и есть геркон) реле уже и управляет электромотором.. Добавлено (18.01.2015, 08:45) --------------------------------------------- ADMIN, как же тогда ещё вернуть этот выход порта в состояние нуль вольт?!)) Добавлено (18.01.2015, 09:08) --------------------------------------------- вот так переделал код:
TRISB = %00001110
do var PORTB.1 res var PORTB.2 sens VAR PORTB.3 mot VAR PORTB.0 X VAR BYTE CLEAR PAUSE 100 portb=0 X = 0
chek:
if do=1 then gosub act if do=0 then gosub sb if res=1 then gosub act2 if res=0 then gosub sb goto chek
act: if do=1 then high mot endif
IF sens=1 THEN pause 100 X=X+1 ENDIF
IF X=3 THEN low mot pause 200 x=0 ENDIF goto act act2: high mot pause 6000 low mot goto chek sb: return Добавлено (18.01.2015, 09:20) --------------------------------------------- не могу понять, какого хрена он работает так:
нажимаю res-отрабатывает свою подпрограмму, нажимаю do-тоже самое, вопросов нет.. нажимаю ещё раз res-ничего не происходить, подпрога вызываемая do теперь всегда нормально работает, вызываемая res больше не работает...в общем, то что вызывает res работает нормально до техпор, пока не будет запущена do, не вижу в упор, что всю программу заставляет так делать..
|
|
|
|
shaman |
Дата: Вс, 18.01.2015, 11:39 | Сообщение # 42 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
День добрый , Timerlan опишите как должна работать программа при нажатии на кнопки .
|
|
|
|
timerlan |
Дата: Вс, 18.01.2015, 12:25 | Сообщение # 43 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
shaman, ну типа так: включаем устройство-мотор молчит, при нажатии кнопки do мотор включается, делает некоторое число(пусть 5, конкретно выяснится на реальном механизме) оборотов, останивливается, ждет дальнейших команд, если опять нажата do-тоже самое, если res то крутит вал некоторе время, чтобы магнит ушел от геркона sens , как то вот так
|
|
|
|
ivan_fd |
Дата: Вс, 18.01.2015, 12:39 | Сообщение # 44 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
timerlan, та программа, что Вы дали работает так как Вы написали. Вот Вы заходите в подпрограмму act: а выхода то из нее нету. Вот потому то больше ничего не работает.
Вам же дали, ранее, рабочий вариант с прерываниями. Чем он Вас не устраивает? Если он у Вас не работает в железе, может с железом что????
|
|
|
|
shaman |
Дата: Вс, 18.01.2015, 12:41 | Сообщение # 45 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
178
Замечания:
±
На сайте с 07.11.2011
Статус:
Offline
|
А если к примеру кто то забудет выключить кнопку DO и нажмет RES то тогда что будет?????
|
|
|
|