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

 
 
> ATMEGA16 +PC Клавиатура
mak007
сообщение Aug 27 2008, 17:50
Сообщение #1





Группа: Участник
Сообщений: 6
Регистрация: 7-06-08
Пользователь №: 38 136



При подключении клавиатуры к avr клавиатура передает 6 бит вместо 11 и всегда одно и тоже. Помогите кто может!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mak007
сообщение Aug 27 2008, 17:59
Сообщение #2





Группа: Участник
Сообщений: 6
Регистрация: 7-06-08
Пользователь №: 38 136



Частота МК 4мгц
Все записывается в EEPROM.

Сообщение отредактировал mak007 - Aug 27 2008, 18:10
Прикрепленные файлы
Прикрепленный файл  KEYBOARD.txt ( 1021 байт ) Кол-во скачиваний: 115
 
Go to the top of the page
 
+Quote Post
OlegH
сообщение Aug 27 2008, 18:29
Сообщение #3


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

Группа: Свой
Сообщений: 186
Регистрация: 14-01-06
Из: Украина, г.Харьков
Пользователь №: 13 168



Цитата(mak007 @ Aug 27 2008, 20:59) *
Частота МК 4мгц
Все записывается в EEPROM.


оригинальненько-с.... А зачем делать записть в eeprom внутри обработчика прерывания ?!? именно ожидание готовности eeprom и не позволяет принять и обработать все прерывания - большая часть из них теряется.

Вот код для меги16, который правильно работает, принимая данные с AT-клавиатуры (у меня для IAR - для вас надо адаптировать). Кстати какая клавиатура имеется в виду ? современная AT-клавиатура передает до 5 или 6 байт за одно нажатие/отпускание кнопки. А вовсе не 11 бит.


struct AT_KEYB_Data {
BYTE BitCount; // счетчик принятых бит (0 - стартовый, 1...8 - биты данных, 9 - бит паритета, 10 - стоп-бит
BYTE LastStartTICK; // младший байт системного тика в момент последнего стартового бита для контроля таймаута
BYTE TmpData;
BYTE DataCount;
BYTE Data[6];
} KEYB;

#pragma vector=INT0_vect
__interrupt void EXTERNAL_INT0(void) // по отрицательному фронту KEYB_CLOCK
{
// проверка таймаута
BYTE tick = (BYTE)_TICK;
if ((tick-KEYB.LastStartTICK) > 2) { // таймаут - это старт-бит
KEYB.BitCount = 0;
}
BYTE bc = KEYB.BitCount;
if (bc==0) { // старт-бит
if (GET_PIN(KEYB_DATA)) return; // неверный старт-бит
KEYB.LastStartTICK = tick;
bc++; KEYB.BitCount=bc;
} else if (bc<9) { // бит данных
BYTE d = KEYB.TmpData >> 1;
if (GET_PIN(KEYB_DATA)) d |= 0x80;
KEYB.TmpData = d;
bc++; KEYB.BitCount=bc;
} else if (bc==9) { // бит контроля на нечетность
bc++; KEYB.BitCount=bc;
} else { // стоп-бит
KEYB.BitCount=0;
if (GET_PIN(KEYB_DATA)==0) return; // неверный стоп-бит
// запоминаем принятые данные
BYTE dc = KEYB.DataCount;
if (dc < sizeof(KEYB.Data)) {
KEYB.Data[dc] = KEYB.TmpData;
dc++; KEYB.DataCount = dc;
}
}
}


Инициализация в MAIN:
// включаем прерывание по отрицательному фронту INT0 (KEYB_iCLOCK)
MCUCR |= (1<<ISC01); GICR |= (1<<INT0);


Да, _TICK - это глобальная системная переменная. в которой считаются миллисекунды по таймеру.

Сообщение отредактировал Олег Хохлов - Aug 27 2008, 18:39
Go to the top of the page
 
+Quote Post
espectro
сообщение Nov 11 2008, 11:01
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 17-02-08
Пользователь №: 35 137



Цитата(Олег Хохлов @ Aug 27 2008, 21:29) *
Кстати какая клавиатура имеется в виду ? современная AT-клавиатура передает до 5 или 6 байт за одно нажатие/отпускание кнопки. А вовсе не 11 бит.

5-6 байтов за одно нажатие - это, как я понимаю, для клавиш Shift, home etc, а обычные клавиши ввода символов пережают эти самые 11 бит. Или я не прав?
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 17th August 2025 - 01:45
Рейтинг@Mail.ru


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