Atmega8 и клавиатура PS/2

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
MyXaSA
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Сб фев 18, 2012 18:05:14

Atmega8 и клавиатура PS/2

Сообщение MyXaSA »

Вечер добрый, думаю/анализирую как же соединить клаву с мк атмега8
алгоритм понял...
можете подогнать функцию для прослушки порта и записывать в переменную эти 7 бит(без старт и т.п) и значение это перекодировать в 16 ричную систему чтобы по таблице символов заменять

не кидайте ссылки всякие... там толком не вкурю... мне с этого начать надо я дальше сам под себя сделаю чего захочу.... я нуб в С функциях....
Вот наброски(CVAvr):

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

#include "mega8.h"
void main(void){
int i = 0;
char data;
DDRD = 0xff;
DDRB = 0x00;
while(1){

for(i = 0; i <= 11; i++){
}
          }
}
в data и будет шестнадцатиричный код.....
Реклама
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Atmega8 и клавиатура PS/2

Сообщение uk8amk »

1. Прием битов организовать через прерывание по спадающему уровню на линии CLOCK(например вектор преравания INT0).
2. Клава передает не 7 а 8 бит данных.
3. Зачем что-то куда-то перекодировать, тем более в 16-ричную систему?
4. Налицо полное непонимание сути вопроса, поэтому просто необходимо бросить несколько ссылок:
- статья "Интерфейсы с клавиатурой", журнал Схемотехника №11, 2001г.
- Аппноут AVR313: Interfacing the PC AT Keyboard, там есть полный СИ-шный код всех подпрограмм. После портирования в CVAVR даже что-то начинает работать)) Недостатки: код рассчитан на тепличные условия. В реальных условиях, например при перетыкании или горячем подключении клавы начинает глючить. Лечится введением проверки старт-стоп-четность битов и добавлением таймаута на получение байтов от клавы(т.е. задействовать доп. таймер).
- Спецификация на АТ PS/2 клавиатуры от Майкрософт, там описания всех скан-кодов.
Ну и наконец здесь, на Радиокоте в разделе статей была какая-то конструкция с клавиатурой.
Реклама
MyXaSA
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Сб фев 18, 2012 18:05:14

Re: Atmega8 и клавиатура PS/2

Сообщение MyXaSA »

ну да, нихрена не понимаю... частично... вот что-то нашел http://avrprogrammers.com/example_avr_keyboard.php
пишу в CVAVR он ругается : declaration syntax error
для этого

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

 ISR( INT0_vect )
как исправить? вечно ошибки всякие.. бесит невероятно
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Re: Atmega8 и клавиатура PS/2

Сообщение sachok »

Это синтаксис AVR-GCC в CVAVR

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

interrupt [EXT_INT0] void ext_int0_isr(void)
Я не Сашок!!!
Реклама
Эиком - электронные компоненты и радиодетали
MyXaSA
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Сб фев 18, 2012 18:05:14

Re: Atmega8 и клавиатура PS/2

Сообщение MyXaSA »

Вообщем этот код воткнул:

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

