Електроника за всеки

Електроника блог

Често се налага да използвате голям брой бутони във вашия проект за различни цели. Има различни опции за изпълнение на тази задача. Днес ще ви разкажа за решение, което ми хрумна една вечер. След това трябваше да закача клавиатурата на контролер с ограничен брой свободни крака. Най-вероятно това решение вече е описано и използвано другаде, но не намерих никакви споменавания в Интернет.

Същността
Клавиатурата е свързана чрез три сигнални проводника. Допълнителни позиции: сменени регистри sn74198n и няколко резистора. Максималният брой бутони е ограничен само от максималното време за сканиране на клавиатурата. Използвах 16 бутона в моя проект, но като добавите нови регистри за смяна, можете да увеличите това число до стойността, от която се нуждаете. Ще бъдете ограничени само чрез пропорционално увеличаване на времето за сканиране на клавиатурата.

Хардуерна част
Регистрите за смяна са доста удобни поради ниската си цена и гъвкавост. Често се използват за свързване на светодиоди, седемсегментни дисплеи и т.н. от малък брой щифтове на микроконтролера. В нашия случай ще направим почти всичко по същия начин, но в обратната посока: ще прехвърляме данни не „от микроконтролера“, а „към него“. За по-голяма яснота давам блок-схема на работата на това устройство:

клавиатурата

  • 1. Клавиатура
  • 2. Регистриране на смяна
  • 3. MK

Клавиатурният блок е набор от бутони, които са свързани към земята с един щифт и свързани към съответния вход на регистъра за смяна с другия.

Паралелно и серийно предаване
Ако не знаете разликите в паралелните и последователните методи за прехвърляне на информация, препоръчвам ви да разберете сега. Освен това често ще използвам тези термини и без да ги разбирам, ще ви бъде малко по-трудно.
Паралелното предаване на данни е метод за предаване на няколко сигнала с данни едновременно през няколко паралелни канала, например цял порт, всичките осем бита наведнъж. При серийно предаване на данни битовете се изпращат последователно по една комуникационна линия, една след друга. Например чрез UART или SPI

В нашата схема регистърът за смяна преобразува паралелния вход в сериен изход. В процеса на сканиране на клавиатурата ще вземе 8 стойности от блока на клавиатурата и ще го изпрати последователно на микроконтролера.
Въз основа на горното, към регистъра на смяната се налагат следните изисквания:

  • паралелен вход
  • сериен изход

За това регистър SN74198N е подходящ за нас. В моето местообитание такива микросхеми са рядкост, затова използвах съветското чудовище K155IR13. Те са пълен аналог и няма разлика в тяхната употреба от внесените аналози.

MK контролира регистъра за смяна: той казва кога да вземе сигнала от клавиатурното устройство и да го предаде на собственика си.

Сега нека анализираме схемата на нашето устройство.

смяна

Диаграмата е опростена, показва се само връзката на клавиатурата. Захранване и други тръбопроводи на контролера, както обикновено.

Описание на бутоните
Един терминал на бутона е свързан към входа на регистъра за смяна. Други - към общата жица. Друга важна подробност са издърпващите резистори R1 - R8. Те създават високо логическо ниво на входа на регистъра на смяната, докато съответният бутон е отворен.
Веднага след като бутонът се затвори, на входа на регистъра за смяна се формира логическа нула, тъй като той е директно свързан към общия проводник. Стойността на 10k резистор предотвратява протичането на твърде много ток, докато бутонът е затворен, и създава достатъчно висока логика, докато бутонът е отворен.

Регистър за смяна

  • Нашият регистър за смяна има входен порт (D0-D7)
  • изходен порт (Q0-Q7)
  • и управляващи сигнали (SR, SL, CLK, S0, S1, MR).

Входният и изходният порт могат да се използват в паралелен или сериен режим. Поради това този регистър за смяна е доста универсален. Но ние ще се спрем само на функциите, от които се нуждаем, останалото можете сами да прочетете в листа с данни.

  • D0-D7 - действителният вход. Тук ще изпратим 8 сигнала от нашите бутони.
  • Q0-Q7 - паралелен изход. Ще използваме само един крак - Q7. Останалото в нашия случай нямаме нужда.
  • CLK - часовник. Всичко в регистъра на смяната се извършва само по протежение на този крак. Или по-скоро на изгряващ фронт. Ако трябва да направим нещо, тогава просто доставяме високо ниво на крака CLK и след това го спускаме (доставяме логическа нула). За простота на представянето ще кажа в едно село, че трябва да щракнем върху крака CLK.
  • S0 и S1. Тези крака са отговорни за поведението на изхода на регистъра (Q0-Q7). Всъщност този регистър може да има както сериен (в нашия случай), така и паралелен изход. Когато двата крака са повдигнати (високо логическо ниво), можем да заредим изхода на данните, които в момента са на входа (D0-D7).

За да направите това, трябва да щракнем върху CLK крака с повдигнати S0 и S1. Веднага след това изходните крака ще приемат същите стойности като входните.

Ако спуснем единия крак до нула, например S1, след като издърпаме крака CLK, данните на изходния порт ще се преместят към бита от висок ред (битът от изхода Q0 ще скочи до изхода Q1, и битът, който преди е бил на Q1 място - ще се изкачи до Q2 и т.н.). Щракнете отново, ритмите ще се движат отново.

След като направим това 8 пъти, данните ни ще избягат на никъде и ще дойдат нови, които да ги заменят, идващи от нищото (откъде идват, ще говорим по-късно). За да не загубите тези данни, а да ги прехвърлите на микроконтролера, трябва да ги прочетете навреме.

