реклама на сайте
подробности

 
 
> Дребезг на клаве, Need your help !
dio
сообщение Jul 19 2006, 19:02
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 40
Регистрация: 4-06-06
Пользователь №: 17 766



Понимаю что вопрос тупой, но всё таки ...
Упростил пример до невозможного, а он опять не работает blink.gif



Цитата
int main( void )
{
byte t1,t2;
DDRB=0x0F; // b0-b3 : outputs b4-b7 : inputs
DDRD=0xFF; // d0-d7 output

PORTB=0x01;;
for(;;)
{
__delay_cycles(160000); // Пихните куда надо
t1=PORTB;
t2=0x10;
t1=t1 & t2;

if (t1==t2) PORTD=0xFF;
else PORTD=0x00;
}
}



Хочу чтоб загорелся диод на PORTD после нажатия клав. "1" на 4x4 клавиатуре.
Помогите плииииис !!!
sad.gif

Сообщение отредактировал dio - Jul 19 2006, 19:03
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
impuls-v
сообщение Jul 19 2006, 21:01
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 130
Регистрация: 15-01-06
Пользователь №: 13 190



схемку нарисуй.
Go to the top of the page
 
+Quote Post
dio
сообщение Jul 19 2006, 21:34
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 40
Регистрация: 4-06-06
Пользователь №: 17 766



Цитата(impuls-v @ Jul 20 2006, 00:01) *
схемку нарисуй.


Нет никакой схемки. Использую мегу8, т.к. в клавиатуре задействована только одна клавиша, считайте что это простой вутон, который одним концом идет к B0 (через R=4k7), а другим к B4. Так же ставлю светодиод на одну из ног PORTD. Вооот !!!
Go to the top of the page
 
+Quote Post
Tiro
сообщение Jul 19 2006, 21:58
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768



Цитата(dio @ Jul 20 2006, 00:34) *
Цитата(impuls-v @ Jul 20 2006, 00:01) *

схемку нарисуй.


Нет никакой схемки. Использую мегу8, т.к. в клавиатуре задействована только одна клавиша, считайте что это простой вутон, который одним концом идет к B0 (через R=4k7), а другим к B4. Так же ставлю светодиод на одну из ног PORTD. Вооот !!!


Читайте внимательно доку ! excl.gif

Раздел дейташита I/O Ports -> Introduction сразу под фигурой 21.

У АВР порт имеет _ТРИ_ регистра : DDRx - регистр направлениея данных, PORTx - регистр данных,
PINx - порт входных пинов. Первые два доступны на чтение / запись, последний только чтение.
При попытке чтения PORTх возвращается _ЗАПИСАННОЕ_РАНЕЕ_ в него значение. Вам надо читать регистр PINB.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 19 2006, 22:03
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(dio @ Jul 20 2006, 03:34) *
Нет никакой схемки. Использую мегу8, т.к. в клавиатуре задействована только одна клавиша, считайте что это простой вутон, который одним концом идет к B0 (через R=4k7), а другим к B4. Так же ставлю светодиод на одну из ног PORTD. Вооот !!!

Если используете Bit0 для ввода, то почему маску для Bit4 накладываете?
Строка
Код
t2=0x10;

должна выглядеть как
Код
t2=0x01;

А вообще если у вас матрица кнопок, то где у вас процедура ее сканирования?
Go to the top of the page
 
+Quote Post
dio
сообщение Jul 19 2006, 22:24
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 40
Регистрация: 4-06-06
Пользователь №: 17 766



Цитата
Если используете Bit0 для ввода, то почему маску для Bit4 накладываете?


Вообще то B0 это выход, а B4 для ввода, как я понимаю, исправте меня если это не так.

Цитата
А вообще если у вас матрица кнопок, то где у вас процедура ее сканирования?


Полная версия кода лежит отдельно, сначала хочу проверить на одной клавише.

Цитата
PINx - порт входных пинов. ... последний только чтение.
... Вам надо читать регистр PINB.

Если честно, с PINx не знаком пока, надо разобраться.

Спасибо !!!
Go to the top of the page
 
+Quote Post
Tiro
сообщение Jul 19 2006, 22:29
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768



Уважаемый rezident, будьте внимательны!

В первом сообщении автор пишет:
>DDRB=0x0F; // b0-b3 : outputs b4-b7 : inputs

Это определяет биты 3-0 на вывод, 7-4 на ввод!

Автор использует вывод в бит 0 в этой строке :
> PORTB=0x01;

В третьем сообщении :
> в клавиатуре задействована только одна клавиша, считайте что это простой вутон,
> который одним концом идет к B0 (через R=4k7), а другим к B4

А выпишете :
> Если используете Bit0 для ввода, то почему маску для Bit4 накладываете?
> А вообще если у вас матрица кнопок, то где у вас процедура ее сканирования?

Он использует одну кнопку! Читает бит 4! Маски накладывает правильно!
Чтобы его программа пошла, ему достаточно строку :
> t1=PORTB;
заменить на t1 = PINB;