#include "mega8.h"
#include "interrupt.h"
#include <stdio.h>
#define MAX_KEYS 8
int bitcount;
int KBD_DATA;
volatile unsigned char flags = 0;
volatile unsigned char keyBuffer[MAX_KEYS];
volatile unsigned char * inPtr, * outPtr, * endPtr;
volatile unsigned char data;             
// keyboard scan codes (without & with shift key pressed)
flash unsigned char unshifted[67][2] = {
0x0e,'`',0x15,'q',0x16,'1',0x1a,'z',0x1b,'s',0x1c,'a',0x1d,'w',0x1e,'2',0x21,'c',0x22,'x',0x23,'d',0x24,'e',
0x25,'4',0x26,'3',0x29,' ',0x2a,'v',0x2b,'f',0x2c,'t',0x2d,'r',0x2e,'5',0x31,'n',0x32,'b',0x33,'h',0x34,'g',
0x35,'y',0x36,'6',0x39,',',0x3a,'m',0x3b,'j',0x3c,'u',0x3d,'7',0x3e,'8',0x41,',',0x42,'k',0x43,'i',0x44,'o',
0x45,'0',0x46,'9',0x49,'.',0x4a,'/',0x4b,'l',0x4c,';',0x4d,'p',0x4e,'-',0x52,'`',0x54,'[',0x55,'=',0x5a,13,
0x5b,']',0x5d,'/',0x61,'<',0x66,8,  0x69,'1',0x6b,'4',0x6c,'7',0x70,'0',0x71,',',0x72,'2',0x73,'5',0x74,'6',
0x75,'8',0x79,'+',0x7a,'3',0x7b,'-',0x7c,'*',0x7d,'9',0,0 };
flash unsigned char shifted[67][2] = {
0x0e,'`',0x15,'Q',0x16,'!',0x1a,'Z',0x1b,'S',0x1c,'A',0x1d,'W',0x1e,'C',0x22,'X',0x23,'D',0x24,'E',
0x25,'$',0x26,'#',0x29,' ',0x2a,'V',0x2b,'F',0x2c,'T',0x2d,'R',0x2e,'%',0x31,'N',0x32,'B',0x33,'H',0x34,'G',
0x35,'Y',0x36,'^',0x39,'L',0x3a,'M',0x3b,'J',0x3c,'U',0x3d,'&',0x3e,'*',0x41,'<',0x42,'K',0x43,'I',0x44,'O',
0x45,')',0x46,'(',0x49,'>',0x4a,'?',0x4b,'L',0x4c,':',0x4d,'P',0x4e,'_',0x52,'"',0x54,'{',0x55,'+',0x5a,13,
0x5b,'}',0x5d,'|',0x61,'>',0x66,8,  0x69,'1',0x6b,'4',0x6c,'7',0x70,'0',0x71,',',0x72,'2',0x73,'5',0x74,'6',
0x75,'8',0x79,'+',0x7a,'3',0x7b,'-',0x7c,'*',0x7d,'9',0,0 };
void decode(unsigned char sc) {
    static unsigned char is_up=0, shift = 0, mode = 0;
   unsigned char i;
 
   if (!is_up) {
      switch (sc) {
         case 0xF0 :// The up-key identifier
            is_up = 1;
            break;
         case 0x12 :// Left SHIFT
            shift = 1;
            break;
         case 0x59 :// Right SHIFT
            shift = 1;
            break;
         case 0x05 :// F1
            if(mode == 0)
               mode = 1;// Enter scan code mode
            if(mode == 2)
               mode = 3;// Leave scan code mode
            break;
         default:
            if(mode == 0 || mode == 3) {// If ASCII mode            
               if(!shift) {// If shift not pressed, do a table look-up
                  for(i = 0; unshifted[i][0]!=sc && unshifted[i][0]; i++);
                     if (unshifted[i][0] == sc) {
                        putchar(unshifted[i][1]);                     
                     }                                       
               }
               else {// If shift pressed
                  for(i = 0; shifted[i][0]!=sc && shifted[i][0]; i++);
                     if (shifted[i][0] == sc) {
                        putchar(shifted[i][1]);
                     }
               }
            }
            else putchar(sc);   // scan code mode (debugging mode)                        
            break;
      }
   }
   else {
      is_up = 0;
      switch (sc) {
         case 0x12 :// Left SHIFT
            shift = 0;
            break;
         case 0x59 :// Right SHIFT
            shift = 0;
            break;
         case 0x05 :// F1 --  F1 puts you in debugging mode
            if(mode == 1)
            mode = 2;
            if(mode == 3)
               mode = 0;
            break;      
      }
   }
}    
interrupt [EXT_INT0] void ext_int0_isr(void)
{
   if((bitcount < 11) && (bitcount > 2)) {
      data = (data >> 1);      
      if (KBD_DATA==1)        
         data = data | 0x80; 
      else
         data = data & 0x7f;
   }      
   if(--bitcount == 0) {     
           decode(data);     
         bitcount = 11;      
    }
        
}                                           

void main(void){
while(1){
 
}
}
как его юзать то? куда чего подключать? тут ничего никгде не возвращается(return) х3....

вот отсюда взял http://www.electronics-base.com/index.p ... ey-readout

