Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

Закрытая тема
Опции темы
Непрочитано 07.11.2006, 17:47   #151
AVL
Временная регистрация
 
Регистрация: 12.06.2006
Адрес: Україна
Сообщений: 95
Сказал спасибо: 19
Сказали Спасибо 19 раз(а) в 9 сообщении(ях)
AVL на пути к лучшему
По умолчанию

Спасибо, 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) это уже кнопки нажаты, а изначально они подтянуты резисторами к плюсу.
Реклама:
AVL вне форума  
Непрочитано 07.11.2006, 19:51   #152
Zemlyanov
Гражданин KAZUS.RU
 
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
Zemlyanov на пути к лучшему
По умолчанию

Сообщение от AVL
Алгоритм таков Нажал на кнопку, и на выходе реверс появился и сидит там уровень без изменения, до следующего нажатия кнопки. Кнопок может быть много, работают независимо одна от других
Если я правильно понял задачу то вот этот код подойдет, он очень простой. Если к порту В подключить клавиатуру а PIN1 порта А использовать как реверс то при любом нажатии клавы будет изменятся значение уровня PIN1 порта А. Можно нажимать хоть все клавиши сразу. Только я не понял а что должно происходить когда клавиша отжата. В этом примере при отпускании клавиши значение порта А опять изменится. Если нужно чтобы при отпускании клавиши значение порта А не изменялось то можно доработать код , использовать наложение маски.
void main(void)
{
unsigned char out;
while(1) {
if (!(out==PINB)){
PORTA.0=~PORTA.0;
out=PINB;
}
}
}
Zemlyanov вне форума  
Непрочитано 07.11.2006, 20:58   #153
AVL
Временная регистрация
 
Регистрация: 12.06.2006
Адрес: Україна
Сообщений: 95
Сказал спасибо: 19
Сказали Спасибо 19 раз(а) в 9 сообщении(ях)
AVL на пути к лучшему
По умолчанию

Спасибо, но мне надо, чтоб на каждое нажатие кнопки выход делал реверс и оставался в реверсе до следующего нажатия, а не возвращался в предыдущее состояние при отпускании кнопки. Типа раз нажал, свет включился, нажал ещё раз - нема света В моём примере выход делает инверсию моментально при нажатии кнопки и сохраняет это значение во время удержания кнопки и после её отпускания "залипает" сохраняя значение которое и было во время нажатой кнопки.
AVL вне форума  
Непрочитано 08.11.2006, 20:24   #154
Zemlyanov
Гражданин KAZUS.RU
 
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
Zemlyanov на пути к лучшему
По умолчанию

Сообщение от AVL
В моём примере выход делает инверсию моментально при нажатии кнопки
А в моем примере инверсия когда делается ? Разница в скорости срабатывания может быть только в нескольких тактах процессора .
Zemlyanov вне форума  
Непрочитано 09.11.2006, 14:04   #155
AVL
Временная регистрация
 
Регистрация: 12.06.2006
Адрес: Україна
Сообщений: 95
Сказал спасибо: 19
Сказали Спасибо 19 раз(а) в 9 сообщении(ях)
AVL на пути к лучшему
По умолчанию

А в моем примере инверсия когда делается ? Разница в скорости срабатывания может быть только в нескольких тактах процессора .[/quote]

Дело не в тактах, это мненя не волнует. Нужно, чтоб выхож "залипал" (защёлкивался, сохранял состояние), это мне надо. Как это по человечески сделать??? Время срабатывания не рассматриваем пока-что, но к нему мы ещё вернёмся, как надо будет чуток обождать после нажатия кнопки, чтоб от ложных импульсов уберечься.
ХЕЛП, СОС, ПОМОГИТЕ!!!
AVL вне форума  
Непрочитано 09.11.2006, 18:11   #156
Aladar
Частый гость
 
Регистрация: 03.08.2006
Сообщений: 39
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Aladar на пути к лучшему
По умолчанию

Сообщение от AVL
А в моем примере инверсия когда делается ? Разница в скорости срабатывания может быть только в нескольких тактах процессора .

Дело не в тактах, это мненя не волнует. Нужно, чтоб выхож "залипал" (защёлкивался, сохранял состояние), это мне надо. Как это по человечески сделать??? Время срабатывания не рассматриваем пока-что, но к нему мы ещё вернёмся, как надо будет чуток обождать после нажатия кнопки, чтоб от ложных импульсов уберечься.
ХЕЛП, СОС, ПОМОГИТЕ!!!
А если попробовать следующее. Допустим, кнопка - pinA.1, запоминаю - в переменной Botton код типа:

