подсчет количества импульсов
|
|
timerlan |
Дата: Сб, 03.01.2015, 19:59 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
всем доброго времени суток! столкнулся с такой траблой-нужно посчитать количество импульсов на герконе за 3-4 секунды и когда нужное наберется-подать лог. 1 на акой либо вывод микроконтроллера.
вроде, команда COUNT как раз это и делает, но то ли я её синтаксис не пойму, то ли что-то не так делаю..в общем МК-16F877A, 4Мгц и код:
W VAR BYTE PORTB = %00000001
IN VAR PORTB.0 OUT VAR PORTB.7
MAIN: COUNT IN, 3000, W IF W = 4 THEN HIGH OUT ELSE LOW OUT ENDIF
GOTO MAIN
на входе in собственно, геркон(при замыкании дает полож. импульс), на out нужно повесить единицу при 4 импульсах за 3 секунды(это как минимум, вообще время не лимитировано), но у меня ничего не появляется на выходе, как не пробовал вариации с кодом, помогите примерчиком, плиз, кто победил когда-то....
|
|
|
|
MiXaS |
Дата: Вс, 04.01.2015, 01:15 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Судя по–всему Вы новичок, поэтому бы еще несколько фото Вашей схемы. Но для начала, обратите внимание, что Вы не определили порт. TRISB = 1 я не нашел.
|
|
|
|
timerlan |
Дата: Вс, 04.01.2015, 06:36 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
MiXaS, да, спасибо, порт определил, и переписал код так
W VAR BYTE TRISB = %01111111
IN VAR PORTB.0 OUT VAR PORTB.7
PAUSE 200 CLEAR LOW OUT
MAIN: COUNT IN, 3000, W IF W = 4 THEN HIGH OUT ELSE LOW OUT ENDIF
GOTO MAIN
контроллер подал признаки жизни, но как-то странно работает-не всегда срабатывает от 4-х нажатий подряд, если сработал, то PORTB.7 светится нескольо секунд и гаснет,дальше на вход реагирует только после сброса/перезапуска МК. отлаживаю на девелоп плате ql200, так что схемы особо и нет,да и из МК всего-то два порта используютсяДобавлено (04.01.2015, 06:36) --------------------------------------------- и ещё заметил-после 4-х нажатий выход OUT появляется с задержой на сеунду-две..
|
|
|
|
ADMIN |
Дата: Вс, 04.01.2015, 11:57 | Сообщение # 4 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Скорее всего не всегда получается ровно 4 нажатия, так как дребезг контактов дает, скорее всего больше импульсов. Я бы написал >=4
|
|
|
|
MiXaS |
Дата: Вс, 04.01.2015, 12:00 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Не вижу какой кварц стоит на плате и какой прописан в коде. Для проверки правильности тактовой частоты, пропишите define... на 4 МГц, напишите простой код мигания светодиода с периодом 10 секунд. И возьмите секундомер. Дальше, думаю, понятно что надо сделать. Честно говоря уже 2 года не использую этот компилятор, я перешел на протон, но там вроде, тоже нужно объявлять symbol in = PORTB.0, могу ошибаться, уточните! Вот еще вопрос, а чем импульсы формируете? Кнопкой? Вы уверены, что в течении 3 секунд наживаете 4 раза? Добавлено (04.01.2015, 12:00) --------------------------------------------- пока писал ответ, Максим опередил. Для чистоты эксперимента я обычно дисплей использую
|
|
|
|
timerlan |
Дата: Вс, 04.01.2015, 12:03 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
кварц на 4 Мгц, да по поводу сомнений в тактовой и работоспособности-и такой мигалкой часто проверяю макеты!))))
неужеди, частоту кварца, равную 4Мгцнужно объявлять?
|
|
|
|
MiXaS |
Дата: Вс, 04.01.2015, 12:16 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Думаю, через аппаратные прерывания было бы правильнее Добавлено (04.01.2015, 12:08) --------------------------------------------- В протоне у меня был печальный опыт, написано в инструкции, что по умолчанию 4 МГц, но работало криво, пока не прописал, что кварц на 4 МГц. Думаю нестабильная работа связана с рассинхронизацией кода и кнопики. Добавлено (04.01.2015, 12:16) --------------------------------------------- Я бы сделал через прерывание. Как только появляется сигнал на портб.0, идем в подпрограмму, и инкрементируем переменную w. а дальше как у вас и есть. проверка переменной, как только наполнилась, зажечь выход, обнуль потом. Ну можно еще допилить программую защиту от дребезга контактов, хотя на мой взгляд к этой проблеме нужно подходить комплексно: аппаратно и программно.
|
|
|
|
timerlan |
Дата: Вс, 04.01.2015, 12:29 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
MiXaS, может код, хоть каркасный накидать?? я никогда с прерываниями не работал, на PBP сам уже перетащу
буду премного благодарен
|
|
|
|
MiXaS |
Дата: Вс, 04.01.2015, 15:04 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
ща, комп запущу, а то с планшета замучаюсь
|
|
|
|
MiXaS |
Дата: Вс, 04.01.2015, 15:56 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Ну написал для Вас код и с моделировал в протеусе. Все работает, думаю ничего сложного нет. Читайте даташит, тем более что он есть на русском для Вашего камня
|
|
|
|
timerlan |
Дата: Пн, 05.01.2015, 14:05 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
ага, спасибо,MiXaS! сейчас попробую! Добавлено (05.01.2015, 14:05) --------------------------------------------- чето не хочет, щас буду ковыряться!
|
|
|
|
MiXaS |
Дата: Пн, 05.01.2015, 15:42 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
У меня в протеусе работает. залейте мой hex. У меня нет возможности в железе тестить
|
|
|
|
timerlan |
Дата: Вс, 11.01.2015, 16:53 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
да, именно хекс то я и заливал!..сейчас пробую разобраться, отпишусь в любом случае)) Добавлено (11.01.2015, 16:52) --------------------------------------------- в, общем победил этот вопрос, но немного другим методом ![biggrin](http://s8.ucoz.net/sm/24/biggrin.gif) Добавлено (11.01.2015, 16:53) --------------------------------------------- сделано было так:
TRISB = %00000000 ADCON1 = 6 TRISA = %111111
BUTT VAR PORTA.0
SV0 VAR PORTB.0 SV1 VAR PORTB.1 SV2 VAR PORTB.2 SV3 VAR PORTB.3 SV4 VAR PORTB.4 SV5 VAR PORTB.5 SV6 VAR PORTB.6 SV7 VAR PORTB.7
X VAR BYTE
CLEAR PAUSE 100
LOW SV0 LOW SV1 LOW SV2 LOW SV3 LOW SV4 LOW SV5 LOW SV6 LOW SV7
LOW PORTC.0 X=0
LOOP:
IF BUTT=1 THEN PAUSE 90 X=X+1 ENDIF IF X=1 THEN PAUSE 90 HIGH SV0 ENDIF IF X=2 THEN PAUSE 90 HIGH SV1 ENDIF IF X=3 THEN PAUSE 90 HIGH SV2 ENDIF IF X=4 THEN PAUSE 90 HIGH SV3 ENDIF IF X=5 THEN PAUSE 90 HIGH SV4 ENDIF IF X=6 THEN PAUSE 90 HIGH SV5 ENDIF IF X=7 THEN PAUSE 90 HIGH SV6 ENDIF IF X=8 THEN PAUSE 90 HIGH SV7 ENDIF IF X=8 THEN HIGH PORTC.0 ENDIF IF X=9 THEN PAUSE 90 X=0 RETURN ENDIF GOTO LOOP
|
|
|
|
ADMIN |
Дата: Вс, 11.01.2015, 16:58 | Сообщение # 14 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
А теперь попробуй упростить. Также заметил ошибку.... Оператор Return - куда он возвращает? Он там не нужен
|
|
|
|
timerlan |
Дата: Вс, 11.01.2015, 18:59 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
94
Замечания:
±
На сайте с 18.03.2012
Статус:
Offline
|
ну,по моему замыслу в начало программы..сейчас уточню,как он работает... Добавлено (11.01.2015, 17:24) --------------------------------------------- только попробовал через GOSUB и GOTO, не работает....ADMIN, а как тогда правильно будет сделать возврат в начало проги по выполнению условия? Добавлено (11.01.2015, 18:59) --------------------------------------------- насчет упростить-вижу только возможность применения PORTB=%00000000....
|
|
|
|