Autor Tema: Comunicacion Teclado PS/2 y PIC en ASM  (Leído 9929 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Comunicacion Teclado PS/2 y PIC en ASM
« en: 22 de Enero de 2009, 01:58:36 »
He visto que han hecho esta comunicación, pero en C, creo que RedPic. Lo que yo pretendo aquí es mostrar la comunicación con el teclado PS/2 en ASM, para aquel que tenga que hacerlo le sirva de ayuda.-
Primero voy a dar una pequeña introducción para entender este ejemplo, y además dejo un tutorial bien completo que detalla el protocolo del teclado PS/2.-
Hice dos ejemplos, el primero solo recibe datos del teclado, y lo envía al PC. Mostramos el scan code en un programita hecho en visual, siendo este solo para ver los datos del teclado al pulsar y soltar una tecla  (También se puede usar el Siow). La base esta en lograr capturar el Scan Code con el PIC, así después trabajarlo según sea el uso que se le vaya a dar.-



Download: http://www.mediafire.com/file/m4weqnk0kyn/Teclado_Comunicacion.rar



En el segundo se incluye la comunicación con el teclado para prender los Led de Num Lock, Caps Lock y Scroll Lock, cosa que es un poco más trabajosa.

Hardware necesario:


Tutorial: http://www.mediafire.com/file/g5jm0ukkmgc/TecladoAT-PS2_Interfazyfunciones.rar
« Última modificación: 22 de Enero de 2009, 02:05:08 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Comunicacion Teclado PS/2 y PIC en ASM
« Respuesta #1 en: 22 de Enero de 2009, 02:07:02 »
Introducción 1º parte.-
El teclado esta continuamente rastreando una matriz de teclas en espera de una tecla presionada o soltada por el usuario. Cuando ocurre tal evento, el teclado asigna un único byte (o secuencia de bytes) llamado scan coden a dicha pulsación y lo transmite. Para esta transmisión se usa un protocolo bidireccional síncrono que define un conjunto de especificaciones para las señales de datos y reloj para las transferencias desde el teclado al host y otro conjunto distinto para transferencias del host al teclado.
El protocolo define que en la comunicación siempre es el teclado el responsable de generar la señal de reloj en cualquier caso. La comunicación se realiza con una trama de 11 (o 12) bits:
1 bit de Start, 8 bits de datos, LSB primero, 1 bit de paridad impar, 1 bit de Stop, (1 bit de ACK, solo si el teclado recibe datos)
Datos al host:
Para que el teclado envié datos al host, las líneas de clock y data deben estar libres (nivel alto).
Diagrama de tiempos:


No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Comunicacion Teclado PS/2 y PIC en ASM
« Respuesta #2 en: 22 de Enero de 2009, 02:09:13 »
Código: ASM
  1. ;============================================
  2. ; inf.pic.suky@live.com.ar
  3. ;============================================
  4. list            p=16f877A       ; list directive to define processor
  5. #include        <p16f877A.inc; processor specific variable definitions
  6. __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
  7. ; ////// Oscilador de 20 MHz ////////
  8. ;===============================
  9. ;    Declaración de Registros
  10. ;===============================
  11. W_TEMP                  equ                              0x21   ;registro para guardar temporalmente W
  12. STATUS_TEMP             equ                              0x22   ;registro para guardar temporalmente STATUS
  13. FLAGS                   equ                              0x23   ;registro para guardar las banderas
  14. CONTADOR                equ                              0x24   ;registro para realizar conteo
  15. RDATO                   equ                              0x25   ;registro para guardar dato recibido
  16. RPARIDAD                equ                              0x26   ;registro para guardar el bit paridad
  17. CONT_BIT                equ                              0x27   ;registro para controlar paridad
  18. PDel0                   equ                              0x28   ;registro utilizado para demoras
  19. PDel1                   equ                              0x29   ;registro utilizado para demoras
  20. PDel2                   equ                              0x2A   ;registro utilizado para demoras
  21. DATORS232               equ                              0x2B   ;
  22. ;===============================
  23. ;               Declaracion de bits
  24. ;===============================
  25. CLOCK           equ                     0 ; Clock siempre será RB0.-
  26. ATDATA          equ                     1 ; Bits definido como Data del Teclado.
  27.  
  28. START           equ                     0   ;si es 1 indica que se produjo el bit start
  29. DATO            equ                     1   ;si es 1 cargamos los 8 bits de datos
  30. PARIDAD         equ                     2   ;si es 1 recibimos paridad
  31. STOP            equ                     3   ;si es 1 se genero el stop
  32. RECEPCION       equ                             4   ;si es 0 se recibe dato desde teclado
  33. ACK                     equ                             5   ;si es 1 se esta en espera del bit ack
  34. ;--------------------------------------------------------
  35. ;===============================
  36. ;                        INICIO
  37. ;===============================
  38.                 org                             0x00
  39.                 goto                    inicio
  40. ;**********************************************
  41.                 org                             0x04
  42.                 goto                    interrupciones
  43. ;===============================
  44. ;               Interrupciones
  45. ;===============================
  46. interrupciones
  47.                 banksel                 STATUS
  48.                 movwf                   W_TEMP
  49.                 swapf                   W_TEMP,1
  50.                 movf                    STATUS,w
  51.                 movwf                   STATUS_TEMP
  52.                 btfsc                   INTCON,INTF     ;Interrupcion por RB0
  53.                 goto                    interrupcion_rb0
  54. ;**********************************************
  55. salida_interrupcion
  56.                 bcf                             INTCON,INTF     ;borra bandera
  57.                 bsf                             INTCON,GIE ;activa interrupcion global
  58.                 movf                    STATUS_TEMP,w
  59.                 movwf                   STATUS
  60.                 swapf                   W_TEMP,w
  61.                 retfie
  62. ;**********************************************
  63. ;Interrupcion por RB0
  64. ;**********************************************
  65. interrupcion_rb0
  66.                 bcf                             INTCON, GIE
  67. ;***********************************************
  68. ;****  RECEPCION DESDE EL TECLADO **************
  69. ;***********************************************
  70. ; determina cual de los 11 bit a recibir
  71.                 btfss                   FLAGS,START    
  72.                 goto                    espera_start
  73.                 btfss                   FLAGS,DATO
  74.                 goto                    cargar_datos
  75.                 btfss                   FLAGS,PARIDAD
  76.                 goto                    espera_paridad
  77.                 goto                    espera_stop
  78. ;***********************************************
  79. espera_start   
  80.                 btfsc                   PORTB,ATDATA ; Testeamos Data del Teclado
  81.                 goto                    salida_interrupcion ; No se genero Start
  82.                 bsf                             FLAGS,START ; se genero el bit start
  83.                 goto                    salida_interrupcion     ;salimos para esperar Dato
  84. ;***********************************************
  85. cargar_datos
  86.                 btfss                   PORTB,ATDATA ;Testeamos Data
  87.                 bcf                             RDATO,7 ; Cargamos un cero en Dato recibido desde Teclado.-
  88.                 btfsc                   PORTB,ATDATA
  89.                 bsf                             RDATO,7 ; Cargamos un uno en Dato recibido dede Teclado
  90. conteo
  91.                 incf                    CONTADOR,1      ;
  92.                 movlw                   d'8'
  93.                 subwf                   CONTADOR,0
  94.                 btfsc                   STATUS,Z        ;Determinamos si se recibio por completo el Dato       
  95.                 goto                    salida_data     ;Si
  96.                 rrf                             RDATO,1         ; No, rotamos y esperamos demás bit's
  97.                 goto                    salida_interrupcion     ;Salimos para esperar proximo bit
  98. salida_data                            
  99.                 clrf                    CONTADOR        ;ya se cargaron los 8 bits
  100.                 bsf                             FLAGS,DATO
  101.                 goto                    salida_interrupcion     ;salimos para espera bit de paridad
  102. ;***********************************************
  103. espera_paridad                 
  104.                 btfss                   PORTB,ATDATA ; Detectamos paridad del Dato enviado
  105.                 bcf                             RPARIDAD,0       ;
  106.                 btfsc                   PORTB,ATDATA                   
  107.                 bsf                             RPARIDAD,0
  108.                 bsf                             FLAGS,PARIDAD   ;Indicamos que se recibio Paridad
  109.                 goto                    salida_interrupcion     ;Salimos para esperar Stop
  110. ;***********************************************
  111. espera_stop                    
  112.                 bsf                             FLAGS,STOP      ;Se recibio por completo el Dato--> Star, Dato, Paridad y Stop.-
  113.                 goto                    salida_interrupcion
  114.  
  115.  
  116. ;=========================================
  117. ;                       PRINCIPAL
  118. ;=========================================
  119. inicio 
  120. ;       configuracion de puertos       
  121.                 banksel                 TRISB
  122.                 movlw                   b'00000011'     ; RB0 --> Clck, RB1 --> DATA
  123.                 movwf                   TRISB
  124.                 movlw                   b'10000000' ;configura RS232
  125.                 movwf                   TRISC
  126.                 bcf                             OPTION_REG,7            ; habilitamos pull_ups al puerto B, Porque el teclado tiene sus pines a colector abierto.-
  127.                 bcf                     OPTION_REG,INTEDG     ;interrupción RB0 por flanco descendente
  128. ;**********************************************
  129. ; CONFIGURACION PUERTO SERIE
  130.                 movlw                   0x04
  131.                 movwf                   TXSTA ;configura modo asincrono, baud rate de alta velocidad
  132.                 movlw                   0x81 ;configura velocidad a 9600 baudios.-
  133.                 movwf                   SPBRG
  134.                 call                    demora_150ms
  135.                 call                    demora_150ms
  136.                 bsf                     INTCON,GIE    ;activar habilitador general de interrupciones.
  137.                 bsf                     INTCON,INTE   ;activar interrupción por RB0.
  138. ; activar recepcion transmision
  139.                 banksel                 RCSTA
  140.                 bsf                             RCSTA,SPEN ;habilitacion puerto serie
  141.                 banksel                 TXSTA
  142.                 bsf                     TXSTA,TXEN ; habilita transmision
  143.                 banksel                 PORTB
  144.                 clrf                    RDATO             ;Reseteamos Bytes de Control.-               
  145.                 clrf                    RPARIDAD
  146.                 clrf                    CONTADOR
  147.                 clrf                    FLAGS
  148.                 bcf             PORTC,0
  149.                 bcf             PORTC,1
  150.                 bcf             PORTC,2
  151.                 bsf                             PORTC,0
  152. ;**********************************************
  153. ;//////////////////////////////////////////////////////////////////////
  154. espera_dato
  155.                 btfss                   FLAGS,STOP              ; Testeamos si ha llegado Dato desde el Teclado.-
  156.                 goto                    espera_dato             ; No
  157.                 clrf                    FLAGS                   ; Si
  158.                 bsf             PORTC,1
  159. ;Enviamos Dato recibido por el Teclado a la PC por Usart.-
  160.                 banksel                 TXSTA           ; Banco 1
  161. Esp     btfss                   TXSTA,TRMT  ; chequea si esta listo
  162.                 goto                    Esp                     ; Esperamos  a que se desocupe.-
  163.                 banksel                 TXREG           ; Banco 0
  164.                 bsf             PORTC,2
  165.                 movfw                   RDATO           ; enviamos Dato del teclado a PC
  166.                 movwf                   TXREG           ; envia caracter
  167.                 goto                    espera_dato
  168. ;===============================
  169. ;                       Subrutinas
  170. ;===============================
  171. ;***********************************************               
  172. ;                               Demoras
  173. ;***********************************************
  174. demora_35us
  175.                 movlw                   .7      
  176.                 movwf                   PDel0    
  177. PLoop0
  178.                 nop        
  179.                 decfsz                  PDel0, 1
  180.                 goto                    PLoop0    
  181. PDelL1
  182.                 goto                    PDelL2        
  183. PDelL2  
  184.                 return        
  185. ;***********************************************    
  186. demora_125us           
  187.                 movlw                   .30      
  188.                 movwf                   PDel0    
  189. PLoop0_125
  190.                 nop          
  191.                 decfsz                  PDel0, 1  
  192.                 goto                    PLoop0_125    
  193.                 return                  
  194. ;***********************************************       
  195. demora_150ms
  196.                 movlw                   .117    
  197.                 movwf                   PDel0    
  198. PLoop0_
  199.                 movlw                   .213      
  200.                 movwf                   PDel1    
  201. PLoop1_  
  202.                 movlw                   .1    
  203.                 movwf                   PDel2    
  204. PLoop2_  
  205.                 nop                    
  206.                 decfsz                  PDel2, 1  
  207.                 goto                    PLoop2_    
  208.                 decfsz                  PDel1,  1
  209.                 goto                    PLoop1_  
  210.                 decfsz                  PDel0,  1
  211.                 goto                    PLoop0_    
  212. PDelL1_
  213.                 goto                    PDelL2_        
  214. PDelL2_  
  215.                 nop                    
  216.                 return      
  217.  
  218. ;************************************************
  219.                 end
« Última modificación: 23 de Enero de 2009, 11:22:30 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Comunicacion Teclado PS/2 y PIC en ASM
« Respuesta #3 en: 22 de Enero de 2009, 02:12:30 »
Para la transmision al teclado el protoclo es el siguiente:
Recepción de datos desde el host.-
Una vez que el host tiene los datos a enviar, realiza la siguiente secuencia:
•   Pone la línea clock a nivel bajo al menos 60 us
•   Activa “Request To Send”, poniendo la línea data a nivel bajo
•   Cuando el host esta listo para enviar datos, libera la línea de clock.


El host cambia los datos en el nivel bajo del pulso de reloj, y debe mantenerlos constantes durante el nivel alto del pulso de reloj. Una vez enviados los 8 bits y la paridad, el host pone la línea data a nivel alto (Stop) dejando libre la línea de clock, y el teclado genera un bit de ack.
Set/Reset de Led indicadores:
El host debe enviar el comando 0xED, el teclado contesta con un byte ACK (0xFA), interrumpe el rastreo de teclas y espera un byte de argumento que envía el host. Byte de argumento:



Hay más comandos que pueden ser enviados al Teclado, descriptos en el PDF anteriormente adjuntado.-
El programita hecho en visual manda este byte de argumento, indicándole al PIC que Led prender o apagar.-
No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Comunicacion Teclado PS/2 y PIC en ASM
« Respuesta #4 en: 22 de Enero de 2009, 02:16:07 »
Código: ASM
  1. ;============================================
  2. ; inf.pic.suky@live.com.ar
  3. ;============================================
  4. list            p=16f877A       ; list directive to define processor
  5. #include        <p16f877A.inc; processor specific variable definitions
  6. __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
  7.  
  8. ;===========================================
  9. ;                  Declaración de Registros
  10. ;===========================================
  11. W_TEMP                          equ                              0x21   ;registro para guardar temporalmente W
  12. STATUS_TEMP                     equ                              0x22   ;registro para guardar temporalmente STATUS
  13. FLAGS                           equ                              0x23   ;registro para guardar las banderas
  14. CONTADOR                        equ                              0x24   ;registro para realizar conteo
  15. RDATO                           equ                              0x25   ;registro para guardar dato recibido
  16. RPARIDAD                        equ                              0x26   ;registro para guardar el bit paridad
  17. CONT_BIT                        equ                              0x27   ;registro para controlar paridad
  18. PDel0                           equ                              0x28   ;registro utilizado para demoras
  19. PDel1                           equ                              0x29   ;registro utilizado para demoras
  20. PDel2                           equ                              0x2A   ;registro utilizado para demoras
  21. DATORS232                       equ                              0x2B   ;Registro utilizado para almacenar dato enviado por la PC
  22. TEMP_RDATO                      equ                              0x2C   ;registro para cargar el registro RDATO temporalmente
  23. ;===============================
  24. ;               Declaracion de bits
  25. ;===============================
  26. CLOCK                   equ             0 ; Clock siempre será RB0.-
  27. ATDATA                  equ     1 ; Bits definido como Data del Teclado.
  28. ; FLAGS--> [KBHIT, ACK, RECEPCION, KBHIT_AT, PARIDAD, DATO, START]
  29. START           equ     0   ;si es 1 indica que se produjo el bit start
  30. DATO            equ     1   ;si es 1 cargamos los 8 bits de datos
  31. PARIDAD         equ     2   ;si es 1 recibimos paridad
  32. KBHIT_AT        equ     3   ;si es 1 se genero el stop
  33. RECEPCION               equ             4   ;si es 0 se recibe dato desde teclado
  34. ACK                             equ             5   ;si es 1 se esta en espera del bit ack
  35. KBHIT                   equ             6       ;si es 1 llego dato de Usart.-
  36. ;--------------------------------------------------------
  37.  
  38. ;===============================
  39. ;           INICIO
  40. ;===============================
  41.                 org                             0x00
  42.                 goto                    inicio
  43. ;**********************************************
  44.                 org                             0x04
  45.                 goto                    interrupciones
  46. ;===============================
  47. ;               Interrupciones
  48. ;===============================
  49. interrupciones
  50.                 banksel                 STATUS
  51.                 movwf                   W_TEMP          ;Guardamos temporalmente W
  52.                 swapf                   W_TEMP,1
  53.                 movf                    STATUS,w        ;Guardamos temporalmente STATUS
  54.                 movwf                   STATUS_TEMP
  55.                 btfsc                   INTCON,INTF             ;Interrupcion por RB0
  56.                 goto                    interrupcion_rb0
  57.                 btfsc                   PIR1,RCIF                       ;Interrupcion USART
  58.                 goto                    interrupcion_rx
  59. ;**********************************************
  60. salida_interrupcion
  61.                 bcf                             INTCON,INTF     ;borra banderas
  62.                 bcf                             PIR1,RCIF
  63.                 bsf                             INTCON,GIE ;activa interrupcion global
  64.                 movf                    STATUS_TEMP,w
  65.                 movwf                   STATUS
  66.                 swapf                   W_TEMP,w
  67.                 retfie
  68. ;**********************************************
  69. ;Interrupcion por RB0
  70. ;**********************************************
  71. interrupcion_rb0
  72.                 bcf                             INTCON,GIE      ; Desactiva interrupciones.-
  73.                 btfsc                   FLAGS,RECEPCION ;determina si es transmision o recepcion
  74.                 goto                    transmision
  75. ;***********************************************
  76. ;****  RECEPCION DESDE EL TECLADO **************
  77. ;***********************************************
  78. ; determina cual de los 11 bit a recibir
  79.                 btfss                   FLAGS,START    
  80.                 goto                    espera_start
  81.                 btfss                   FLAGS,DATO
  82.                 goto                    cargar_datos
  83.                 btfss                   FLAGS,PARIDAD
  84.                 goto                    espera_paridad
  85.                 goto                    espera_stop
  86. ;***********************************************
  87. espera_start   
  88.                 btfsc                   PORTB,ATDATA ; Testeamos Data del Teclado
  89.                 goto                    salida_interrupcion ; No se genero Start
  90.                 bsf                             FLAGS,START ; se genero el bit start
  91.                 goto                    salida_interrupcion     ;salimos para esperar Dato
  92. ;***********************************************
  93. cargar_datos
  94.                 btfss                   PORTB,ATDATA ;Testeamos Data
  95.                 bcf                             RDATO,7 ; Cargamos un cero en Dato recibido desde Teclado.-
  96.                 btfsc                   PORTB,ATDATA
  97.                 bsf                             RDATO,7 ; Cargamos un uno en Dato recibido dede Teclado
  98. conteo
  99.                 incf                    CONTADOR,1      ;
  100.                 movlw                   d'8'
  101.                 subwf                   CONTADOR,0
  102.                 btfsc                   STATUS,Z        ;Determinamos si se recibio por completo el Dato       
  103.                 goto                    salida_data     ;Si
  104.                 rrf                             RDATO,1         ; No, rotamos y esperamos demás bit's
  105.                 goto                    salida_interrupcion     ;Salimos para esperar proximo bit
  106. salida_data                            
  107.                 clrf                    CONTADOR        ;ya se cargaron los 8 bits
  108.                 bsf                             FLAGS,DATO
  109.                 goto                    salida_interrupcion     ;salimos para espera bit de paridad
  110. ;***********************************************
  111. espera_paridad                 
  112.                 btfss                   PORTB,ATDATA ; Detectamos paridad del Dato enviado
  113.                 bcf                             RPARIDAD,0       ;
  114.                 btfsc                   PORTB,ATDATA                   
  115.                 bsf                             RPARIDAD,0
  116.                 bsf                             FLAGS,PARIDAD   ;Indicamos que se recibio Paridad
  117.                 goto                    salida_interrupcion     ;Salimos para esperar Stop
  118. ;***********************************************
  119. espera_stop                    
  120.                 bsf                             FLAGS,KBHIT_AT  ;Se recibio por completo el Dato--> Star, Dato, Paridad y Stop.-
  121.                 goto                    salida_interrupcion
  122. ;***********************************************
  123. ;***** TRANSMISION AL TECLADO *******
  124. ;***********************************************
  125. ;______________________________________________________________
  126. ;¨¨|___|¨¨|_|¨¨|_|¨¨|_|¨¨|_|¨¨|_|¨¨|_|¨¨|_|¨¨|_|¨¨|_|¨¨|_|¨¨|_|¨¨|_|¨¨¨¨¨¨   teclado.-          |
  127. ;¨¨¨¨¨|____|¨¨¨¨|¨¨¨¨¨|¨¨¨¨|¨¨¨¨¨|¨¨¨¨|¨¨¨¨|¨¨¨¨¨|¨¨¨¨|¨¨¨¨¨|¨¨¨¨|___|¨¨¨¨¨¨   micro.-                   |
  128. ;        start   0     1    2    3     4    5     6     7    P    s   ack                                               |
  129. ;______________________________________________________________ |
  130. transmision            
  131. ;En nivel del bit a enviar debe estar estable cuando el reloj esta a nivel alto.-
  132. ;El bits se carga al generarse el flanco descendente del clock.-
  133. ;transmision de dato
  134.                 bcf                             INTCON,GIE      ; Desactiva interrupciones.-
  135.                 movfw                   CONTADOR        ;Contador controla que bit enviar al Teclado.-
  136.                 sublw                   d'7'            ;w = 7 - CONTADOR
  137.                 btfss                   STATUS,C
  138.                 goto                    envio_paridad   ;Se enviaron los 8 bit's del Dato, Pasamos a paridad.-
  139.                 btfss                   RDATO,0                 ;testeamos que enviar...
  140.                 bcf                             PORTB,ATDATA    ;Reseteamos DATA del Teclado.-
  141.                 btfsc                   RDATO,0                
  142.                 bsf                             PORTB,ATDATA    ;Setemoas DATA del Teclado.-
  143.                 rrf                             RDATO,f                 ;Rotamos Data a enviar para el proximo bit a enviar.-
  144.                 goto                    incf_contador   ;
  145. ;**********************************************
  146. ;transmision de paridad
  147. envio_paridad
  148.                 movfw                   CONTADOR        ;Contador controla que bit enviar al Teclado.-
  149.                 sublw                   d'8'
  150.                 btfss                   STATUS,C
  151.                 goto                    envio_stop      ;Ya se envio Paridad, enviamos Stop.-
  152.                 btfss                   RPARIDAD,0      ;enviamos paridad segun como se halla determinado anteriormente.-
  153.                 bcf                             PORTB,ATDATA    ;Reseteamos Data, bits paridad = 0.-
  154.                 btfsc                   RPARIDAD,0
  155.                 bsf                             PORTB,ATDATA    ;Seteamos Data, bit paridad =1.-
  156.                 goto                    incf_contador
  157. ;**********************************************
  158. ;transmision de stop
  159. envio_stop
  160.                 movfw                   CONTADOR        ;Contador controla que bit enviar al Teclado.-
  161.                 sublw                   d'9'
  162.                 btfss                   STATUS,C
  163.                 goto                    espera_bit_ack  ;Ya se envio Stop, esperamos ack.-
  164.                 banksel                 TRISB                   ;Enviamos Stop, colocamos a nivel alto Data.-
  165.                 bsf                             TRISB,ATDATA    ; Liberamos DATA del Teclado.-
  166.                 bcf                             OPTION_REG,7    ;habilita pull-up portb
  167.                 banksel                 PORTB
  168.                 goto                    incf_contador
  169. ;**********************************************                
  170. ;espera de ack
  171. espera_bit_ack
  172.                 movfw                   CONTADOR        ;Contador controla que bit enviar al Teclado.-
  173.                 sublw                   d'11'
  174.                 btfss                   STATUS,C       
  175.                 goto                    incf_contador   ; Se recibe Ack, lo ignoramos.-
  176.                 clrf                    CONTADOR
  177.                 bcf                             FLAGS,RECEPCION ; Indicamos que ya se ha enviado Dato al Teclado.-
  178.                 goto                    salida_interrupcion
  179. ;**********************************************
  180. incf_contador
  181.                 incf                    CONTADOR,f              ; Incrementa Contador, el cual controla el bit a enviar.-
  182.                 goto                    salida_interrupcion     ; Salimos para esperar proximo clock.-
  183. ;***********************************************
  184. ; ***** Se recibe Dato por Usart ***************
  185. ;***********************************************
  186. interrupcion_rx
  187.                 bcf                             INTCON,GIE      ; Desactiva interrupciones.-
  188.                 btfss                   PIR1,RCIF ;se espera que cargue dato
  189.                 goto                    $-1
  190.                 movf                    RCREG,w         ;Copiamos dato recibido a DATORS232
  191.                 movwf                   DATORS232
  192.                 bsf                             FLAGS,KBHIT     ; Indicamos que ha llegado un dato.-
  193.                 goto                    salida_interrupcion
  194.  
  195.  
  196.  
  197. ;***********************************************
  198.  
  199.  
  200. ;=========================================
  201. ;                       PRINCIPAL
  202. ;=========================================
  203. inicio 
  204. ;       configuracion de puertos       
  205.                 banksel                 TRISB
  206.                 movlw                   b'00000011'     ; RB0 --> Clck, RB1 --> DATA
  207.                 movwf                   TRISB
  208.                 movlw                   b'10000000' ;configura RS232
  209.                 movwf                   TRISC
  210.                 bcf                             OPTION_REG,7            ; habilitamos pull_ups al puerto B, Porque el teclado tiene sus pines a colector abierto.-
  211.                 bcf                     OPTION_REG,INTEDG     ;interrupción RB0 por flanco descendente
  212. ;**********************************************
  213. ; CONFIGURACION PUERTO SERIE
  214.                 movlw                   0x04
  215.                 movwf                   TXSTA ;configura modo asincrono, baud rate de alta velocidad
  216.                 movlw                   0x81 ;configura velocidad a 9600 baudios para 20 MHz.-
  217.                 movwf                   SPBRG
  218.                 call                    demora_150ms
  219.                 call                    demora_150ms
  220.                 bsf                     INTCON,GIE    ;activar habilitador general de interrupciones.
  221.                 bsf                             INTCON,PEIE ;habilitacion de interrupciones por perifericos
  222.                 bsf                     INTCON,INTE   ;activar interrupción por RB0.
  223.                 bsf                             PIE1,RCIE ;habilita interrupcion de puerto serie para recepcion
  224. ; activar recepcion transmision
  225.                 banksel                 RCSTA
  226.                 bsf                             RCSTA,SPEN ;habilitacion puerto serie
  227.                 bsf                             RCSTA,CREN      ;habilita recepcion
  228.                 banksel                 TXSTA
  229.                 bsf                     TXSTA,TXEN ; habilita transmision
  230.                 banksel                 PORTB
  231. ;Reseteamos Bytes de Control.-         
  232.                 clrf                    RPARIDAD
  233.                 clrf                    CONTADOR
  234.                 clrf                    FLAGS
  235. ;**********************************************
  236. ;//////////////////////////////////////////////
  237. espera_dato
  238.                 btfsc                   FLAGS,KBHIT_AT  ; Testeamos si ha llegado Dato desde el Teclado.-
  239.                 goto                    envia_a_PC              ; Si, eviamos dato a PC
  240.                 btfsc                   FLAGS,KBHIT             ; No, testeamos si llego dato desde PC.-
  241.                 goto                    comunicacion_con_teclado        ; si, nos comunicamos con el teclado.-
  242.                 goto                    espera_dato             ;bucle infinito
  243. ;***********************************************
  244. ;Enviamos Dato recibido por el Teclado a la PC por Usart.-
  245. envia_a_PC
  246.                 clrf                    FLAGS           ; Borramos controles para recibir de nuevo
  247.                 banksel                 TXSTA           ; Banco 1
  248.                 btfss                   TXSTA,TRMT  ; chequea si esta listo
  249.                 goto                    $-1                     ; Esperamos  a que se desocupe.-
  250.                 banksel                 TXREG           ; Banco 0
  251.                 movfw                   RDATO           ; enviamos Dato del teclado a PC
  252.                 movwf                   TXREG           ; envia caracter
  253.                 goto                    espera_dato
  254. ;************************************************
  255. comunicacion_con_teclado
  256. ; Enviamos peticion de control de leds--> 0xED y luego el dato de control de leds enviado
  257. ; por la PC ([0,0,0,0,0, Caps, Num, Scroll])
  258.                 clrf                    FLAGS   ; Borramos controles para recibir de nuevo
  259.                 movlw                   0xED    ; Comando de control de leds
  260.                 movwf                   RDATO   ; Dato a enviar al Teclado
  261.                 call                    determino_paridad       ; se determina paridad del dato a enviar.-
  262.                 call                    config_envia_dato       ; se configura para enviar y se trasmite el dato.-
  263.                 btfss                   FLAGS,KBHIT_AT  ; espero a que se reciba ACK desde el teclado.-
  264.                 goto                    $-1
  265.                 clrf                    FLAGS   ; Borramos controles para recibir de nuevo
  266.                 movlw                   0xFA    ;verificamos si es un ACK
  267.                 subwf                   RDATO,w
  268.                 btfss                   STATUS,Z
  269.                 goto                    espera_dato     ;No se recibio ACK,
  270.                 movfw                   DATORS232       ;enviamos a teclado el byte recibido por Usart
  271.                 movwf                   RDATO
  272.                 call                    determino_paridad
  273.                 call                    config_envia_dato       ; se configura para enviar y se trasmite el dato.-
  274.                 btfss                   FLAGS,KBHIT_AT  ; espero a que se reciba ACK desde el teclado.-
  275.                 goto                    $-1
  276.                 clrf                    FLAGS   ; Borramos controles para recibir de nuevo
  277.                 goto                    espera_dato
  278. ;===============================
  279. ;                       Subrutinas
  280. ;===============================
  281. ;****************************************************
  282. ;Rutinas para transmision de Micro a teclado
  283. ;****************************************************
  284. ;determina paridad del registro RDATO para envio al teclado
  285. ; Si el nro de 1 de RDATO es par, RPARIDAD = 1.-
  286. determino_paridad
  287.                 movfw                   RDATO
  288.                 movwf                   TEMP_RDATO
  289.                 movlw                   0x08
  290.                 movwf                   CONTADOR
  291.                 clrf                    CONT_BIT
  292. bucle_0
  293.                 btfsc                   TEMP_RDATO,0
  294.                 incf                    CONT_BIT
  295.                 rrf                             TEMP_RDATO
  296.                 decfsz                  CONTADOR
  297.                 goto                    bucle_0
  298.                 bcf                             RPARIDAD,0
  299.                 btfss                   CONT_BIT,0
  300.                 bsf                             RPARIDAD,0
  301.                 return
  302. ;***********************************************
  303. ;configura para establecer comunicacion con el teclado, envia dato y espera bit ack
  304. config_envia_dato
  305.                 clrf                    CONTADOR
  306.                 bsf                             FLAGS,RECEPCION ;es para transmision.
  307.                 bcf                     INTCON,INTE           ;desactivar interrupción por rb0.
  308.                 banksel                 TRISB
  309.                 clrf                    TRISB   ;configuro como salida
  310.                 banksel                 PORTB
  311.                 bcf                             PORTB,CLOCK     ;clock=0, data=1
  312.                 bsf                             PORTB,ATDATA
  313.                 call                    demora_35us
  314.                 bcf                             PORTB,CLOCK     ;clock=0, data=0
  315.                 bcf                             PORTB,ATDATA
  316.                 call                    demora_125us
  317.                 banksel                 TRISB
  318.                 bsf                             TRISB,CLOCK     ;configura RB0 como entrada
  319.                 bcf                             OPTION_REG,7            ; habilitamos pull_up al puerto B
  320.                 banksel                 PORTB
  321.                 bcf                             PORTB,ATDATA
  322.                 bcf                             INTCON,INTF
  323.                 bsf                     INTCON,INTE           ;activar interrupción por rb0.
  324.                 btfsc                   FLAGS,RECEPCION         ;verifica si se ha enviado el dato     
  325.                 goto                    $-1                                     ; no
  326.                 clrf                    FLAGS   ; Borramos controles para recibir de nuevo
  327.                 return
  328.  
  329. ;***********************************************               
  330. ;                               Demoras
  331. ;***********************************************
  332. demora_35us
  333.                 movlw                   .7      
  334.                 movwf                   PDel0    
  335. PLoop0
  336.                 nop        
  337.                 decfsz                  PDel0, 1
  338.                 goto                    PLoop0    
  339. PDelL1
  340.                 goto                    PDelL2        
  341. PDelL2  
  342.                 return        
  343. ;***********************************************    
  344. demora_125us           
  345.                 movlw                   .30      
  346.                 movwf                   PDel0    
  347. PLoop0_125
  348.                 nop          
  349.                 decfsz                  PDel0, 1  
  350.                 goto                    PLoop0_125    
  351.                 return                  
  352. ;***********************************************       
  353. demora_150ms
  354.                 movlw                   .117    
  355.                 movwf                   PDel0    
  356. PLoop0_
  357.                 movlw                   .213      
  358.                 movwf                   PDel1    
  359. PLoop1_  
  360.                 movlw                   .1    
  361.                 movwf                   PDel2    
  362. PLoop2_  
  363.                 nop                    
  364.                 decfsz                  PDel2, 1  
  365.                 goto                    PLoop2_    
  366.                 decfsz                  PDel1,  1
  367.                 goto                    PLoop1_  
  368.                 decfsz                  PDel0,  1
  369.                 goto                    PLoop0_    
  370. PDelL1_
  371.                 goto                    PDelL2_        
  372. PDelL2_  
  373.                 nop                    
  374.                 return      
  375.  
  376. ;************************************************
  377.                 end


Bueno espero que le sirva a alguien... Saludos!  :-/
« Última modificación: 23 de Enero de 2009, 11:25:24 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado jmcs87

  • PIC10
  • *
  • Mensajes: 44
Re: Comunicacion Teclado PS/2 y PIC en ASM
« Respuesta #5 en: 22 de Enero de 2009, 19:00:12 »
genial gusto lo que necesitaba para mi panel de leds ....................gracias Suky  estare chequeando  tu ejemplo :D :D :-/ :-/

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Comunicacion Teclado PS/2 y PIC en ASM
« Respuesta #6 en: 25 de Enero de 2009, 16:54:27 »
nada mal, muchas gracias, lastima que es en ASM :(

pero igual la teoría sirve :-/
.

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Comunicacion Teclado PS/2 y PIC en ASM
« Respuesta #7 en: 07 de Mayo de 2009, 08:56:34 »
Mil gracias Suky, tus  valiosas explicaciones sobre ASM y estos ejemplos me han ayudado mucho.
Mil gracias.

Saludos

Desconectado ElectroVolt

  • PIC10
  • *
  • Mensajes: 22
Re: Comunicacion Teclado PS/2 y PIC en ASM
« Respuesta #8 en: 19 de Junio de 2013, 15:44:26 »
´wow muchas gracias por el aporte :)
eres un capo! :D


 

anything