...
char Botton=0x00;
...
void main (void)
{
...
if (PINA==0x01){ //нажали на кнопку
if (Botton==0x00){Botton=0x01;} //не включена - включить
else {Botton=0х00;} //иначе выключить
};
...
}

Наверно неверно...я еще плохо разбираюсь...но может поможет...

В принципе и для всего порта можно сделать, только надо не присваивать Botton какое-либо значение, а наложить "маску"...наверно так ИХМО
Aladar вне форума  
Непрочитано 09.11.2006, 18:15   #157
VasiliyD
Прохожий
 
Регистрация: 24.08.2005
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
VasiliyD на пути к лучшему
По умолчанию

Цитата:
Код:
 
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]
VasiliyD вне форума  
Непрочитано 09.11.2006, 18:23   #158
VasiliyD
Прохожий
 
Регистрация: 24.08.2005
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
VasiliyD на пути к лучшему
По умолчанию

Сори, по ошибке 6-й бит изменил вот так должно выглядеть.
Код:
while (1) 
{ 
if (PINB.4==0) {PORTB.1^=1;} 
if (PINB.3==0) {PORTB.2^=1;} 
};
VasiliyD вне форума  
Непрочитано 10.11.2006, 10:37   #159
AVL
Временная регистрация
 
Регистрация: 12.06.2006
Адрес: Україна
Сообщений: 95
Сказал спасибо: 19
Сказали Спасибо 19 раз(а) в 9 сообщении(ях)
AVL на пути к лучшему
По умолчанию

VasilijD, спасибо. Но это ж совсем не то:
while (1)
{
if (PINB.4==0) {PORTB.1^=1;}
if (PINB.3==0) {PORTB.2^=1;}
};
Почему? Потому, что пока PINB.4==0 на PORTB.1 будет меандр, а мне нужен ноль или единица стабильные. Что б переключилось и остановилось до следующего нажатия кнопы. В моём примере выходы защёлкивается.В твоём - нет (я правда не симулировал, но уверен).
AVL вне форума  
Непрочитано 10.11.2006, 15:51   #160
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию

Постановка задачи:
В байте N получаем состояние кнопок (1-отжата;0-нажата). Необходимо отловить факт нажатия кнопком.
Решение задачи:
Проводим опрос кнопок с определенным временем. Если прошлый раз кнопка была отпущена(1), а сейчас нажата(0) -значит это наше условие. Вводим дополнительный байт (P-прошлое... догадались? N-настоящее), в котором храним состояние кнопок в прошлый опрос.
Пример: (рассмотрим одну тетраду -4 бита нам хватит)
Код:
  P 1010
  N 1001
Этот пример показывает все возможные состояния кнопок "до и после"
Если теперь выполним побитовое исключающее или, то получим
Код:
  V 0011
Наш результат можно прочесть как "было изменение"
Теперь еще проще ... мы знаем состояние прошлое и настоеще и знаем где были изменения... если нужно получить НАЖАТЫЕ кнопки, то делаем операцию побитовое И V & P
Код:
 V 0011 &
 P 1010
   0010 -›данная кнопка была нажата
Теперь, если нужно переключить каналы нагрузки. то можно применить опять XOR полченного результата с портом нагрузки. Ну... и не забудьте перекинуть значение N в P для следующей обработки, а то забудете "прошлое".
Надеюсь поможет.

PORTB ^= ((P xor PINA) & P) --› типа такой записи... но неуверен.
P = PINA

В виде домашнего задания: продумайте, чем инициализировать P, дабы при включении не взбесилась система.
_____
P.S.
Модераторы, грохните мое предыдущее сообщение!
_______________________
Сделано dosikus
AndryG вне форума  
Закрытая тема

Закладки


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ARM начинающим с нуля - KEIL с лекарсвом, методички, книги avr123-nm-ru Микроконтроллеры, АЦП, память и т.д 22 31.03.2010 00:24
off Шарж на мой курс - portveshok123.nm.ru avr123-nm-ru Отвлекитесь, эмбеддеры! 16 07.02.2010 15:02
Помогите начинающим KarDi Делимся опытом 24 25.12.2007 00:51
PROTEUS краткий курс - самоучитель avr123-nm-ru Proteus 85 06.02.2007 23:46


Часовой пояс GMT +4, время: 16:50.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot