Nouvelles
Loading...
mardi 1 octobre 2013

Branchez le clavier PS/2 pour le PIC

10/01/2013
                                                         





Le clavier du dispositif est la plus courante pour entrer des informations dans un ordinateur. Il est donc important de connaître le principe de fonctionnement et le clavier de l'interface de communication.
Cet article décrit un dispositif qui peut recevoir des données à partir du clavier et afficher les frappes sur le périphérique de sortie. À titre d'exemple, nous allons développer un dispositif simple utilisant un affichage à sept segments clavier PS / 2, un PIC.

L'idée du projet

L'objectif principal de ce projet est de créer un dispositif capable de fonctionner avec un dispositif PS / 2, mais plus précisément avec le clavier PS / 2. Le clavier est connecté à un microcontrôleur PIC, qui à son tour va traiter les frappes et les symboles de sortie des touches sur l'écran à sept segments.
PS / 2 - une interface série avec un signal d'horloge de 10-16 kHz, donc nous devons utiliser les interruptions PIC pour détecter le bord de fuite de l'impulsion.
Liste des éléments radioactifs utilisés
Le microcontrôleur PIC18F452 ( fiche technique )
7805 - régulateur de tension pyativoltovy
Le cristal de quartz 20 MHz
Connecteur PS / 2 (femelle)
Affichage à 7 segments
Résistances
En outre, le programmeur devra éclair PIC, planche à pain et le cavalier (ou la carte gravée).
Circuit
Comme on peut le voir sur le schéma ci-dessous, le dispositif est des détails très simples et de base de celui-ci: 78L05, PIC18F452 et connecteur PS / 2.


Au PS / 2 broches 2 et 6 ne sont pas utilisés, le quatrième axe - +5 V, le troisième axe - total. Cinquième broche - un signal d'horloge, et le premier axe - données.
Afficheur 7 segments, j'ai utilisé une cathode commune.
Un peu de théorie sur le PS / 2
Comme mentionné ci-dessus, dans le protocole série PS / 2 utilise deux lignes de transmission de l'information: une ligne d'horloge et de données.


Brochage 6 broches mini-DIN (PS / 2): 

1 - Données
2 - non utilisé
3 - Commun (sol)
4 - Alimentation (+5 V)
5 - Horloge
6 - Non utilisé
La figure ci-dessus montre le brochage PS / 2 connecteur mâle (à gauche) et sa mère (à droite). Habituellement, le connecteur de type «papa» est utilisé sur le côté de l'appareil - souris, clavier, et le type de bouchon "maman" sur l'ordinateur. Dans notre cas (parce que nous avons l'extrémité de réception), nous allons utiliser un connecteur comme "maman" (peut être coupé à n'importe quelle carte mère brûlée).
Figure signaux PS / 2
La figure ci-dessus montre un chronogramme typique des données de sortie pour périphériques PS / 2. La séquence est la suivante:
1. La sortie des données est mis à logique bas
2. Le signal d'horloge de sortie est réglé à un niveau bas
3. Les données continue d'être transmis à un bas niveau (bit de démarrage)
4. Le signal d'horloge est un niveau logique haut
5. La transmission commence avec les huit bits de données
6. Suivant est le bit de parité
7. Derrière lui, le bit d'arrêt
Toutes les données sont tirées de la désintégration de l'horloge positive.
Codes Scan-clés
Chaque touche du clavier a son propre code unique, le soi-disant scanner code.
Comme le montrent les images ci-dessus, la plupart des touches du clavier comprend des valeurs de 8 bits (1 octet), mais certaines touches comprendre une séquence multi-octets.

Prenons l'exemple de la façon dont la formation des codes scan-clés. Si vous appuyez sur n'importe quelle touche sur la touche du clavier, le clavier apparaît à la sortie du scan code de la touche pressée. Quand une touche est enfoncée, la sortie est générée 0xF0 de code et des touches de code de balayage enfoncée. Ainsi, Vous pouvez déterminer si une touche est enfoncée ou non, mais nous n'avons pas besoin


La figure ci-dessus montre la forme d'onde PS / 2 tout en maintenant enfoncée la "J". Canal 1 (jaune) sur le signal, il est un tel signal. Canal 2 (bleu) est un signal de données.Pour plus de clarté, j'ai postulé pour la détection des lignes auxiliaire horloge de ralentissement.
Avec cette forme d'onde peut être facilement déterminée scan code de la touche pressée. N'oubliez pas que la gauche est le bit le moins significatif (par exemple, 0), et le droit senior (7 bits). Ainsi, en binaire 0011 1011 tourné cet hexagone est 0x3B, à savoir est un code de balayage de touche "J".