и еще одно - в interrupt варнинги вылазиют скрин во вложении
Вложения
ыыы.png
(13.06 КБ) 698 скачиваний
Реклама
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Atmega8 и клавиатура PS/2

Сообщение uk8amk »

Гыы, с таким подходом в жизни ничего не заработает. Кто будет за вас будет инициализировать систему прерываний, порты, UART наконец в который сваливаются результаты преобразований скан-кодов?

Посмотрите в самом конце той статьи листинг кода и найдите отличия от своей функции main()
Реклама
MyXaSA
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Сб фев 18, 2012 18:05:14

Re: Atmega8 и клавиатура PS/2

Сообщение MyXaSA »

я уже разобрался, в прерывание сую дать сигнал на порт С5, то когда клавишу жму лампочка загорается( диод т.е)
Вот код(тут уже диод я поставил в while:

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

/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
<a href="http://www.hpinfotech.com">http://www.hpinfotech.com</a>
Project : 
Version : 
Date    : 12/26/2011
Author  : 
Company : 
Comments:

Chip type               : ATmega8535
Program type            : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 128
*****************************************************/
#include <mega8535.h>
#include <delay.h>
// Standard Input/Output functions
#include <stdio.h>
#define KBD_DATA PIND.3
// External Interrupt 0 service routine
unsigned char data,bitcount=11;   // holds the received scan code

// keyboard scan codes (without & with shift key pressed)
flash unsigned char unshifted[67][2] = {
//0x0d,9,
0x0e,'`',0x15,'q',0x16,'1',0x1a,'z',0x1b,'s',0x1c,'a',0x1d,'w',0x1e,'2',0x21,'c',0x22,'x',0x23,'d',0x24,'e',
0x25,'4',0x26,'3',0x29,' ',0x2a,'v',0x2b,'f',0x2c,'t',0x2d,'r',0x2e,'5',0x31,'n',0x32,'b',0x33,'h',0x34,'g',
0x35,'y',0x36,'6',0x39,',',0x3a,'m',0x3b,'j',0x3c,'u',0x3d,'7',0x3e,'8',0x41,',',0x42,'k',0x43,'i',0x44,'o',
0x45,'0',0x46,'9',0x49,'.',0x4a,'/',0x4b,'l',0x4c,';',0x4d,'p',0x4e,'-',0x52,'`',0x54,'[',0x55,'=',0x5a,13,
0x5b,']',0x5d,'/',0x61,'<',0x66,8,  0x69,'1',0x6b,'4',0x6c,'7',0x70,'0',0x71,',',0x72,'2',0x73,'5',0x74,'6',
0x75,'8',0x79,'+',0x7a,'3',0x7b,'-',0x7c,'*',0x7d,'9',0,0 };

flash unsigned char shifted[67][2] = {
//0x0d,9,
0x0e,'`',0x15,'Q',0x16,'!',0x1a,'Z',0x1b,'S',0x1c,'A',0x1d,'W',0x1e,'C',0x22,'X',0x23,'D',0x24,'E',
0x25,'$',0x26,'#',0x29,' ',0x2a,'V',0x2b,'F',0x2c,'T',0x2d,'R',0x2e,'%',0x31,'N',0x32,'B',0x33,'H',0x34,'G',
0x35,'Y',0x36,'^',0x39,'L',0x3a,'M',0x3b,'J',0x3c,'U',0x3d,'&',0x3e,'*',0x41,'<',0x42,'K',0x43,'I',0x44,'O',
0x45,')',0x46,'(',0x49,'>',0x4a,'?',0x4b,'L',0x4c,':',0x4d,'P',0x4e,'_',0x52,'"',0x54,'{',0x55,'+',0x5a,13,
0x5b,'}',0x5d,'|',0x61,'>',0x66,8,  0x69,'1',0x6b,'4',0x6c,'7',0x70,'0',0x71,',',0x72,'2',0x73,'5',0x74,'6',
0x75,'8',0x79,'+',0x7a,'3',0x7b,'-',0x7c,'*',0x7d,'9',0,0 };
                       
//***********************************************
// decode scan code
void decode(unsigned char sc) {
    static unsigned char is_up=0, shift = 0, mode = 0;
   unsigned char i;
 
   if (!is_up) {
      switch (sc) {
         case 0xF0 :// The up-key identifier
            is_up = 1;
            break;
         case 0x12 :// Left SHIFT
            shift = 1;
            break;
         case 0x59 :// Right SHIFT
            shift = 1;
            break;
         case 0x05 :// F1
            if(mode == 0)
               mode = 1;// Enter scan code mode
            if(mode == 2)
               mode = 3;// Leave scan code mode
            break;
         default:
            if(mode == 0 || mode == 3) {// If ASCII mode            
               if(!shift) {// If shift not pressed, do a table look-up
                  for(i = 0; unshifted[i][0]!=sc && unshifted[i][0]; i++);
                     if (unshifted[i][0] == sc) {
                        putchar(unshifted[i][1]);                     
                     }                                       
               }
               else {// If shift pressed
                  for(i = 0; shifted[i][0]!=sc && shifted[i][0]; i++);
                     if (shifted[i][0] == sc) {
                        putchar(shifted[i][1]);
                     }
               }
            }
            else putchar(sc);   // scan code mode (debugging mode)                        
            break;
      }
   }
   else {
      is_up = 0;// Two 0xF0 in a row not allowed
      switch (sc) {
         case 0x12 :// Left SHIFT
            shift = 0;
            break;
         case 0x59 :// Right SHIFT
            shift = 0;
            break;
         case 0x05 :// F1 --  F1 puts you in debugging mode
               // pressing F1 again gets you out of debugging mode
               // in debugging mode hex code of the scan codes
               // are stored in the buffer instead of their ascii codes      
            if(mode == 1)
            mode = 2;
            if(mode == 3)
               mode = 0;
            break;      
      }
   }
}                                               
//***********************************************
interrupt [EXT_INT0] void ext_int0_isr(void)
{

// Place your code here
   // function entered at falling edge of the kbd clock signal
   // if data bit is the next bit to be read
   // (bit 3 to 10 is data, start, stop & parity bis are ignored
   if((bitcount < 11) && (bitcount > 2)) {
      data = (data >> 1);      
      if (KBD_DATA==1)         // if next bit is 1   
         data = data | 0x80;   // store a '1'
      else
         data = data & 0x7f; // else store a '0'  
   }      
   if(--bitcount == 0) {      // all bits received ?      
           decode(data);       // decode received byte
         bitcount = 11;      // reset bit counter    
    }
  
        
}
#ifndef RXB8
#define RXB8 1
#endif
#ifndef TXB8
#define TXB8 0
#endif
#ifndef UPE
#define UPE 2
#endif
#ifndef DOR
#define DOR 3
#endif
#ifndef FE
#define FE 4
#endif
#ifndef UDRE
#define UDRE 5
#endif
#ifndef RXC
#define RXC 7
#endif
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer[rx_wr_index]=data;
   if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
   if (++rx_counter == RX_BUFFER_SIZE)
      {
      rx_counter=0;
      rx_buffer_overflow=1;
      };
   };
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
 char ss;
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x02;
MCUCSR=0x00;
GIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")

