Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
07.11.2006, 17:47
|
#151
|
Временная регистрация
Регистрация: 12.06.2006
Адрес: Україна
Сообщений: 95
Сказал спасибо: 19
Сказали Спасибо 19 раз(а) в 9 сообщении(ях)
|
Спасибо, EagleB3, понял. Попробую.
Есть теперь более насущный вопорс.
Надо мне сделать тригге-защёлку (сенсорное переключения, можно ещё так сказать).Алгоритм таков Нажал на кнопку, и на выходе реверс появился и сидит там уровень без изменения, до следующего нажатия кнопки. Кнопок может быть много, работают независимо одна от других.
На 10-м уроке об таком подобном начали говорить, да так и заглохло дело. Продолжение будет? Так вот, набросал я тут програмку. Работает. Но. Если я нажал и удерживаю одну кнопку, то другая уже не работае (не переключает). Я понимаю, почему так происходит, но как сделать КРАСИВО не знаю. Пример привожу. Подскажите или дайте заготовку, пожалуйста. Я могу, конечно ещё больше написать кода, но знаю, что всё гениальное - просто. А я щас наворочу ...
while (1)
{
if ((PINB.4==0) && (PORTB.1==1)) {PORTB.1=0; while (PINB.4==0){PORTB.1=0;}};
if ((PINB.4==0) && (PORTB.1==0)) {PORTB.1=1; while (PINB.4==0){PORTB.1=1;}};
if ((PINB.3==0) && (PORTB.2==1)) {PORTB.2=0; while (PINB.3==0){PORTB.2=0;}};
if ((PINB.3==0) && (PORTB.2==0)) {PORTB.2=1; while (PINB.3==0){PORTB.2=1;}};
};
Тут у меня пример для двух кнопок и двух выходов.
(PINB.4==0)
(PINB.3==0) это уже кнопки нажаты, а изначально они подтянуты резисторами к плюсу.
|
|
|
|
07.11.2006, 19:51
|
#152
|
Гражданин KAZUS.RU
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
|
Сообщение от AVL
|
Алгоритм таков Нажал на кнопку, и на выходе реверс появился и сидит там уровень без изменения, до следующего нажатия кнопки. Кнопок может быть много, работают независимо одна от других
|
Если я правильно понял задачу то вот этот код подойдет, он очень простой. Если к порту В подключить клавиатуру а PIN1 порта А использовать как реверс то при любом нажатии клавы будет изменятся значение уровня PIN1 порта А. Можно нажимать хоть все клавиши сразу. Только я не понял а что должно происходить когда клавиша отжата. В этом примере при отпускании клавиши значение порта А опять изменится. Если нужно чтобы при отпускании клавиши значение порта А не изменялось то можно доработать код , использовать наложение маски.
void main(void)
{
unsigned char out;
while(1) {
if (!(out==PINB)){
PORTA.0=~PORTA.0;
out=PINB;
}
}
}
|
|
|
|
07.11.2006, 20:58
|
#153
|
Временная регистрация
Регистрация: 12.06.2006
Адрес: Україна
Сообщений: 95
Сказал спасибо: 19
Сказали Спасибо 19 раз(а) в 9 сообщении(ях)
|
Спасибо, но мне надо, чтоб на каждое нажатие кнопки выход делал реверс и оставался в реверсе до следующего нажатия, а не возвращался в предыдущее состояние при отпускании кнопки. Типа раз нажал, свет включился, нажал ещё раз - нема света В моём примере выход делает инверсию моментально при нажатии кнопки и сохраняет это значение во время удержания кнопки и после её отпускания "залипает" сохраняя значение которое и было во время нажатой кнопки.
|
|
|
|
08.11.2006, 20:24
|
#154
|
Гражданин KAZUS.RU
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
|
Сообщение от AVL
|
В моём примере выход делает инверсию моментально при нажатии кнопки
|
А в моем примере инверсия когда делается ? Разница в скорости срабатывания может быть только в нескольких тактах процессора .
|
|
|
|
09.11.2006, 14:04
|
#155
|
Временная регистрация
Регистрация: 12.06.2006
Адрес: Україна
Сообщений: 95
Сказал спасибо: 19
Сказали Спасибо 19 раз(а) в 9 сообщении(ях)
|
А в моем примере инверсия когда делается ? Разница в скорости срабатывания может быть только в нескольких тактах процессора .[/quote]
Дело не в тактах, это мненя не волнует. Нужно, чтоб выхож "залипал" (защёлкивался, сохранял состояние), это мне надо. Как это по человечески сделать??? Время срабатывания не рассматриваем пока-что, но к нему мы ещё вернёмся, как надо будет чуток обождать после нажатия кнопки, чтоб от ложных импульсов уберечься.
ХЕЛП, СОС, ПОМОГИТЕ!!!
|
|
|
|
09.11.2006, 18:11
|
#156
|
Частый гость
Регистрация: 03.08.2006
Сообщений: 39
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от AVL
|
А в моем примере инверсия когда делается ? Разница в скорости срабатывания может быть только в нескольких тактах процессора .
Дело не в тактах, это мненя не волнует. Нужно, чтоб выхож "залипал" (защёлкивался, сохранял состояние), это мне надо. Как это по человечески сделать??? Время срабатывания не рассматриваем пока-что, но к нему мы ещё вернёмся, как надо будет чуток обождать после нажатия кнопки, чтоб от ложных импульсов уберечься.
ХЕЛП, СОС, ПОМОГИТЕ!!!
|
А если попробовать следующее. Допустим, кнопка - pinA.1, запоминаю - в переменной Botton код типа:
...
char Botton=0x00;
...
void main (void)
{
...
if (PINA==0x01){ //нажали на кнопку
if (Botton==0x00){Botton=0x01;} //не включена - включить
else {Botton=0х00;} //иначе выключить
};
...
}
Наверно неверно...я еще плохо разбираюсь...но может поможет...
В принципе и для всего порта можно сделать, только надо не присваивать Botton какое-либо значение, а наложить "маску"...наверно так ИХМО
|
|
|
|
09.11.2006, 18:15
|
#157
|
Прохожий
Регистрация: 24.08.2005
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Цитата:
|
Код:
|
while (1)
{
if ((PINB.4==0) && (PORTB.1==1)) {PORTB.1=0; while (PINB.4==0){PORTB.1=0;}};
if ((PINB.4==0) && (PORTB.1==0)) {PORTB.1=1; while (PINB.4==0){PORTB.1=1;}};
if ((PINB.3==0) && (PORTB.2==1)) {PORTB.2=0; while (PINB.3==0){PORTB.2=0;}};
if ((PINB.3==0) && (PORTB.2==0)) {PORTB.2=1; while (PINB.3==0){PORTB.2=1;}};
}; |
|
Ну я бы тебе посоветовал сначала избавиться от циклов, ну хотя бы так
Код:
|
if (PINB.4==0) {PORTB.1 ^=(1‹‹6);} |
Ну а с дребезгом тебе надо подумать, может по таймеру, может вызывать задержку на несколько микросекунд, может у тебя основная программа будет большой и тебе ни чего не надо мудрить?!
[/quote]
|
|
|
|
09.11.2006, 18:23
|
#158
|
Прохожий
Регистрация: 24.08.2005
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сори, по ошибке 6-й бит изменил вот так должно выглядеть.
Код:
|
while (1)
{
if (PINB.4==0) {PORTB.1^=1;}
if (PINB.3==0) {PORTB.2^=1;}
}; |
|
|
|
|
10.11.2006, 10:37
|
#159
|
Временная регистрация
Регистрация: 12.06.2006
Адрес: Україна
Сообщений: 95
Сказал спасибо: 19
Сказали Спасибо 19 раз(а) в 9 сообщении(ях)
|
VasilijD, спасибо. Но это ж совсем не то:
while (1)
{
if (PINB.4==0) {PORTB.1^=1;}
if (PINB.3==0) {PORTB.2^=1;}
};
Почему? Потому, что пока PINB.4==0 на PORTB.1 будет меандр, а мне нужен ноль или единица стабильные. Что б переключилось и остановилось до следующего нажатия кнопы. В моём примере выходы защёлкивается.В твоём - нет (я правда не симулировал, но уверен).
|
|
|
|
10.11.2006, 15:51
|
#160
|
Вид на жительство
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
|
Постановка задачи:
В байте N получаем состояние кнопок (1-отжата;0-нажата). Необходимо отловить факт нажатия кнопком.
Решение задачи:
Проводим опрос кнопок с определенным временем. Если прошлый раз кнопка была отпущена(1), а сейчас нажата(0) -значит это наше условие. Вводим дополнительный байт (P-прошлое... догадались? N-настоящее), в котором храним состояние кнопок в прошлый опрос.
Пример: (рассмотрим одну тетраду -4 бита нам хватит)
Этот пример показывает все возможные состояния кнопок "до и после"
Если теперь выполним побитовое исключающее или, то получим
Наш результат можно прочесть как "было изменение"
Теперь еще проще ... мы знаем состояние прошлое и настоеще и знаем где были изменения... если нужно получить НАЖАТЫЕ кнопки, то делаем операцию побитовое И V & P
Код:
|
V 0011 &
P 1010
0010 -›данная кнопка была нажата |
Теперь, если нужно переключить каналы нагрузки. то можно применить опять XOR полченного результата с портом нагрузки. Ну... и не забудьте перекинуть значение N в P для следующей обработки, а то забудете "прошлое".
Надеюсь поможет.
PORTB ^= ((P xor PINA) & P) --› типа такой записи... но неуверен.
P = PINA
В виде домашнего задания: продумайте, чем инициализировать P, дабы при включении не взбесилась система.
_____
P.S.
Модераторы, грохните мое предыдущее сообщение!
_______________________
Сделано dosikus
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:50.
|
|