Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Дребезг на клаве
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
dio
Понимаю что вопрос тупой, но всё таки ...
Упростил пример до невозможного, а он опять не работает 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
impuls-v
схемку нарисуй.
dio
Цитата(impuls-v @ Jul 20 2006, 00:01) *
схемку нарисуй.


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

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

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

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


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

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


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

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

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

Спасибо !!!
Tiro
Уважаемый 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;

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


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


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

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


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


Дык потому вас и просили схему нарисовать, чтобы понять что к чему. А то непонятно куда притянут входной пин и почему сканирование лог. 1 делается?
Цитата
PORTB=0x01;
dio
Цитата
Чтобы его программа пошла, ему достаточно строку :
> t1=PORTB;
заменить на t1 = PINB;


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

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

p.s. надеюсь __dellay_cycles(160000); всунул правильно blink.gif
dio
Работает !!! smile.gif не совсем как хотелось бы, но всётаки ... Единственное что беспокоит меня, это то что сигнал на светодиод поступает очень слабый, почему бы так ???
rezident
При условии, что на считывающем входе 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);       //задержка для устранения дребезга
  }
}
dio
Цитата(rezident @ Jul 20 2006, 02:18) *
а светодиод зажигается подачей лог. 0


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

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

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

smile.gif
WHALE
вообще-то светодиоды "0" зажигают по привычке от старых серий контроллеров,имевших разную нагрузочную способность портов для 0 и для 1.для avr без разницы.
Woodoo
на счет светодиода, dio, вы же его через токоограничивающее сопротивление вешаете?? или прям на лапку порта?! в первом случае можно снизить номинал сопротивления. во втором сопротивление нужно поставить! Посмотрите характеристики вашего диода, наверняка максимальное напряжение на нем менее 2 вольт. При дальнейшем его увелечении светодиод имеет свойства немного снижать яркость свечения. при этом он жутко(или не очень) греется и перегорает.
dio
Цитата(Woodoo @ Jul 20 2006, 20:33) *
вы же его через токоограничивающее сопротивление вешаете?? или прям на лапку порта?!


Конечно же через соответствующее сопротивление ~ 360 ohm . Я прекрасно понимаю о чем вы говорите, проблема в чем то другом. Замерил напряжение на пинах PORTD и оно нормальное ~5V, как только устанавливаю светодиод, то тут же напряжение соответствующего пина (остальные в порядке) падает на примерно 1.8V, следовательно и диод горит тускло. sad.gif
Думаю что это дело загрузки, как уже упоминалось WHALEом

Цитата(WHALE @ Jul 20 2006, 18:35) *
вообще-то светодиоды "0" зажигают по привычке от старых серий контроллеров,имевших разную нагрузочную способность портов для 0 и для 1.для avr без разницы.


Значит эта проблемма в АВРах всётаки не решена ???
huh.gif
WHALE
в avr одинаковая нагрузочная способность и по 0 и по 1-30 ма,для светодиодов более чем достаточно.
GL_basik
Возможно проблема в следующем.
(5-1.8)=3.2В
3.2/360 = 9мА
Может ток недостаточный.
А если напряжение падает на НОЖКЕ до такого значения, значит резистор отсутствует и свтодиод просаживает ножку. Мистики то небывает, как показала практика. smile.gif
Alex_Pol
Цитата(dio @ Jul 20 2006, 22:33) *
Цитата(Woodoo @ Jul 20 2006, 20:33) *

вы же его через токоограничивающее сопротивление вешаете?? или прям на лапку порта?!


Конечно же через соответствующее сопротивление ~ 360 ohm . Я прекрасно понимаю о чем вы говорите, проблема в чем то другом. Замерил напряжение на пинах PORTD и оно нормальное ~5V, как только устанавливаю светодиод, то тут же напряжение соответствующего пина (остальные в порядке) падает на примерно 1.8V, следовательно и диод горит тускло. sad.gif
Думаю что это дело загрузки, как уже упоминалось WHALEом

Значит эта проблемма в АВРах всётаки не решена ???
huh.gif

Попробуйте включить лед плюсом на питание через резистор, минусом на ножку и включайте нулём.
Потом расскажите.
Rst7
Цитата(WHALE @ Jul 20 2006, 18:35) *
вообще-то светодиоды "0" зажигают по привычке от старых серий контроллеров,имевших разную нагрузочную способность портов для 0 и для 1.для avr без разницы.


Не без разницы. Чтобы не было вопросов, возьмите миллиамперметр и померяйте ток КЗ от лапки в состоянии 1 на землю и от лапки в состоянии 0 на + питания. Потом сравните.

ЗЫ Будете мерять - позаботьтесь о том, чтобы источник смог выдать дополнительные 50-80 мА.
dio
Извините за долговременное отсутствие, не было возможности.

Цитата(Alex_Pol @ Jul 21 2006, 12:57) *
Цитата(dio @ Jul 20 2006, 22:33) *

Цитата(Woodoo @ Jul 20 2006, 20:33) *

вы же его через токоограничивающее сопротивление вешаете?? или прям на лапку порта?!


Конечно же через соответствующее сопротивление ~ 360 ohm . Я прекрасно понимаю о чем вы говорите, проблема в чем то другом. Замерил напряжение на пинах PORTD и оно нормальное ~5V, как только устанавливаю светодиод, то тут же напряжение соответствующего пина (остальные в порядке) падает на примерно 1.8V, следовательно и диод горит тускло. sad.gif
Думаю что это дело загрузки, как уже упоминалось WHALEом

Значит эта проблемма в АВРах всётаки не решена ???
huh.gif

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


И так пробовал и иначе и вообще по всякому! Буду поддерживать традицию, через опрос на лог. 0. smile.gif
Хотя вполне возможно что сам намухлевал чего с кодом, не знаю, надоело копаться! wacko.gif


Цитата(Rst7 @ Jul 21 2006, 13:20) *
Цитата(WHALE @ Jul 20 2006, 18:35) *

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


Не без разницы. Чтобы не было вопросов, возьмите миллиамперметр и померяйте ток ...


Мерить не мерил, но всё таки думаю что разница есть, ведь с опросом на лог. 0 заработало сразу без проблем!
wink.gif

На этом хочу поблагодарить всех участвовавших за ваши советы, еще свидимся ! cool.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.