Atmega16 и ps/2

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 14
Зарегистрирован: Ср май 22, 2013 14:28:35

Сообщение lufton »

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

Сообщение mulder790 »

https://www.google.by/url?sa=t&source=w ... 3060,d.Yms там 2 сообщение реализация того что хотели вы но на микропаскале.
http://cxem.net/mc/mc173.php а это на бейсике.
Реклама
Родился
Сообщения: 14
Зарегистрирован: Ср май 22, 2013 14:28:35

Сообщение lufton »

mulder790 писал(а): https://www.google.by/url?sa=t&source=w ... 3060,d.Yms там 2 сообщение реализация того что хотели вы но на микропаскале.
http://cxem.net/mc/mc173.php а это на бейсике.
Спасибо, а что если я уже начал писать на C?
Родился
Сообщения: 14
Зарегистрирован: Ср май 22, 2013 14:28:35

Сообщение 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?)
Но такого регистра тоже нет (даже не компилит).
О чём ещё я не знаю?
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 14
Зарегистрирован: Ср май 22, 2013 14:28:35

Сообщение lufton »

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

Вернуться в «AVR»