while (1)
      {
      if(getchar()){
       DDRC = 0xff;
PORTC.5 = 0xFF;
}
      };
}
это возвращает символ - getchar()
а чего он в условии тупит?)
даже отрицание ! поставить сигнала не будет и диод не будет гореть.... как мне сделать?
мне нужно до вести до такого тип -

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

if(getchar() == "e"){
****
}
electronicsbasecom
Родился
Сообщения: 4
Зарегистрирован: Вс фев 19, 2012 13:17:35

Re: Atmega8 и клавиатура PS/2

Сообщение electronicsbasecom »

make sure you have correct baud rate.
Try to write something first to uart

Maybe you configured clock to wrong frequency (4 instead of 8 MHz)
MyXaSA
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Сб фев 18, 2012 18:05:14

Re: Atmega8 и клавиатура PS/2

Сообщение MyXaSA »

Хелп котятки:

это почемуто неработает! когда жму левый шифт диод должен загорется, но он не горит( for some reason, it is not working! When I press the left shift LED should light up, but it does not burn)

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

//***********************************************
// decode scan code
void decode(unsigned char sc) {
    static unsigned char is_up=0, shift = 0, mode = 0;
   unsigned char i;
     switch (sc) {
           case 0x12 :// Left SHIFT
           DDRC = 0xFF;
           PORTC.5 = 0xFF;
            break;
            }
..........
Делаю так:

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

............
void decode(unsigned char sc) {
    static unsigned char is_up=0, shift = 0, mode = 0;
   unsigned char i;
   if(sc){
   DDRC = 0xFF;
           PORTC.5 = 0xFF;
   }else{
   DDRC = 0x00;
           PORTC.5 = 0x00;
           }
.................
то диод загорается, когда жму на любую клавишу, а когда отпускаю - потухает ( the LED lights up when I press any key, and when let go - goes out)

в чем проблема? как можно проверить что находится в переменной sc ?

вот тут вызывается decode:

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

interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here

   // function entered at falling edge of the kbd clock signal
   // if data bit is the next bit to be read
   // (bit 3 to 10 is data, start, stop & parity bis are ignored
   if((bitcount < 11) && (bitcount > 2)) {

      data = (data >> 1);      

      if (KBD_DATA==1)         // if next bit is 1   
         data = data | 0x80;   // store a '1'
      else
         data = data & 0x7f; // else store a '0'  

   }      
   if(--bitcount == 0) {      // all bits received ?      
           decode(data);       // decode received byte
         bitcount = 11;      // reset bit counter    

    } 
  // kkey  =  data;
        
}
electronicsbasecom
Родился
Сообщения: 4
Зарегистрирован: Вс фев 19, 2012 13:17:35

Re: Atmega8 и клавиатура PS/2

Сообщение electronicsbasecom »

the best way is to try sending received sc character that you try to decode to UART that way you will know why it is not working.
Maybe start with functional program and then edit it piece by piece and checking if it is still working.

My advice is to use UART as best debuging tool.
If you are not sure why something isn't working just send value to uart and you will get more info about it.

what value you have in sc when you press shift?
MyXaSA
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Сб фев 18, 2012 18:05:14

Re: Atmega8 и клавиатура PS/2

Сообщение MyXaSA »

how to edit the code, please)
TripleKill
Вымогатель припоя
Сообщения: 671
Зарегистрирован: Вт июн 29, 2010 12:31:49

