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

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

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

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

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

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

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

 
Опции темы
Непрочитано 08.10.2009, 13:14  
FedorChek
Прописка
 
Регистрация: 24.07.2008
Сообщений: 151
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
FedorChek на пути к лучшему
По умолчанию Re: Инверсия кнопок

При такой конструкции ни одна из кнопок не работает
почему не знаю
на всякий случай приведу даташит на мегу88
1 нога PD3
2 нога PD4
32 нога PD2
Может я туплю
из кода
Код:
unsigned char read_buttons_ones(void)
{
unsigned char temp;
temp=PIND;
temp››=2;
temp|=0xf8;
return ~temp;
}
получил
Код:
unsigned char read_buttons_ones(void)
{
return ((PIND ›› 2) ^ 0x01) & 0x07;
}
Реклама:
FedorChek вне форума  
Непрочитано 08.10.2009, 19:19  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Инверсия кнопок

Сообщение от FedorChek Посмотреть сообщение
При такой конструкции ни одна из кнопок не работает
почему не знаю
на всякий случай приведу даташит на мегу88
1 нога PD3
2 нога PD4
32 нога PD2
Может я туплю
из кода
Код:
unsigned char read_buttons_ones(void)
{
unsigned char temp;
temp=PIND;
temp››=2;
temp|=0xf8;
return ~temp;
}
получил
Код:
unsigned char read_buttons_ones(void)
{
return ((PIND ›› 2) ^ 0x01) & 0x07;
}
Да вроде все правильно. На схеме транзистор npn эммитером на землю?
kison вне форума  
Непрочитано 08.10.2009, 20:15  
FedorChek
Прописка
 
Регистрация: 24.07.2008
Сообщений: 151
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
FedorChek на пути к лучшему
По умолчанию Re: Инверсия кнопок

Да, эммитер на землю. Главное что при Вашей схеме не работает даже 32 нога (кнопка с транзистором). А как будет выглядеть она с переменной temp? или как Ваша сшема будет выглядеть с подключением одной 32 ноги может дойду "методом тыка" до истины

Последний раз редактировалось FedorChek; 08.10.2009 в 20:23.
FedorChek вне форума  
Непрочитано 08.10.2009, 22:52  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Инверсия кнопок

Сообщение от FedorChek Посмотреть сообщение
Да, эммитер на землю. Главное что при Вашей схеме не работает даже 32 нога (кнопка с транзистором). А как будет выглядеть она с переменной temp? или как Ваша сшема будет выглядеть с подключением одной 32 ноги может дойду "методом тыка" до истины
Да похоже первый вариант был все же правильным если бы я не опечатался - написал 0х06 вместо 0х07
kison вне форума  
Непрочитано 09.10.2009, 15:46  
FedorChek
Прописка
 
Регистрация: 24.07.2008
Сообщений: 151
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
FedorChek на пути к лучшему
По умолчанию Re: Инверсия кнопок

return ((PIND ›› 2) ^ 0x01) & 0xf8;
С таким кодом 32 кнопка (нога) работает однако остальные две которые подключены не к земле не работают, что то я совсем запутался.
FedorChek вне форума  
Непрочитано 09.10.2009, 16:21  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Инверсия кнопок

Сообщение от FedorChek Посмотреть сообщение
return ((PIND ›› 2) ^ 0x01) & 0xf8;
С таким кодом 32 кнопка (нога) работает однако остальные две которые подключены не к земле не работают, что то я совсем запутался.
Я уже тоже запутался. Начнем сначала - что изменилось в схеме подключения 32 ноги?
С &0xF8 работать не должно - состояние кнопки будет 0 независимо нажата она или нет.
kison вне форума  
Непрочитано 09.10.2009, 16:41  
FedorChek
Прописка
 
Регистрация: 24.07.2008
Сообщений: 151
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
FedorChek на пути к лучшему
По умолчанию Re: Инверсия кнопок

Касательно 32 ноги ничего не менялось 1 и 2 ноги раньше были подключены как и 32 т.е. изначально на них висели «1» нажал появился «0» сейчас на 1 и 2 висит «0» нажал появилась «1» код приведенный в самом начале с переменной temp работал исправно (до изменения в схеме), как, сам не понял но факт остается фактом. Может дело не только в первой процедуре но и в остальных тоже (приведены в начале)
FedorChek вне форума  
Непрочитано 09.10.2009, 17:06  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Инверсия кнопок

