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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
BUTTON или как зажечь гирлянду
pasha Дата: Вс, 06.02.2011, 00:51  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 4
Репутация: 0   ±
Замечания:   ±
На сайте с 19.01.2011

Статус: Offline

О великие ГУРУ! pray
Помогите пожалуйста начинающему.
Задача: Нажатием на микрик изменять последовательность включения светодиодов (с лева на право и на оборот).
ТЗ: На PIC16F877A, где PORTA.0 - кнопка и PORTB - светодиоды (8-шт).

Код:

ADCON1 = %00000111 ' Установим все выводы PORTA как цифровые.
TRISB = %00000000
PORTB = %00000000
symbol LEDS = PORTB 'Все светодиоды
I var byte
B0 VAR BYTE
B0 = 0

main:
BUTTON PORTA.0,0,255,255,B0,1,Right
GOTO Left

Right:
PORTA.0 = 0
LEDS = 1
pause 500
for I = 0 to 6
LEDS = LEDS << 1
pause 500
next
goto main

Left:
PORTA.0 = 1
LEDS = 255
pause 500
for I = 0 to 6
LEDS = LEDS >> 1
pause 500
next
goto main

При компиляции и проверке зажигание светодиодов происходит только в одну сторону.

ЯНДЕКС Дата: 06.02.2011
ADMIN Дата: Вс, 06.02.2011, 02:56  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Давай сформулируем задачу поточнее? Проверка кнопки у тебя происходит один раз в секунду. То есть микрик теряет функцию моментального переключения с одного направления, на другое. Потом, как светодиоды должны бегать? Все сразу? или по одному? Во-вторых, зачем нужна команда button? Думаю, устранение дребезга здесь ни к чему. Потом, зачем строчки PORTA.0 = 0 и PORTA.0 = 1? Ни к чему. Потом, зачем паузы перед циклами For...Next? Ответь на вопросы и сформулируй задачу. Потом продолжим
pasha Дата: Вс, 06.02.2011, 14:51  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 4
Репутация: 0   ±
Замечания:   ±
На сайте с 19.01.2011

Статус: Offline

Доброе время суток!
Я хочу чтобы светодиоды включались в цикле по одному через пол секунды, то есть зажегся первый потом через 0,5 сек зажжется второй .... и когда зажжется 8 то все потухли и так по циклу. Потом если нажать на микрик то светодиоды должны загораться в обратном порядке, то есть 8 потом 7 .... и до первого. В общем микрик должен определять направление включения светодиодов.

А по поводу: PORTA.0 = 0 и PORTA.0 = 1 таки да полная ерунда.

MiXaS Дата: Пн, 07.02.2011, 08:05  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

А, что если так? Пример приметивный, но понять я думаю можно.


Сообщение отредактировал MiXaS - Пн, 07.02.2011, 08:10
pasha Дата: Пн, 07.02.2011, 22:12  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Новенький
Сообщений: 4
Репутация: 0   ±
Замечания:   ±
На сайте с 19.01.2011

Статус: Offline

Спасибо MiXaS.
Прошил микросхемку, запустил на плате и sad :( sad

запускается блок pravo:

но при нажатии на Button porta.0,0,255,255,b,1,levo ' смена направления не всегда срабатывает смена направления.

Сообщение отредактировал pasha - Пн, 07.02.2011, 22:35
ADMIN Дата: Вт, 08.02.2011, 06:58  |                                                                                                                Сообщение # 6
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Потому что когда ты нажимаешь на кнопку, иногда программа не обрабатывает оператор button, а находится в паузе, например. Для этих целей лучше использовать прерывание. Можно по таймеру опрашивать кнопку, можно саму кнопку повесить на вход INT.
pasha Дата: Вт, 08.02.2011, 09:41  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Новенький
Сообщений: 4
Репутация: 0   ±
Замечания:   ±
На сайте с 19.01.2011

Статус: Offline

Спасибо ADMIN!

А можно более детально про "кнопку повесить на вход INT" и если не затруднит с примером

ADMIN Дата: Вт, 08.02.2011, 11:20  |                                                                                                                Сообщение # 8
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Мы сделаем еще проще. Вот такой код:
Code

SYMBOL LEDS = PORTB  
I var BYTE  
btTest var BIT
symbol Button_ = PORTA.0  

ADCON1 = %00000111  
TRISB = %00000000  
LEDS = 1
btTest = 1
GOTO main

main:

      IF btTest = 1 THEN  
         LEDS = LEDS << 1
         IF LEDS = 0 THEN LEDS = 1
      ELSE
         LEDS = LEDS >> 1
         IF LEDS = 0 THEN LEDS = 128  
      ENDIF
      FOR i = 0 TO 50
           pause 10
           IF Button_ = 0 THEN
              btTest = ~btTest
           ENDIF
           while button_ = 0 ' Это чтобы за одну проверку бит btTest не менялся несколько раз, а срабатывал только после отпускания кнопки
           wend
      NEXT
GOTO main

Так 100 % работает. Просто не надо делать большие паузы, а организовывать их циклом, в который можно воткнуть проверку условия(в данном случае, нажатие кнопки
MiXaS Дата: Вт, 08.02.2011, 13:16  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Quote (pasha)
Спасибо MiXaS. Прошил микросхемку, запустил на плате и sad запускается блок pravo: но при нажатии на Button porta.0,0,255,255,b,1,levo ' смена направления не всегда срабатывает смена направления.

Соглашусь с ADMINом! Это вызвано большой паузой=500 милисекунд. Если подольше держать нажатой кнопку, то может работать стабильнее. Самый правильный вариан, использовать прерывание. http://picbasic.ru/forum/5-568-1. Здесь пример обрабатывания энкодера,но и для кнопки можно приспособить. Еще в книге Хилинского есть описание команды On Interrupt.

  • Страница 1 из 1
  • 1
Поиск: