Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
30.12.2007, 16:47
|
|
Частый гость
Регистрация: 18.10.2007
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Работа порта ввода-вывода у Pic16f628A
Всем привет.
Вот какая штука:
Есть кнопка, микроконтроллер и два светодиода.
Принцип: нажимаю кнопку- загорается один светодиод, нажимаю еще раз- загорается второй, в итоге два горят.
Написал программу, зажигаю светодиод командой BSF и указанием нужного бита в PORTB. И что получаю: при нажатии один раз- первый загорается, при нажатии второй раз- первый гаснет а второй загорается. Неужели при установке одного бита регистра в 1, остальные обнуляются? Что не так делаю? Подскажите.
|
|
|
|
30.12.2007, 17:18
|
|
Гражданин KAZUS.RU
Регистрация: 17.07.2006
Адрес: PV.DP.UA
Сообщений: 620
Сказал спасибо: 3
Сказали Спасибо 60 раз(а) в 48 сообщении(ях)
|
Код в студию.
__________________
Если ты читаешь это - значит тебе нечем заняться...
|
|
|
|
30.12.2007, 17:25
|
|
Частый гость
Регистрация: 18.10.2007
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Код:
|
start
clrwdt
clrf INTCON
clrf PORTB
movlw 0x7
movwf CMCON
bsf STATUS,RP0
movlw 0x2
movwf TRISB
movlw 0x87
movwf OPTIONR bcf STATUS,RP0
M0
clrf PORTB
call SV
btfss PORTB,1
goto M1
goto M0
M1
call SV
bsf PORTB,4
call SV
bsf PORTB,6
M2
btfss PORTB,1
goto M3
goto M2
M3
call SV
bsf PORTB,5
M4
btfss PORTB,1
goto M0
goto M4
SV
clrwdt
movlw MR
movwf CNT1
movlw CR
movwf CNT2
movlw ST
movwf CNT3
dloop
decfsz CNT1,f
goto $+2
decfsz CNT2,f
goto dloop
decfsz CNT3,f
goto dloop
return
end |
|
|
|
|
30.12.2007, 18:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.11.2004
Адрес: Москва
Сообщений: 8,535
Сказал спасибо: 698
Сказали Спасибо 4,313 раз(а) в 1,977 сообщении(ях)
|
Перед изменением считывай состояние порта в переменную, модифицируй ее и записывай измененное значение обратно в порт. Это издержки Read-Modify-Write.
|
|
|
|
30.12.2007, 19:31
|
|
Частый гость
Регистрация: 18.10.2007
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
То есть это так как в CNCT- программирование станков с ЧПУ, команда отменяется другой командой из этой же группы:
т.е. bsf PORTB,1- установка первого бита
bsf PORTB,2- отмена установки первого и установка второго. Так получается?
Я пробовал записать константу в порт
movlw 0x10
movwf PORTB
а затем bsf PORTB,5
всеравно 4-й бит сбрасывается.
Спасибо за подсказку почитаю про чтение-модификация-запись.
И еще вопрос: возможно ли в MPLAB управлять портами, которые настроены на вход? Они читаются как 0, что не всегда удобно. Я предполагаю, что возможно, как это сделать. И вообще есть ли толковая литература про MPLAB, для новых версий?
Спасибо за ответы.
Всех с наступающим!
|
|
|
|
30.12.2007, 19:50
|
|
Гражданин KAZUS.RU
Регистрация: 17.07.2006
Адрес: PV.DP.UA
Сообщений: 620
Сказал спасибо: 3
Сказали Спасибо 60 раз(а) в 48 сообщении(ях)
|
только что попробовал, если исключить задержку, все нормально работает, функцию задержки нужно полностью переработать, если листинг приведен правильно, то во первых МК из нее не выйдет, во вторых, в ней не предусмотрена команда "clrwdt".
Просмотрел еще раз, из подпрограммы выйти то он выйдет, но уж больно заковыристым способом она организована.
И еще, указывайте, значения своих пременных, телепаты в отпуске, поэтому какие должны быть значения задержки можно только догадываться.
__________________
Если ты читаешь это - значит тебе нечем заняться...
|
|
|
|
30.12.2007, 20:01
|
|
Частый гость
Регистрация: 18.10.2007
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Задержка на 0,5 секунды. Перед WDT предделитель с к деления 1:128.
Если его убрать то при частоте тактового генератора 20МГц при нажатии кнопки один раз, пик воспринимает, что она была нажата дважды.
Можно ваш код посмотреть?
Можно сюда seges@ukr.net
|
|
|
|
31.12.2007, 00:49
|
|
Частый гость
Регистрация: 18.10.2007
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Всем спасибо.
Разобрался. Не предусмотрел гасящие резисторы на порты с нагрузкой (нагрузка-светодиод).
Поставил, все работает.
По поводу задержки, буду признателен за подсказку и по вопросу MPLAB тоже.
Всем успеха в наступающем году.
|
|
|
|
31.12.2007, 01:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.11.2004
Адрес: Москва
Сообщений: 8,535
Сказал спасибо: 698
Сказали Спасибо 4,313 раз(а) в 1,977 сообщении(ях)
|
Сообщение от Kabron
|
Перед изменением считывай состояние порта в переменную, модифицируй ее и записывай измененное значение обратно в порт. Это издержки Read-Modify-Write.
|
Пардон, это я лажанулся с понятно чего. Прямое управление битом соседних не портит.
|
|
|
|
31.12.2007, 01:50
|
|
Частый гость
Регистрация: 18.10.2007
Сообщений: 22
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Вообщем ситуация такая. Для тех кто не знал и кому интересно.
При изменении состояния одного или нескольких бит в регистре порта, все проходит по схеме- чтение-модификация-запись. Что это значит: это значит, что при отработке команды на изменение бита в регистре порта, порт считывается в отдельный регистр, потом там модифицируется в зависимости от команды, потом записывается обратно. В моем случае, я посадил светодиоды прям на землю катодом, а анодом к порту, что при чтении порта определило его состояние как 0, вот после модификации он в нуль и установился- сбросился. А когда поставил резистор, получился своеобразный делитель из сопротивления резистора и сопротивления диода, что и дало корректное считывание единицы из порта.
Всем спасибо, тема закрыта.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:08.
|
|