Тъй като нашите удари се движат към по-стария (Q7), трябва да ги хванем там.

Алгоритъм на действията

  • 1. Поставете S0 и S1 високо и щракнете. На изхода на Q0-Q7 байтът, от който се нуждаем, е фиксиран (8 бита).
  • 2. Пропускаме S1 (S0 винаги остава на високо ниво, така че можете спокойно да го поставите в плюс и да забравите за него)
  • 3. Прочетете бита от крака Q7
  • 4. Щракнете. Тактът, който преди беше на крака Q7, избягва във всичко и е заменен от ритъма, който беше на крака Q6.
  • 5. Връщаме се към точка 3 и правим тези операции още 7 пъти. Защото имаме 8 бита и всеки от тях е важен за нас.

Общо използвам 3 крака на микроконтролера, свързани към регистъра за смяна (CLK, S1, Q7), лесно и естествено анкетираме нашите 8 бутона.

Всичко работи на хартия, но нека го проверим в истински хардуер. За целта сглобих демонстрационна платка и я свързах с Pinboard. Използвах, както казах, съветски аналози на регистрите за смяна, а именно K155IR13, така че платката е окабелена за тях.

Не се притеснявайте, че платката има 16 бутона и вече 2 регистъра за смяна, по-късно ще опиша и тази версия на схемата. Основното нещо е да знаете, че тази схема може да работи безболезнено в режим с осем бутона.

чрез

Нямам 16-ти бутон поради липсата му в резервите ми и измръзването на улицата. Разточих дъската с LUT върху текстолит, гравирах и запоявах. Цялата тази технология е добре описана на този сайт, така че няма да се спирам на подробностите.

И така, дъската е готова, нека пристъпим към най-интересното - писане на фърмуера.

Софтуерна част
Въпреки че представената версия за работа с регистър за смяна е съвместима с хардуерния SPI на микроконтролера, ние ще анкетираме бутоните в софтуера. Нека напишем функция, която ще анкетира нашите бутони и ще постави резултата в регистър R17.

.equ BTN_PORT = PORTB .equ BTN_DDR = DDRB .equ BTN_PIN = PINB .equ BTN_DATA_IN = 0 .equ BTN_HOLD = 1 .equ BTN_CLK = 2 btn_start: SBI BTN_PORT, BTN_HOLD; Повишаване на S1 SBI BTN_PORT, BTN_CLK; щракнете върху CBI BTN_PORT, BTN_CLK CBI BTN_PORT, BTN_HOLD; пропуснете S1 btn_again: LDI R17,0; Нашият резултат ще бъде натрупан в този регистър.; никой не знае къде е посетил, но ние сме гарантирани; нула е нужна. LDI R16.8; брояч. Цикълът ще се повтори 8 пъти btn_loop: LSL R17; ако преминем тук, за първи път, тогава тази команда; няма да направи нищо с нула, ако не, тогава преместете всички битове вляво SBIC BTN_PIN, BTN_DATA_IN; ако 1, INC R17 дойде до нашия вход; запис 1 в най-малко значимия бит от регистър R17 SBI BTN_PORT, BTN_CLK; щракнете върху CBI BTN_PORT, BTN_CLK DEC R16; намаляване на брояча BREQ btn_exit; ако броячът е отчетен до нула, отидете на изход btn_exit Rjmp btn_loop; в противен случай повтаряме цикъла, където преместваме всички битове с първата команда; наляво. По този начин, по-старите високи байтове постепенно; преместете се на място. btn_exit: RET

На този етап веднага го избирам като функция, за да бъде по-лесно да я използвам по-късно.
Написахме функцията, сега ще създадем най-простата програма (това е само за началото, забавлението предстои). Той ще извика функцията за сканиране на клавиатурата в безкраен цикъл и резултатът ще бъде записан на изходния порт PORTA, към който ще свържем ред светодиоди. Нищо сложно.

; Първо инициализираме краката на контролера: SBI BTN_DDR, BTN_HOLD; HOLD SBI изход BTN_DDR, BTN_CLK; CLK SBI изход BTN_PORT, BTN_DATA_IN; вход DATA_IN OUTI DDRA, 0xFF; Поставяме порт D на изхода. За него ще бъде; свържете светодиоди; След това създаваме безкраен цикъл, в който поставяме следното: main: RCALL btn_start; наричаме функцията за анкетиране на клавиатурата COM R17; обърнете входящия байт OUT PORTA, R17; и го запишете в порт A на RJMP Main; обратно към началото

Обърнете регистъра R17 за по-голяма яснота. Тъй като първоначално битът на натиснатия бутон е нула и светодиодът светва в един.

Компилираме и качваме на прекрасната дъска за отстраняване на грешки PinBoard. Свързваме нашия блок от бутони, както е показано на снимката.

клавиатурата

  • 1 щифт на блока с бутони - PORTB.0
  • 2 щифта на блока с бутони - PORTB.1
  • 3 щифта на блока с бутони - PORTB.2
  • 4-пинов блок от бутони - +5 V
  • 5-пинов блок от бутони - Общ проводник (заземяване)
  • PORTA (0.7) - LED лента.

Рестартираме MK и наблюдаваме следната картина

При натискане на бутон светва съответният светодиод. Освен това е възможна възможност за едновременно натискане на няколко бутона. И това е потенциален плюс, който при желание може да бъде добре използван.

Това е краят на първата част.

В следващата статия ще ви разкажа как да увеличите броя на бутоните до 16 (24, 32 и т.н.), колко лесно е да определите кой бутон е натиснат в момента и как да затегнете функцията си при натискане на всеки бутон.

В самия край получаваме нещо подобно