Страница 1 из 1

Atmega16 и ps/2

Добавлено: Пт июн 21, 2013 12:45:28
lufton
Заранее прошу прощения за возможно глупый вопрос, но может мне кто-то объяснить как подключить ps/2 клавиатуру к МК? Смотрел несколько примеров, в одних описан только обработчик прерывания clock клавиатуры, в других всё усложнено дополнительными установками переферии. Интересует самый простой код для определения скан-кодов нажатий.
Data хочу подключить к PORTB1, а clock к PORTB2 (INT2).
Далее что делать? Нужно устанавливать пины как входы DDRB &= ~(1 << 1 | 1 << 2)? Сделал sei(); Описал ISR(INT2_vect) {...}, но такое впечатление что прерывание ещё нужно включить. Не подскажете как? Есть клавиатура готовая к экспериментам.
Пока что подключил 1602 LCD дисплей. Хочу сделать "печатную машинку".
Вот так выглядит собранная плата:
Изображение

Re: Atmega16 и ps/2

Добавлено: Пт июн 21, 2013 13:00:19
mulder790
https://www.google.by/url?sa=t&source=w ... 3060,d.Yms там 2 сообщение реализация того что хотели вы но на микропаскале.
http://cxem.net/mc/mc173.php а это на бейсике.

Re: Atmega16 и ps/2

Добавлено: Пт июн 21, 2013 13:45:15
lufton
mulder790 писал(а): https://www.google.by/url?sa=t&source=w ... 3060,d.Yms там 2 сообщение реализация того что хотели вы но на микропаскале.
http://cxem.net/mc/mc173.php а это на бейсике.
Спасибо, а что если я уже начал писать на C?

Re: Atmega16 и ps/2

Добавлено: Пт июн 21, 2013 16:15:56
lufton
Распиновка такая:
Data -> PINB0
Clock -> PIND3

Main.c выглядит так:

Код: Выделить всё

#define F_CPU 1000000L
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "lcd_lib.h"

int main(void)
{
	LCDinit();
	LCDclr();
	LCDGotoXY(0, 0);
	LCDstring("Test");
	LCDcursorOnBlink();

	// Enable global interrupts
	sei();
	SREG |= 1 << 7; // - одно и то же, что и sei()?
	// Set PIND3 and PINB0 as inputs
	DDRD &= ~(1 << PIND3);
	DDRB &= ~(1 << PINB0);
	// Pullup PIND3 and PINB0
	PORTD |= 1 << PIND3;
	PORTB |= 1 << PINB0;
	// Set INT1 for falling edge
	MCUCR |= 1 << ISC11;
	MCUCR &= ~(1 << ISC10);
	// Enable INT1 interrupt
	GICR |= 1 << INT1;
    while(1)
    {
    }
}

ISR(INT1_vect)
{
	LCDsendChar('Q');
}
На экране Test_, при нажатии на любую клавишу на клавиатуре ничего не происходит. Подскажите что за SREG (в даташите написано что 7-й бит должен быть установлен чтобы включить глобальные прерывания)? Atmel Studio про этот регистр ничего не слышал (в файле iom16a.h нет соответствующего define, тем не менее, исходник компилит). Так же в примере, было сказано что нужно:

Код: Выделить всё

PCMSK |= (1<<PIND3);	// Enable pin change on INT1 (why is this required?)
Но такого регистра тоже нет (даже не компилит).
О чём ещё я не знаю?

Re: Atmega16 и ps/2

Добавлено: Пт июн 21, 2013 23:14:35
lufton
Удалось заставить МК обрабатывать прерывания по ps/2, теперь другая беда - каждое нажатие на кнопку вызывает 4 обработчика прерывания, вместо, я так понимаю положенных 11. Чё за бред? Нужно настраивать частоту МК чтоб подключиться по ps/2? Может это быть связано с тем, что в обработчике на дисплей выводится информация (соответственно поток приостанавливается)? Удалив вывод на дисплей вроде как биты все передаются за раз, но сканкоды получаются кривые, одна клавиша даёт несколько значений, при этом таких сканкодов нет в таблице ASCII.