С уважением.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 19 2006, 22:37
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(dio @ Jul 20 2006, 04:24) *
Цитата
Если используете Bit0 для ввода, то почему маску для Bit4 накладываете?


Вообще то B0 это выход, а B4 для ввода, как я понимаю, исправте меня если это не так.


ОК. Согласен. Был невнимателен.

Цитата(dio @ Jul 20 2006, 04:24) *
Цитата
А вообще если у вас матрица кнопок, то где у вас процедура ее сканирования?


Полная версия кода лежит отдельно, сначала хочу проверить на одной клавише.


Дык потому вас и просили схему нарисовать, чтобы понять что к чему. А то непонятно куда притянут входной пин и почему сканирование лог. 1 делается?
Цитата
PORTB=0x01;
Go to the top of the page
 
+Quote Post
dio
сообщение Jul 19 2006, 22:43
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 40
Регистрация: 4-06-06
Пользователь №: 17 766



Цитата
Чтобы его программа пошла, ему достаточно строку :
> t1=PORTB;
заменить на t1 = PINB;


Я всё понял, пробую сейчас же !!!

Огромное спасибо Tiro rolleyes.gif

p.s. надеюсь __dellay_cycles(160000); всунул правильно blink.gif
Go to the top of the page
 
+Quote Post
dio
сообщение Jul 19 2006, 23:01
Сообщение #10


Участник
*

Группа: Новичок
Сообщений: 40
Регистрация: 4-06-06
Пользователь №: 17 766



Работает !!! smile.gif не совсем как хотелось бы, но всётаки ... Единственное что беспокоит меня, это то что сигнал на светодиод поступает очень слабый, почему бы так ???
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 19 2006, 23:18
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



При условии, что на считывающем входе PB4 имеется внешний pull-up резистор, а светодиод зажигается подачей лог. 0, я бы так написал эту прогу
Код
#define KB_SCAN1 0x01  //маска для сканирующей линии
#define KB_LINE1 0x10  //маска для считывающей линии
#define LED_OUT  0xFF  // маска для светодиода

int main( void )
{ unsigned char t1,t2;
  DDRB=0x0F;
  DDRD=0xFF;
  t2=0;
  t1=t2;
  while(1)
  { PORTB&=~KB_SCAN1;             //установим сканирующую линию
    t1=~PINB&KB_LINE1;            //опросим считывающую линию
    PORTB|=KB_SCAN1;              //сбросим сканирующую линию
    if (t2==t1)                   //состояния одинаковы?
    {                             //да, значит состояние кнопки устройчивое
      if (t1==0x00) PORTD|=LED_OUT;//погасим LED, если кнопка отжата
      else PORTD&=~LED_OUT;       //зажжем LED, если кнопка нажата
    }
    else t2=t1;
    __delay_cycles(160000);       //задержка для устранения дребезга
  }
}
Go to the top of the page
 
+Quote Post
dio
сообщение Jul 19 2006, 23:55
Сообщение #12


Участник
*

Группа: Новичок
Сообщений: 40
Регистрация: 4-06-06
Пользователь №: 17 766



Цитата(rezident @ Jul 20 2006, 02:18) *
а светодиод зажигается подачей лог. 0


Прежде чем все начать я видел что и другие так делали (через лог. 0) и подумал : " А почему 0 а не 1", и решил сделать свою версию. Я не использую pull-up, скорей всего в этом и проблема. Наверное всетаки перейду на общепринятую версию. smile.gif

Премного благодарен за уделённое Вами мне время !!! rolleyes.gif

Kalinixta !!!
Go to the top of the page
 
+Quote Post
dio
сообщение Jul 19 2006, 23:58
Сообщение #13


Участник
*

Группа: Новичок
Сообщений: 40
Регистрация: 4-06-06
Пользователь №: 17 766



Kalinixta !!! -> Спокойной ночи !!!

smile.gif

Сообщение отредактировал dio - Jul 20 2006, 00:01
Go to the top of the page
 
+Quote Post
WHALE
сообщение Jul 20 2006, 15:35
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



вообще-то светодиоды "0" зажигают по привычке от старых серий контроллеров,имевших разную нагрузочную способность портов для 0 и для 1.для avr без разницы.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Woodoo
сообщение Jul 20 2006, 17:33
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 26-05-05
Из: Севастополь
Пользователь №: 5 391



на счет светодиода, dio, вы же его через токоограничивающее сопротивление вешаете?? или прям на лапку порта?! в первом случае можно снизить номинал сопротивления. во втором сопротивление нужно поставить! Посмотрите характеристики вашего диода, наверняка максимальное напряжение на нем менее 2 вольт. При дальнейшем его увелечении светодиод имеет свойства немного снижать яркость свечения. при этом он жутко(или не очень) греется и перегорает.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 07:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01475 секунд с 7
ELECTRONIX ©2004-2016