terça-feira, 17 de junho de 2014

PPI-Mega8 - Diagrama e tabelas de constantes

Depois de algum tempo estudando e fazendo alguns experimentos com o roteamento da placa cheguei ao circuito básico do emulador de teclado para ser colocado sobre a PPI.


Esta disposição de pinos permitiu fazer ligações praticamente retas entre o AVR e a PPI de forma que a placa de circuito impressso possa ser de face simples


As linhas PC0..PC3 da PPI foram direto aos pinos PINC0..3 do AVR. Com isso apenas as colunas trocaram um pouco de lugar (PB3 foi para o bit 0, etc)

Assim a matriz de teclado mudou para

// Matrix columns reorganized for optimizing PCB layout

    7     6     5     4     3     2     1     0    BIT
 +-----------------------------------------------+                        
 ¦  4  ¦  3  ¦  2  ¦  1  ¦  0  ¦  5  ¦  6  ¦  7  ¦   Row 0                        
 +-----+-----+-----+-----+-----+-----+-----+-----¦                        
 ¦  \  ¦  =  ¦  -  ¦  9  ¦  8  ¦  ´  ¦  ¨  ¦  Ç  ¦   Row 1                        
 +-----+-----+-----+-----+-----+-----+-----+-----¦                        
 ¦  /  ¦  .  ¦  ,  ¦  [  ¦  ~  ¦  <  ¦  A  ¦  B  ¦   Row 2                        
 +-----+-----+-----+-----+-----+-----+-----+-----¦                        
 ¦  G  ¦  F  ¦  E  ¦  D  ¦  C  ¦  H  ¦  I  ¦  J  ¦   Row 3                        
 +-----+-----+-----+-----+-----+-----+-----+-----¦                        
 ¦  O  ¦  N  ¦  M  ¦  L  ¦  K  ¦  P  ¦  Q  ¦  R  ¦   Row 4                        
 +-----+-----+-----+-----+-----+-----+-----+-----¦                        
 ¦  W  ¦  V  ¦  U  ¦  T  ¦  S  ¦  X  ¦  Y  ¦  Z  ¦   Row 5                        
 +-----+-----+-----+-----+-----+-----+-----+-----¦
 ¦CODE ¦ CAP ¦GRAPH¦CTRL ¦SHIFT¦ F1  ¦ F2  ¦ F3  ¦   Row 6
 +-----+-----+-----+-----+-----+-----+-----+-----¦
 ¦STOP ¦ TAB ¦ ESC ¦ F5  ¦ F4  ¦ BS  ¦ SEL ¦ CR  ¦   Row 7
 +-----+-----+-----+-----+-----+-----+-----+-----¦
 ¦LEFT ¦ DEL ¦ INS ¦HOME ¦SPACE¦ UP  ¦DOWN ¦RIGHT¦   Row 8
 +-----------------------------------------------+
    4     3     2     1     0     5     6     7       Column

E o endereço das teclas ficou:

// ROW 0   Hexa
#define _0             0x03
#define _1             0x04
#define _2             0x05
#define _3             0x06
#define _4             0x07
#define _5             0x02
#define _6             0x01
#define _7             0x00

// ROW 1
#define _8             0x0B
#define _9             0x0C
#define _MINUS         0x0D
#define _EQUAL         0x0E
#define _BACKSLASH     0x0F
#define _ACUTE         0x0A
#define _UBER         0x09
#define _CCEDIL       0x08

// ROW 2
#define _TILDE         0x13
#define _OPENBRACKET   0x14
#define _COMMA         0x15
#define _DOT           0x16
#define _SLASH         0x17
#define _LESSTHAN     0x12
#define _A             0x11
#define _B             0x10

// ROW 3
#define _C             0x1B
#define _D             0x1C
#define _E             0x1D
#define _F             0x1E
#define _G             0x1F
#define _H             0x1A
#define _I             0x19
#define _J             0x18

// ROW 4
#define _K             0x23
#define _L             0x24
#define _M             0x25
#define _N             0x26
#define _O             0x27
#define _P             0x22
#define _Q             0x21
#define _R             0x20

// ROW 5
#define _S             0x2B
#define _T             0x2C
#define _U             0x2D
#define _V             0x2E
#define _W             0x2F
#define _X             0x2A
#define _Y             0x29
#define _Z             0x28

// ROW 6
#define _SHIFT         0x33
#define _CONTROL       0x34
#define _GRAPH         0x35
#define _CAPS         0x36
#define _CODE         0x37
#define _F1           0x32
#define _F2           0x31
#define _F3           0x30

// ROW 7
#define _F4           0x3B
#define _F5           0x3C
#define _ESC           0x3D
#define _TAB           0x3E
#define _STOP         0x3F
#define _BACKSPACE     0x3A 
#define _SELECT       0x39
#define _ENTER         0x38

// ROW 8
#define _SPACE         0x43
#define _HOME         0x44
#define _INSERT       0x45
#define _DELETE       0x46
#define _LEFT         0x47
#define _UP           0x42
#define _DOWN         0x41
#define _RIGHT         0x40

Finalmente, as tabelas de caracteres sem e com shift ficaram assim:

// Keys ordered by PS/2 Scancode
const uint8_t PS2Keymap_Normal[] PROGMEM = { 
_NONE       ,     // 0x00   
_F9         ,     // 0x01  F9
_NONE       ,     // 0x02  
_F5         ,     // 0x03  F5
_F3         ,     // 0x04  F3
_F1         ,     // 0x05  F1
_F2         ,     // 0x06  F2
_STOP       ,     // 0x07  F12           
_NONE       ,     // 0x08                
_F10        ,     // 0x09  F10           
_F8         ,     // 0x0A  F8            
_F6         ,     // 0x0B  F6            
_F4         ,     // 0x0C  F4            
_TAB        ,     // 0x0D  TAB           
_APOSTROPHE ,     // 0x0E  APOSTROPHE    '
_NONE       ,     // 0x0F                
_NONE       ,     // 0x10                
_GRAPH      ,     // 0x11  L ALT         
_SHIFT      ,     // 0x12  L SHFT        
_NONE       ,     // 0x13                
_CONTROL    ,     // 0x14  L CTRL            
_Q          ,     // 0x15  Q             
_1          ,     // 0x16  1             
_NONE       ,     // 0x17                
_NONE       ,     // 0x18                
_NONE       ,     // 0x19                
_Z          ,     // 0x1A  Z             
_S          ,     // 0x1B  S             
_A          ,     // 0x1C  A             
_W          ,     // 0x1D  W             
_2          ,     // 0x1E  2             
_NONE       ,     // 0x1F                
_NONE       ,     // 0x20                
_C          ,     // 0x21  C             
_X          ,     // 0x22  X             
_D          ,     // 0x23  D             
_E          ,     // 0x24  E             
_4          ,     // 0x25  4             
_3          ,     // 0x26  3             
_NONE       ,     // 0x27                
_NONE       ,     // 0x28                
_SPACE      ,     // 0x29  SPACE         
_V          ,     // 0x2A  V             
_F          ,     // 0x2B  F             
_T          ,     // 0x2C  T             
_R          ,     // 0x2D  R             
_5          ,     // 0x2E  5             
_NONE       ,     // 0x2F                
_NONE       ,     // 0x30                
_N          ,     // 0x31  N             
_B          ,     // 0x32  B             
_H          ,     // 0x33  H             
_G          ,     // 0x34  G             
_Y          ,     // 0x35  Y             
_6          ,     // 0x36  6             
_NONE       ,     // 0x37                
_NONE       ,     // 0x38                
_NONE       ,     // 0x39                
_M          ,     // 0x3A  M             
_J          ,     // 0x3B  J             
_U          ,     // 0x3C  U             
_7          ,     // 0x3D  7             
_8          ,     // 0x3E  8             
_NONE       ,     // 0x3F                
_NONE       ,     // 0x40                
_COMMA      ,     // 0x41  COMMA         ,
_K          ,     // 0x42  K             
_I          ,     // 0x43  I             
_O          ,     // 0x44  O             
_0          ,     // 0x45  0             
_9          ,     // 0x46  9             
_NONE       ,     // 0x47                
_NONE       ,     // 0x48                
_DOT        ,     // 0x49  DOT           .
_SEMICOLON  ,     // 0x4A  SEMICOLON     ;
_L          ,     // 0x4B  L             
_CCEDIL     ,     // 0x4C  CCCEDIL       Ç
_P          ,     // 0x4D  P             
_MINUS      ,     // 0x4E  MINUS         -
_NONE       ,     // 0x4F  
_NONE       ,     // 0x50  
_SLASH      ,     // 0x51  SLASH         /
_TILDE      ,     // 0x52  TILDE         ~
_NONE       ,     // 0x53  
_ACUTE      ,     // 0x54  ACUTE         `
_EQUAL      ,     // 0x55  EQUAL         =
_NONE       ,     // 0x56  
_NONE       ,     // 0x57  
_CAPS       ,     // 0x58  CAPS
_SHIFT      ,     // 0x59  R SHFT
_ENTER      ,     // 0x5A  ENTER
_OPENBRACKET,     // 0x5B  OPENBRACKET   [
_NONE       ,     // 0x5C  
_CLOSEBRACKET,    // 0x5D  CLOSEBRACKET  ]
_NONE       ,     // 0x5E  
_NONE       ,     // 0x5F  
_NONE       ,     // 0x60  
_BACKSLASH  ,     // 0x61  BACKSLASH     
_NONE       ,     // 0x62  
_F7         ,     // 0x63  F7 (relocated from 0x83 to keep table under 128 chars
_NONE       ,     // 0x64  
_NONE       ,     // 0x65        
_BACKSPACE  ,     // 0x66  BKSP
_NONE       ,     // 0x67  
_NONE       ,     // 0x68  
_1          ,     // 0x69  KP1
_NONE       ,     // 0x6A  
_4          ,     // 0x6B  KP4
_7          ,     // 0x6C  KP7
_DOT        ,     // 0x6D  KPDOT         .
_NONE       ,     // 0x6E  
_NONE       ,     // 0x6F  
_0          ,     // 0x70  KP0
_COMMA      ,     // 0x71  KPCOMMA       ,
_2          ,     // 0x72  KP2
_5          ,     // 0x73  KP5
_6          ,     // 0x74  KP6
_8          ,     // 0x75  KP8
_ESC        ,     // 0x76  ESC
_NONE       ,    // 0x77  NUM
_SELECT     ,     // 0x78  F11
_PLUS       ,     // 0x79  KPPLUS        +
_3          ,     // 0x7A  KP3
_MINUS      ,     // 0x7B  KPMINUS       -
_ASTERISK   ,     // 0x7C  KPTIMES       *
_9          ,     // 0x7D  KP9
_NONE       ,     // 0x7E  SCROLL
_NONE       ,     // 0x7F  
 };
/*
_NONE       ,     // 0x80  
_NONE       ,     // 0x81  
_NONE       ,     // 0x82  
_F7             // 0x83  F7
 };
*/

const uint8_t PS2Keymap_Shifted[] PROGMEM =
_NONE       ,      // 0x00   
_F9         ,      // 0x01  
_NONE       ,      // 0x02  
_F5         ,      // 0x03  
_F3         ,      // 0x04  
_F1         ,      // 0x05  
_F2         ,      // 0x06  
_SELECT     ,      // 0x07  
_NONE       ,      // 0x08  
_F10        ,      // 0x09  
_F8         ,      // 0x0A  
_F6         ,      // 0x0B  
_F4         ,      // 0x0C  
_TAB        ,      // 0x0D  
_QUOTE      ,      // 0x0E   QUOTE      "
_NONE       ,      // 0x0F              
_NONE       ,      // 0x10              
_GRAPH      ,      // 0x11              
_SHIFT      ,      // 0x12              
_NONE       ,      // 0x13              
_CONTROL    ,      // 0x14              
_Q          ,      // 0x15              
_EXCLAMATION,      // 0x16  EXCLAMATION !
_NONE       ,      // 0x17              
_NONE       ,      // 0x18              
_NONE       ,      // 0x19              
_Z          ,      // 0x1A              
_S          ,      // 0x1B              
_A          ,      // 0x1C              
_W          ,      // 0x1D              
_AT         ,      // 0x1E  AT          @
_NONE       ,      // 0x1F              
_NONE       ,      // 0x20              
_C          ,      // 0x21              
_X          ,      // 0x22              
_D          ,      // 0x23              
_E          ,      // 0x24              
_DOLLAR     ,      // 0x25  DOLLAR      $
_NUMBER     ,      // 0x26  NUMBER      #
_NONE       ,      // 0x27              
_NONE       ,      // 0x28              
_SPACE      ,      // 0x29              
_V          ,      // 0x2A              
_F          ,      // 0x2B              
_T          ,      // 0x2C              
_R          ,      // 0x2D              
_PERCENT    ,      // 0x2E  PERCENT     %
_NONE       ,      // 0x2F              
_NONE       ,      // 0x30              
_N          ,      // 0x31              
_B          ,      // 0x32              
_H          ,      // 0x33              
_G          ,      // 0x34              
_Y          ,      // 0x35              
_UBER       ,      // 0x36  UBER        ¨
_NONE       ,      // 0x37              
_NONE       ,      // 0x38              
_NONE       ,      // 0x39              
_M          ,      // 0x3A              
_J          ,      // 0x3B              
_U          ,      // 0x3C              
_AMPERSAND  ,      // 0x3D  AMPERSAND   &
_ASTERISK   ,      // 0x3E  ASTERISK    *
_NONE       ,      // 0x3F              
_NONE       ,      // 0x40              
_LESSTHAN   ,      // 0x41  LESSTHAN    <
_K          ,      // 0x42              
_I          ,      // 0x43              
_O          ,      // 0x44              
_CLOSEBRACE ,      // 0x45  CLOSEBRACE  )
_OPENBRACE  ,      // 0x46  OPENBRACE   (
_NONE       ,      // 0x47              
_NONE       ,      // 0x48              
_GREATERTHAN,      // 0x49  GREATERTHAN >
_COLON      ,      // 0x4A  COLON       :
_L          ,      // 0x4B              
_CCEDIL    ,      // 0x4C              
_P          ,      // 0x4D              
_UNDERSCORE ,      // 0x4E  UNDERSCORE  _
_NONE       ,      // 0x4F              
_NONE       ,      // 0x50              
_QUESTION   ,      // 0x51  QUESTION    ?
_CIRCUMFLEX ,      // 0x52  CIRCUMFLEX  ^
_NONE       ,      // 0x53              
_GRAVE      ,      // 0x54  GRAVE       `
_PLUS       ,      // 0x55  PLUS        +
_NONE       ,      // 0x56              
_NONE       ,      // 0x57              
_CAPS       ,      // 0x58              
_SHIFT      ,      // 0x59              
_ENTER      ,      // 0x5A              
_OPENKEY    ,      // 0x5B  OPENKEY     {
_NONE       ,      // 0x5C              
_CLOSEKEY   ,      // 0x5D  CLOSEKEY    }
_NONE       ,      // 0x5E              
_NONE       ,      // 0x5F              
_NONE       ,      // 0x60              
_PIPE       ,      // 0x61  PIPE        |
_NONE       ,      // 0x62              
_F7         ,      // 0x63  F7 (relocated from 0x83 to keep table under 128 chars            
_NONE       ,      // 0x64  
_NONE       ,      // 0x65  
_BACKSPACE  ,      // 0x66  
_NONE       ,      // 0x67  
_NONE       ,      // 0x68  
_1          ,      // 0x69  
_NONE       ,      // 0x6A  
_4          ,      // 0x6B  
_7          ,      // 0x6C  
_DOT        ,      // 0x6D  
_NONE       ,      // 0x6E  
_NONE       ,      // 0x6F  
_0          ,      // 0x70  
_COMMA      ,      // 0x71  
_2          ,      // 0x72  
_5          ,      // 0x73  
_6          ,      // 0x74  
_8          ,      // 0x75  
_ESC        ,      // 0x76  
_NONE       ,      // 0x77  
_SELECT     ,      // 0x78  
_PLUS       ,      // 0x79  
_3          ,      // 0x7A  
_MINUS      ,      // 0x7B  
_ASTERISK   ,      // 0x7C  
_9          ,      // 0x7D  
_NONE       ,      // 0x7E  
_NONE       ,      // 0x7F  
 };





2 comentários:

Unknown disse...

Mais uma vez parabéns pelo empenho em desenvolver esse adaptador de teclad Danjovic. E aproveitando a mensagem, vc pretende compartilhar esse adaptador de teclado?

Danjovic disse...

Obrigado. Compartilhar o projeto é o que tenho feito em meu blog.