Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Простейшая кнопка на PIC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
TimR
Привет всем!!!
Пожалуйста помогите разобраться с ерундой. Программа - простейшая кнопка на PIC16F627,
создана в качестве обучаловки. Принцип такой: подаем внешний сигнал 5V на МК (провод естественно общий) на вывод 4 PortB и должен загорается светодиод на PortB,2.
Я уже пробовал задействовать и PortA, и с подтягивающими пробовал - ничего.
Как-то странно, видел много исходников, где "кнопка" делается именно по такому принципу.
В итоге, светодиод либо вообще не загорается, либо горит постоянно. help.gif

(Извиняйте за "нижний пробел" - его как будто нет)
;-----------------------------------------------------------------------------
стандартные установки OptionR, отключение ненужных модулей.
;---------------------------------------------------------------------------------------
Start________btfsc PortB,4 ; если присутствует высокий уровень то
____________goto hight ; переход на hight
____________goto low ; иначе на low
;------------------------------------------------------------
hight________bsf PortB,2 ; "зажечь" 2-й порт
____________call delay ; переход на подпрогу задержки
____________goto Start ; при возврате переход в режим сканирования
;-------------------------------------------
low_________bcf PortB,2 ;
___________ call delay
___________ goto Start
;-------------------------------------------
delay______ задержка........ 1сек
__________ return
;************************
end
NULL
Цитата(TimR @ Aug 30 2006, 21:26) *
;-----------------------------------------------------------------------------
стандартные установки OptionR, отключение ненужных модулей.


А порты на вход - выход настроены корректно?
m_y
Должен быть проинициализирован порт В - бит 4 вход, бит 2 выход в регистре TRISB - соответсвенно TRISB4 - 1, TRISB2 - 0
TimR
Это все сделано. плюс к этому - отключены ненужные модули PICа
Вообще, хотел еще попробовать через модуль компараторов, но опять ничего: все делаю по даташиту но светодиод не горит - может дело в том что вход рассчитан на аналоговый сигнал?
Но просто "на вход" он должен работать.
Было еще так: для зажигания требовался не сигнал 5В, а "общий" - я палец прикладывал к клемме - и работает.
=L.A.=
;---------------------------------------------------------------------------------------
Start
_____clrwdt
_____btfsc PortB,4
_____bsf portb,2
_____btfss portb,4
_____bcf PortB,2
;
_____goto Start
;************************
end
Alexsys
Мне кажется дело вот в чем, опрос кнопки нужно производить в бесконечном цикле. При твоем варианте программа при запуске выполняется от начала до конца, после чего процессор ничего не будет делать т.к. вся записанная в него программа выполнена smile.gif . Чтобы сделать бесконечный цикл воткни в свою прогу комманду goto Start перед end.
vanner
Покажи полный код своей программы, тогда можно будет что-то сказать.
upc2
Вот так ваш код работает

LIST p=16F84 ; PIC16F844 is the target processor

#include "P16F84.INC" ; Include header file

CBLOCK 0x10 ; Temporary storage
pos
dc1
dc2
ENDC
LIST p=16F84 ; PIC16F844 is the target processor

#include "P16F84.INC" ; Include header file

CBLOCK 0x10 ; Temporary storage
ENDC

ORG 0
entrypoint goto start

ORG 4
intvector goto intvector

start clrw ; Zero.

movwf PORTB ; Ensure PORTB is zero before we enable it.
bsf STATUS,RP0 ; Select Bank 1
movlw 0xF0 ; Set port B bits 0-3 as outputs
movwf TRISB ; Set TRISB register.

bcf STATUS,RP0 ; Select Bank 0



;Main loop
loop
btfsc PORTB,4
goto bhight
goto blow

bhight
bsf PORTB,2 ;
call delay ;
goto loop ;

blow
bcf PORTB,2 ;
call delay;
goto loop;

delay movlw 18 ; Outer loop iteration count
movwf dc1
dl1 clrf dc2 ; Initialize inner loop
dl2 nop
nop
decfsz dc2,F
goto dl2
decfsz dc1,F
goto dl1
return

END


У моего компилятора были претензии к PortB и к именам low , hight
TimR
Сначало Всем огромное спасибо!

=L.A.=, такой же код был написан с самого начала, но выходило все то же: при приближении пальца частота "загораний" светодиода увеличивалась.

vanner, весь код здесь, добавить извиняюсь, нечего. Тот код, что написал upc2 в ассемблерном варианте мало чем отличается от моего.

Alexsys, возможно вы и правы, проверю.

upc2, спасибо. Ошибка, скорее всего, в неправильности моей электрической схемы (хорошо что Вы привели схему). А фишка с low и hight - это интересно, но у меня таких проблем не было.


Попробую с учетом всех предложений.
=L.A.=
Цитата(TimR @ Sep 7 2006, 20:52) *
=L.A.=, такой же код был написан с самого начала, но выходило все то же: при приближении пальца частота "загораний" светодиода увеличивалась.


Патамушта надо ПОДВЕШИВАТЬ вход к питанию. Или внешним резистором или внутренним в ПИКе
Мёбиус
Цитата(=L.A.= @ Sep 9 2006, 08:16) *
Цитата(TimR @ Sep 7 2006, 20:52) *

=L.A.=, такой же код был написан с самого начала, но выходило все то же: при приближении пальца частота "загораний" светодиода увеличивалась.


Патамушта надо ПОДВЕШИВАТЬ вход к питанию. Или внешним резистором или внутренним в ПИКе


Типа ОФФ - просто встретил можно сказать знакомого - вот так бродишь по ИНЕТу и нет-нет да и наткнёшься на знакомый НИК. Привет =L.A.= от NSS (conference from www.microchip.ru) smile.gif
Atashi
Цитата(TimR @ Sep 7 2006, 20:52) *
=L.A.=, такой же код был написан с самого начала, но выходило все то же: при приближении пальца частота "загораний" светодиода увеличивалась.

у пиков есть одна пакость: при переключении одного бита сначала считывается состояние всего порта, потом внутрях переставляется бит, а после этого весь байт отправляется наружу.
так вот в Вашем порте Б имеется вход прерывания, из-за него может чепуха получаться. зафиксируйте его.
Atashi
Цитата(Atashi @ Sep 12 2006, 15:31) *
Цитата(TimR @ Sep 7 2006, 20:52) *

=L.A.=, такой же код был написан с самого начала, но выходило все то же: при приближении пальца частота "загораний" светодиода увеличивалась.

у пиков есть одна пакость: при переключении одного бита сначала считывается состояние всего порта, потом внутрях переставляется бит, а после этого весь байт отправляется наружу.
так вот в Вашем порте Б имеется вход прерывания, из-за него может чепуха получаться. зафиксируйте его.

ps. однажды пришлось делать даже вот так: создать переменную, менять бит в ней, а потом отправлять. это чтоб избежать "паразитного" считывания.
от ошибок избавились!
Денис v
Цитата(upc2 @ Sep 5 2006, 15:33) *
Вот так ваш код работает
...
У моего компилятора были претензии к PortB и к именам low , hight


А что это за симулятор? Какая программа делает такие красивые картинки?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.