Микроконтроллер и компьютерная клавиатура (Урок 2)
Вставка
- Опубліковано 8 бер 2017
- Тема: работа протокола PS/2, прием данных на микроконтроллер аvr. Принимаем данные с клавиатуры на микроконтроллер, программа написана в Atmel Studio 6.2 на си. Урок для начинающих с подробными и наглядными объяснениями.
Программа для микроконтроллера -diysamodelki.ru/images/Klava_O...
Разъём PS/2 6 P Mini DIN - ali.pub/jmx02
Переходник для клавиатуры USB на RS/2 - ali.pub/5429q
Спасибо за Ваш труд, Александр. Очень интересно и грамотно... Ещё раз спасибо, ждем продолжения :)
Спасибо за отличные уроки!
коротко и понятно, класс!
Можете указать ссылки на материалы которыми вы руководствовались при подготовке предыдущего и этого урока по оной теме ?
заранее благодарю !
Очень интересный урок, спасибо! А в каких например своих устройствах можно применить клава + МК?
Когда есть большое меню настроек. Нужно прописывать имена датчикам, послать SMS c gsm модуля и т.д.
Передача данных очень похожа на i2c интерфейс который есть апарратно встроенным в атмега, для сложных проэктов изучайте stm32, за такие же деньги как атмел вы получаете больше частоту и портов.
Александр спасибо за ваш труд, все ваши уроки смотрю/учу. Возможно для некоторых будет не понятно почему
первый CASE 11. потом 0-7, 8, 9. Я разобрался. CASE 10 - не используется (есть протоколы 2 стоповых бита).
Самое главное что поняли ), но можно и по другому все реализовать, это только пример.
Я к тому что новичкам бывает трудно понять логику - просьба рассказывайте по подробнее.
Вы говорите, "когда данные чётные-нулевой бит всегда установлен в 1".
Но например чётное число 4=b00000100.Поясните пожалйста
5:15 все же объяснил. Число 4, бит 0 в 0, четное число это 0.
мне не совсем понятна правильность этих строчек
case 8:
if (PIND & (1
Александр здраствуйте) БЛагодарю вас за ваши уроки,именно они были первыми в освоении микроконтроллеров) Всегда просматривал ваши уроки не регистрируясь. Начал собирать светодиодную бегущую строку,все без проблем,пока не решил что надо сделать ввод символов с компьютерной клавиатуры,появились проблемы,не получается реализовать. Взял ваш код и попробовал реализовать на atmega 8,все подогнал под нее,кроме кварца,его я заменил на 8мгц внутресхемный. Выставил фьюзы ,в коде дописал через дефайн частоту. Не работает. Менял три клавиатуры,к линиям clok и dan припаивал подтягивающие резисторы,чего у вас на схеме нет...вобщем много чего перепробовал,в коде светодиоды выводил в приеме стопового бита,при нажатии на любую клавишу он загорался,а в бесконечном цикле к default выставлял другой светодиод,он загорается сразу даже без клавы(все верно так как программа выполняет действия). Замучался и решил зарегатся и обратится к вам за помощью,возможно то что я хочу ваш код который писали для 16 меги не катит на 8 мегу,вобщем не прокатит,подскажите пожалуста,может я туплю в чем то мелочном(и как может оказатся важном). Буду очень благодарен если выделите время для чайника . Столько прошел,и вот на финише такой гоп стоп(
Я не использую атмегу 8 и за отсутствия отладчика в ней. Но если вы все прерывания подправили, должно все работать. Попробуйте поработать с atmega16, программа рабочая.
Настройка прерываний идентичны,вплоть до пина. 16 меги нет. Что программа рабочая не сомневаюсь,я с++ изучал ,дописал в начале прототип функции и все. Но почему не работает не понятно. Думал клава может выделывается,три пробовал без измен... Народ на тинке 2313 такое проделывает,но там на бейсике пишут,подробно,но блин языка не знаю. А вы в своих сборках подтягивающие резисторы используете по 4 кОм для связи клавы с контроллером?
Резисторы не использую
Спасибо) Буду пробовать другие коды)
Подскажите пожалуйста, я не совсем понял как реализуется передача скан-кода состоящего из нескольких байт? Каждый байт передается по отдельности? Например, правый Ctrl имеет скан-код E0 14. При нажатии передается: стартовый бит, E0, бит четности, стоп, затем опять стартовый бит, 14, бит четности, стоп? Или же два байта передаются за одну посылку: старт, E014, бит четности, стоп.
На свой глупый вопрос отвечаю сам, вдруг кому понадобится. :-)
Каждый байт пересылается по отдельности, стартовый бит, 8 бит данных, бит контроля четности и стоповый бит. И так для каждого байта в посылке.
Ссылка на сайт с проектом, не работает.
добрый день. Можно ли реализовать передачу данных на SPI интерфейсе?
Клавиатуры нет, а так можно.
Проверка бита четности вызывает вопросы. По сути если бит четности не совпадает то необходимо остановить процесс приема данных и направить запрос на повтор передачи последнего бита. А в программе данный момент упущен.
Вопрос к более опытным программистам. Возможно ли написание данной программы не в Atmel Studio на языке Си, а в Arduino (IDE)? Или я затеял не возможное? Если не возможно, то почему?
Конечно можно писать на си а в Arduino . Более того, в Atmel Studio 7 ,Arduino встроенная
@@user-mj8ux1bn2c просто столкнулся с проблемой. При работе с digitalRead не все биты считываются. Бывают пропуски. Заместо 11 бит получаю 9-10.
Думаю есть смысл на прямую к портам обращаться.
а насколько сложнее создать аналагичную систему на usb?
Я не пробывал, но в ближайшее время такой проект предстоит реализовать.
Намного, ардуинка такого даже не осилит.
case 0 ... 7:
temporary_data_keyboard=temporary_data_keyboard>>1; // битовый сдвиг в право
if (PIND &(1
Где программа для микроконтроллера???
Ссылка для скачивания программы не доступна. :(. Возможно её включить в комментарий?
Нужно посмотреть осталось программа, если да то ссылку обновлю
@@user-mj8ux1bn2c комментарии дольше хранятся
кто может скинуть код
А что будет, если клавиатура подключена до того как контроллер запущен?
Не будет ответа 0xAA
Александр, а можно ли тогда узнать подключена ли клавиатура?
Да, есть команда, в следующем уроке рассмотрим.
чуть мозг не треснул ))
Народ кто пробовал код интегрировать в атмегу8?
Решил проверить 0хАА приходящий от клавы проверяя каждый бит, накопировал
case 0,case 1,case 2 и т.д
case 0 ... 7: // принимаем 8 бит данных
if (PIND & (1
Написал скетч для Arduino Uno. Может кому пригодится?
/*
* Программа по обработке компьютерной клавиатуры.
* 5-DIN PS\2
* +5 В. - питание плюс - коричневый провод - красный провод.
* GND. - питание минус - серый провод - коричневый провод.
* Rx. - выход тактового генератора - желтый провод - желтый провод.
* Tx. - данные - красный провод - серый провод .
*/
volatile unsigned char action_int = 10; // Счетчик текущего бита.
volatile unsigned char bit_action=1; // Текущее состояние линии данных
volatile unsigned char simvol; // Выводимый символ
volatile unsigned char simvol1; // Записываемый символ
volatile boolean bit_chet=1; // Бит четности
volatile boolean chet=0; // Результат получения байта
volatile int Rx = 2; // CLK - Линия тактовых импульсов
volatile int Tx = 3; // Data - Линия данных
void setup() {
// начальные разовые настройки:
Serial.begin(9600);
pinMode(Rx, INPUT);
pinMode(Tx, INPUT);
digitalWrite(Rx, HIGH);
digitalWrite(Tx, HIGH);
delay(1000);
Serial.println("START");
attachInterrupt(0, keyboard_input, FALLING);
}
void loop()
{
if (simvol > 0)
{
Serial.print(chet);
Serial.print(" - ");
Serial.println(simvol, HEX);
simvol = 0;
}
}
void keyboard_input()
{
bit_action = digitalRead(Tx);
switch (action_int)
{
case 10: // обработка стартового бита
if (bit_action == 0)
{
action_int = 0;
bit_chet = HIGH;
}
break;
case 0 ... 7: //Прием восьми бит
if (bit_action == 1)
{
bit_chet = !bit_chet; //Счет бита четности
simvol1 |= (1
Сопли жуёт все видео