Re: Atmega8 и клавиатура PS/2

Сообщение TripleKill »

насколько я знаю, конструкция if работает только с логическими выражениями, и если туда засунуть число, то она скорее всего будет срабатывать всегда, когда это число отлично от 0, т.е. при любой нажатой клавише (вроде среди кодов нет 0х00).

в том примере, где жмёте любую клавишу и диод загорается, можно попробовать if (sc==0x12)
MyXaSA
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Сб фев 18, 2012 18:05:14

Re: Atmega8 и клавиатура PS/2

Сообщение MyXaSA »

TripleKill писал(а):насколько я знаю, конструкция if работает только с логическими выражениями, и если туда засунуть число, то она скорее всего будет срабатывать всегда, когда это число отлично от 0, т.е. при любой нажатой клавише (вроде среди кодов нет 0х00).

в том примере, где жмёте любую клавишу и диод загорается, можно попробовать if (sc==0x12)
не, не получается.... может не так подключаю ?
как надо подключить? : data к int0 или clock к int0(PD2) ? или одно к int1(PD3) ?
TripleKill
Вымогатель припоя
Сообщения: 671
Зарегистрирован: Вт июн 29, 2010 12:31:49

Re: Atmega8 и клавиатура PS/2

Сообщение TripleKill »

#define KBD_DATA PIND.3
Data вроде на D3 висит. Клок пока не увидел где.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Atmega8 и клавиатура PS/2

Сообщение uk8amk »

Это, а ничего что вот здесь написано?:

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

#include <mega8535.h>

А выше и даже в с самом названии топика:

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