Les données d'un clavier


Une autre fonction du protocole PS / 2 est de transférer les données vers le clavier, par exemple, vous pouvez exécuter la commande pour allumer / éteindre le voyant Caps Lock, Num Lock, etc Mais il ne faut pas insister là-dessus, parce que c'est un sujet pour un autre article.
Le circuit monté sur la carte de test est la suivante:


Le programme pour le PIC En Langage C
Logiciel se compose de deux parties principales: la boucle principale de la boucle principale et le gestionnaire d'interruption.
Dans les données de la boucle principale est reçue et traitée pour afficher l'indicateur. Eh bien, en réalité, il sortie.
Certains codes boucle principale:

 #include 
 #include
 #include
 #include
 //7-Segment Display Output
 #define number_0 0b01111110
 ..
 ...
 ..
 #define letter_a 0b11101110
 #define letter_b 0b11111110
 ..
 ...
 ..
 void main(void){
 TRISC = 0xFF;
 TRISD = 0x01;
 PORTB = 0x00;
 PORTC = 0x00;
    //7-Seg LED is Reverse Polarity
 PORTD = 0x00 ^ 0xFF;
 Delay10KTCYx(10);
 INTCON = 0b11000000;
 OpenCapture1( C1_EVERY_FALL_EDGE & CAPTURE_INT_ON );
 OpenTimer1( TIMER_INT_ON & T1_SOURCE_INT & T1_PS_1_1 & T1_16BIT_RW );
 WriteTimer1( 0x0000 );
 while(1)
 {
    if(buf_ready == 1){
    switch(scan_code_buf[0]){
    case 0x1C : PORTD = (letter_a ^ 0xFF);
       break;
    ...
    ....
    ..
       break;
    case 0x45 : PORTD = (number_0 ^ 0xFF);
       break;
    case 0x66 : PORTD = (delete ^ 0xFF);
       break;
    default :
       break;
    }
    //Shift Buffer Forward
    scan_code_buf[0] = scan_code_buf[1];
    scan_code_buf[1] = scan_code_buf[2];
    scan_code_buf[2] = scan_code_buf[3];
    scan_code_buf[3] = scan_code_buf[4];
    scan_code_buf[4] = scan_code_buf[5];
    scan_code_buf[5] = scan_code_buf[6];
    scan_code_buf[6] = scan_code_buf[7];
    scan_code_buf_cnt--;
       if(scan_code_buf_cnt == 0)
          buf_ready = 0;
    }
       Delay10KTCYx(1);
 }
 }

Ainsi, dans le cycle principal traitement de la boucle se produit qui entrent dans la FIFO tampon. Le code, qui est représenté ci-dessous, les données sont reçues PS / 2 d'interruption, après quoi ils sont placés dans le tampon FIFO. Code 0xF0 est ignoré, nous sommes intéressés uniquement frappes.
Le code d'interruption est la suivante:

void InterruptHandlerHigh(void) // Declaration of InterruptHandler
 {
     //Check If TMR1 Interrupt Flag Is Set
   if(PIR1bits.CCP1IF){
     if(bit_counter < 10){
       current_scan_code = current_scan_code >> 1;
       current_scan_code += (PORTDbits.RD0*0b10000000000);
       bit_counter++;
     }
     else if(bit_counter == 10){
 scan_code_buf[scan_code_buf_cnt]=(current_scan_code>>2)&0xFF;
       scan_code_buf_cnt++;
       buf_ready = 1;
       bit_counter = 0;
     }
     WriteTimer1( 0x0000 );
     //Clear CCP1 Overflow Flag Bit
     PIR1bits.CCP1IF = 0;
   }
     //Check If CCP1 Interrupt Flag Is Set
   else if(PIR1bits.TMR1IF){
     //Clear Timer1 Overflow Flag Bit
     bit_counter = 0;
     PIR1bits.TMR1IF = 0;
   }
   INTCONbits.GIE = 1;
 }


Comme vous pouvez le voir dans le code ci-dessus, la capture interrompre scanner le code et Minuteur1 d'interruption utilisés ensemble pour fournir une "capture" 8-bit, comme Nous n'avons pas besoin start, stop bits, et les bits de parité.
Comme le montre la vidéo ci-dessus, l'appareil fonctionne parfaitement et est affichée par des lettres et des chiffres. La seule chose que je n'ai pas l'affichage comme touches W, N, etc, sur le segment sept afficher à faire ce pas vrai.