Сообщение от FedorChek Посмотреть сообщение
Касательно 32 ноги ничего не менялось 1 и 2 ноги раньше были подключены как и 32 т.е. изначально на них висели «1» нажал появился «0» сейчас на 1 и 2 висит «0» нажал появилась «1» код приведенный в самом начале с переменной temp работал исправно (до изменения в схеме), как, сам не понял но факт остается фактом. Может дело не только в первой процедуре но и в остальных тоже (приведены в начале)
Хорошо - разбор полета.
Изначально ДО переделки:
Код:
unsigned char read_buttons_ones(void)
{
unsigned char temp;
temp=PIND;
temp››=2;
temp|=0xf8;
return ~temp;
}
Не нажата ни одна кнопка - на входах 3 единицы - возвращает 0.
Нажата 1-ая кнопка( 32 нога - PD2 = 0) - возвращает 0x01
Нажата 2-ая кнопка (1 нога - PD3 = 0) - возвращает 0x02
Нажата 3-я кнопка (2 нога - PD4 = 0) - возвращает 0x04

Изменили подключение ДВУХ кнопок на инверсное
((PIND ›› 2) ^ 0x01) & 0x07
Не нажато ничего - на входах PD2 - 1, PD3 - 0, PD4 - 0
Возвращает 0
Нажата 1-ая - PD2 = 0, PD1 = 0, PD2 = 0 возвращает 0x01
2-ая нажата (PD3 = 1,PD2 = 1, PD4 = 0) возвращает 0х02
3-я нажата (PD4 = 1, PD3 = 0, PD2 = 1) возвращает 0х04
Это должно работать. В других функциях нет физического чтения портов, так что видимо все работает через этот драйвер клавиш.
Может там есть еще функции чтения? Искать по использованию PIND.
kison вне форума  
Непрочитано 10.10.2009, 01:16  
FedorChek
Прописка
 
Регистрация: 24.07.2008
Сообщений: 151
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
FedorChek на пути к лучшему
По умолчанию Re: Инверсия кнопок

Спасибо за подробное объяснение и оперативную помощь. Как и предполагал методом "тыка", а точнее методом исключения нашел истину. Там была функция которая отправляла в сон "мегу" она и парила мне двое суток мозг. Я ее пока отключил...
Хоть и не в тему но тут возникла другая проблемка у меня индикатор был подключен на один порт. Была и есть маленькая функция примерно такая
Код:
PORTB=code[номер];
где
Код:
flash unsigned char code[16]={0x01,0x73,0x48,0x60,0x32,0x24,0x04,0x71,0x00,0x2 0,0x10,0x06,0x0d,0x42,0x0c,0x1c};
данные были подобраны соответственно code[1] горит 1 и т.д.
сейчас распайка на один индикатор три порта B, C, D как с меньшими затратами все это реализовать? Была задумка и в одном месте она у меня реализована... типа
Код:
void sym_out(unsigned char sym)
{
switch (sym)
   {
   case 'E': led_c=0xE7; led_b=0xC7; led_d=0xFF; break;
   case 'd': led_c=0xE7; led_b=0xEB; led_d=0xFE; break;
   case 'П': led_c=0xEF; led_b=0xD3; led_d=0xFE; break;
   case 'C': led_c=0xE7; led_b=0xD7; led_d=0xFF; break;
   case '-': led_c=0xE7; led_b=0xC7; led_d=0xFF; break;
   case 'U': led_c=0xE7; led_b=0xDB; led_d=0xFE; break;
   case ' ': led_c=0xE7; led_b=0xC7; led_d=0xFF; break;
   case 'P': led_c=0xEF; led_b=0xC3; led_d=0xFF; break;
   case 'L': led_c=0xE7; led_b=0xDF; led_d=0xFF; break;
   }
PORTC=led_c; PORTB=led_b; PORTD=led_d;
return;   
}
Но тут мне мешает то, что в данном случае нужно писать вызов например
sym_out('E') меня не устраивают ' ' посоветуйте как обойти проблему?

Последний раз редактировалось FedorChek; 10.10.2009 в 01:20.
FedorChek вне форума  
Непрочитано 10.10.2009, 01:48  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Инверсия кнопок

Сообщение от FedorChek Посмотреть сообщение
Но тут мне мешает то, что в данном случае нужно писать вызов например
sym_out('E') меня не устраивают ' ' посоветуйте как обойти проблему?
В лоб -
Код:
void sym_out(unsigned char sym)
{
switch (sym)
   {
   case 0: led_c=0xE7; led_b=0xC7; led_d=0xFF; break;
   case 1: led_c=0xE7; led_b=0xEB; led_d=0xFE; break;
   // и т.д.
Но это кривой подход если индикатором используются не все выводы портов. Например нужны только два вывода, но PORTB=0x03 задействует порт полностью. Так что лучше использовать массив структур ( или просто двумерный массив) в каждой из которых определить значение для вывода в порт и битовую маску маскирующую незадействованые выводы порта.
kison вне форума  
 

Закладки
Опции темы

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

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

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


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


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