#include "mega8.h"
Автор, отключай технологию Copy-Paste, включай свой мозг!!!
MyXaSA писал(а):как надо подключить?
В данном случае:
CLOCK -> PD2(INT0)
DATA <-> PD3
это возвращает символ - getchar()
а чего он в условии тупит?)
getchar() - стандартная библиотечная функция приема символа через UART(определена в файле stdio.h). Что-то мне подсказывает, что с COM-порта компьютера вы ей ничего не передаете, вот она и ничего не возвращает.
MyXaSA
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Сб фев 18, 2012 18:05:14

Re: Atmega8 и клавиатура PS/2

Сообщение MyXaSA »

мне скажите различия между 8532 и 8 , я подгоню чего нужно
и насчет COM порта не пойму... он нигде не задействован у меня
MyXaSA
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Сб фев 18, 2012 18:05:14

Re: Atmega8 и клавиатура PS/2

Сообщение MyXaSA »

хелп люди.... не получается :(
MyXaSA
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Сб фев 18, 2012 18:05:14

Re: Atmega8 и клавиатура PS/2

Сообщение MyXaSA »

Вот новый код под AVR Studio:

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

#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
#define RS PD0
#define EN PD1
#define lcd_port PORTD
#define DAT PC1

const uint8_t unshifted[][2]=
{
  0x0e,'`',
  0x15,'q',
  0x16,'1',
  0x1a,'z',
  0x1b,'s',
  0x1c,'a',
  0x1d,'w',
  0x1e,'2',
  0x21,'c',
  0x22,'x',
  0x23,'d',
  0x24,'e',
  0x25,'4',
  0x26,'3',
  0x29,' ',
  0x2a,'v',
  0x2b,'f',
  0x2c,'t',
  0x2d,'r',
  0x2e,'5',
  0x31,'n',
  0x32,'b',
  0x33,'h',
  0x34,'g',
  0x35,'y',
  0x36,'6',
  0x39,',',
  0x3a,'m',
  0x3b,'j',
  0x3c,'u',
  0x3d,'7',
  0x3e,'8',
  0x41,',',
  0x42,'k',
  0x43,'i',
  0x44,'o',
  0x45,'0',
  0x46,'9',
  0x49,'.',
  0x4a,'/',
  0x4b,'l',
  0x4c,';',
  0x4d,'p',
  0x4e,'-',
  0x52,'\'',
  0x54,'[',
  0x55,'=',
  0x5b,']',
  0x5d,'\\',
  0x61,'<',
  0x69,'1',
  0x6b,'4',
  0x6c,'7',
  0x70,'0',
  0x71,'.',
  0x72,'2',
  0x73,'5',
  0x74,'6',
  0x75,'8',
  0x79,'+',
  0x7a,'3',
  0x7b,'-',
  0x7c,'*',
  0x7d,'9',
  0,0};

const uint8_t shifted[][2]=      //shift?«ц¤U??Єн
{
  0x0e,'~',
  0x15,'Q',
  0x16,'!',
  0x1a,'Z',
  0x1b,'S',
  0x1c,'A',
  0x1d,'W',
  0x1e,'@',
  0x21,'C',
  0x22,'X',
  0x23,'D',
  0x24,'E',
  0x25,'$',
  0x26,'#',
  0x29,' ',
  0x2a,'V',
  0x2b,'F',
  0x2c,'T',
  0x2d,'R',
  0x2e,'%',
  0x31,'N',
  0x32,'B',
  0x33,'H',
  0x34,'G',
  0x35,'Y',
  0x36,'^',
  0x39,'L',
  0x3a,'M',
  0x3b,'J',
  0x3c,'U',
  0x3d,'&',
  0x3e,'*',
  0x41,'<',
  0x42,'K',
  0x43,'I',
  0x44,'O',
  0x45,')',
  0x46,'(',
  0x49,'>',
  0x4a,'?',
  0x4b,'L',
  0x4c,':',
  0x4d,'P',
  0x4e,'_',
  0x52,'"',
  0x54,'{',
  0x55,'+',
  0x5b,'}',
  0x5d,'|',
  0x61,'>',
  0x69,'1',
  0x6b,'4',
  0x6c,'7',
  0x70,'0',
  0x71,'.',
  0x72,'2',
  0x73,'5',
  0x74,'6',
  0x75,'8',
  0x79,'+',
  0x7a,'3',
  0x7b,'-',
  0x7c,'*',
  0x7d,'9',
  0,0
};

uint8_t edge,bitcnt,ascii = ' ';

void init(void)
{
	MCUCR = 2;
	edge = 0;
	bitcnt = 11;
	DDRD = 0xFF;
	PORTD = 0xFF;
	DDRD &= ~(1<<PD2);
	PORTD |= (1<<PD2);
	DDRC &= ~(1<<DAT);
	PORTC |= (1<<DAT);
	asm("sei");
	GICR |= (1<<INT0);
}

void decode(uint8_t scancode)
{

	static uint8_t up = 0,shift = 0;
	uint8_t i;
	if(!up)
	{
		switch(scancode)
		{
			case 0xF0:
				up = 1;
				break;
			case 0x12:
			
				shift = 1;
				break;
			case 0x59:
				shift = 1;
				break;
			default:
				if(!shift)
				{
					
				for(i=0;unshifted[i][0] != scancode && unshifted[i][0];i++);
					
					if(unshifted[i][0]==scancode)
					{
						ascii = unshifted[i][1];
						DDRB = 0xFF;
            PORTB = 0xff;	
					}
					
				}
				else
				{
					for(i=0;shifted[i][0] != scancode && shifted[i][0];i++);
					if(shifted[i][0]==scancode)
					{
							
						ascii = shifted[i][1];
					}
				}
				break;
		}
	}
	else
	{
			
		up = 0;
		switch(scancode)
		{
			case 0x12:
				shift = 0;
				break;
			case 0x59:
				shift = 0;
				break;
			default:
				break;
		}
	}
}
ISR(INT0_vect)
{
	static uint8_t DATA;
	if(!edge)
	{
		if(bitcnt < 11 && bitcnt > 2)
		{
			DATA = (DATA >> 1);
			if(PINC && (1<<DAT))
			{
				DATA |= 0x80;
			}
		}
	MCUCR = 3;
	edge = 1;
	}
	else
	{
		MCUCR = 2;
		edge = 0;
		if(--bitcnt == 0)
		{
			decode(DATA);
			bitcnt = 11;
		}
	}
}

int main(void)
{

	uint8_t i;
	init();
	asm("nop");
	while(1)
	{

	}
	return 0;
}
Диод стоит тут:

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

..
if(!shift)
				{
					
				for(i=0;unshifted[i][0] != scancode && unshifted[i][0];i++);
					
					if(unshifted[i][0]==scancode)
					{
						ascii = unshifted[i][1];
						DDRB = 0xFF;
            PORTB = 0xff;	
					}
					
				}
...
Нужно раз сто по клавише нажать, чтобы он загорелся.... если я его вынесу выше if :

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

..................
DDRB = 0xFF;
PORTB = 0xff;	
if(unshifted[i][0]==scancode)
					{
						ascii = unshifted[i][1];
						
					}
.................
тогда при нажатии на любую клавишу он мгновенно загорится.... Теперь если диод пихать в case например для шиФта (ну для любой тоже самое):

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

...
	switch(scancode)
		{
			case 0xF0:
				up = 1;
				break;
			case 0x12:
DDRB = 0xFF;
PORTB = 0xff;	
				shift = 1;
				break;
...
то при нажатии на любой шифт он не загорается... также если другие клавиши юзать(0x00 и т.п)

Clock и data подключаю: data( PC1 ), а clock (PD2)

как сделать чтобы нормально все работало!?!? в гугл вообще нет ничего нормального !
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Atmega8 и клавиатура PS/2

Сообщение ploop »

MyXaSA, большие простыни кодов оформляем как вложение, и не постим сообщения друг за другом! Есть кнопка "Правка"
MyXaSA
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Сб фев 18, 2012 18:05:14

Re: Atmega8 и клавиатура PS/2

Сообщение MyXaSA »

окей босс, больше такого не повторится !)


Коты, вы вроде все мозговитые тут, кто-то полюбому клаву подключал к МК.... help работа встала!!! :( :(
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»