Último mensaje de la página anterior:
Espero que con esta ya vaya la vencida...1) Rediseño del circuito.
a - En vez de usar el PIC16F84, vamos a emplear el PIC16F88, a nivel práctico es casi el mismo, pero ganamos en 3 Entradas/Salidas para futuros usos y no dependemos de la parafernalia del oscilador.
b -Añado también un conmutador para seleccionar "qué" vamos a usar, el teclado original del PCW o el Joystick. Ahora tanto el teclado como el joy estarán enviando de continuo las señales, para evitar cualquier tipo de error, la solución más sencilla suele ser la más acertada... Quedan también eliminados los diodos, ya que carecen de sentido ahora.
c - Eliminado el "Reset". Carecía de sentido...
2) Reprogramación del PIC
Ahora el programa queda en bloques de la siguiente manera para poder implementar los cambios de hardware:
[Poner reloj a 8 MHz] - Frecuencia máxima del oscilador interno
[Definición de variables]
[Lectura del estado del Joystick]
[Escritura de los datos en el Puerto A, bit 3]
[Volver a la lectura]
No hay una subrutina que envíe, como siempre lo hace, lo incluimos en el programa principal
3) Queda pendiente el anti-rebote. Quería probarlo primero antes de diseñar un PCB para ello, ya que "puede" que no afecte, por la baja velocidad del reloj del teclado (16 KHz) y la baja actualización de los juegos en el PCW (Es bastante lentilla)
Como se ve en la imagen que adjunto del reloj, antes de cada envío de 12 bits, los 4 de dirección y los 8 de datos, el teclado hace un doble ciclo a 0 de 12 microsegundos. En el programa está implementado también justo antes de que envíe el Bit0 de la dirección.
Como en los casos (fracasados) anteriores, he comentado el código, también escrito en Basic, para que sea más fácil leerlo e interpretarlo.
Adjunto al post, un archivo RAR con el fuente basic, el HEX compilado y el PDF del circuito.
***************************************************
CIRCUITO:

***************************************************
CÓDIGO:
Código: Seleccionar todo
'*******************************************
'* PCW PIC Joystick ************************
'* by daquena / SEP 5 2011 *****************
'*******************************************
'Rev 1.0 - Código original
'Rev 1.1 - Coregido reloj del PCW con cistral de 4 Mhz
'- Añadida entrada "reloj" en PORTB.0
'Rev 1.2 - Envía el chorizo de datos continuamente, los 16 grupos
'Señales del teclado, con su bit y su dirección
'TECLA "A" Bit 5 de la dirección 8
'TECLA "Q" Bit 3 de la dirección 8
'TECLA "O" Bit 2 de la dirección 4
'TECLA "P" Bit 3 de la dirección 3
'TECLA "SPC" Bit 7 de la dirección 5
'TECLA "ARRIBA" Bit 6 de la dirección 1
'TECLA "ABAJO" Bit 6 de la dirección A
'TECLA "IQUIERDA" Bit 7 de la dirección 1
'TECLA "DERECHA" Bit 6 de la dirección 0
Define CLOCK_FREQUENCY = 8
Dim arriba As Bit 'Pulsaciones, en este caso ARRIBA en el Joy
Dim abajo As Bit
Dim izda As Bit
Dim dere As Bit
Dim fuego As Bit
Dim tipo As Bit '0 simula "opera" 1 simula flechas
'Ahora vamos ausar un byte para cada grupo que se envía según la tabla de arriba
'son los grupos 8, 4, 3, 5, 1, A y 0
Dim dato_8 As Byte 'El dato a enviar (GRUPO "0x8"), cada bit tiene un sentido
Dim dato_4 As Byte
Dim dato_3 As Byte
Dim dato_5 As Byte
Dim dato_1 As Byte
Dim dato_10 As Byte 'el grupo "0xA"
Dim dato_0 As Byte
Dim reloj As Bit 'detección del pulso del reloj
'Un ciclo de reloj del PIC son 0,25 microsegundos,
'el del PCW 50 microsegundos... tenemos 200 ciclos para operar
TRISB = 255 'ponemos el puerto b como lectura
TRISA.3 = 0 'y el bit 3 del A como escritura
PORTA.3 = 1 'ponemos la salida a 1 portb.3 en 1
'********************************************
'** PROGRAMA PRINCIPAL **********************
'********************************************
loop: 'Inicio de un bucle infinito
arriba = PORTB.1 'Leemos el Joy
abajo = PORTB.2
izda = PORTB.3
dere = PORTB.4
fuego = PORTB.5
tipo = PORTB.7
'Ahora ponemos el estado que corresponda, pero al contrario.
'El estado lógico en reposo de una tecla es "1" pasa a "0" cuando se pulsa
'Escaneamos siempre el joy y luego al final enviamos el choorizo
If tipo = 0 Then 'Si el tipo es "OPERA"
dato_8.5 = Not abajo
dato_8.3 = Not arriba
dato_4.2 = Not izda
dato_3.3 = Not dere
dato_5.7 = Not fuego
Else 'es un tipo "FLECHAS"
dato_10.6 = Not abajo
dato_1.6 = Not arriba
dato_1.7 = Not izda
dato_0.6 = Not dere
dato_5.7 = Not fuego
Endif
'*************************************************************************
'A enviar el chorizo de 16 grupos y 12 bits (192 bits) al ciclo del reloj del PCW
Dim ind_grupo As Byte
Dim dato_temp As Byte 'Lo usamos para el ciclo
reloj = 1 'Ponemos la referencia del reloj a 1
For ind_grupo = 0 To 16
'PRimero, antes de enviar los 12 bits, necesitamos hacer una sincronización.
'de 1 pasa a 0 durante 12uS, luego a 1 otros 12uS, y finalmente a 0 12uS más para pasar a 1 de nuevo
'----_-_-----
PORTA.3 = 0
WaitUs 12
PORTA.3 = 1
WaitUs 12
PORTA.3 = 0
WaitUs 12
PORTA.3 = 1
'Comenzamos a enviar datos
While reloj = 1 'Mientras que el relos esté en 1 esperamos...
reloj = PORTB.0 'Comprobamos que esté en 1, cuando lea que es 0 termina el bucle
Wend 'podemos enviar el dato
PORTA.3 = ind_grupo.0 'Enviamos el dato, en este caso, el bit menos sig del grupo que estamos
reloj = 1 'ponemos la referencia del reloj a 1 para el siguiente dato
WaitUs 14 'esperamos a que el reloj se vuelva a poner a 1, tarda 12uS, pa librarlo, ponemos 14...
'************
While reloj = 1
reloj = PORTB.0
Wend 'podemos enviar el dato
PORTA.3 = ind_grupo.1
reloj = 1
WaitUs 14
'************
While reloj = 1
reloj = PORTB.0
Wend 'podemos enviar el dato
PORTA.3 = ind_grupo.2
reloj = 1
WaitUs 14
'************
While reloj = 1
reloj = PORTB.0
Wend 'podemos enviar el dato
PORTA.3 = ind_grupo.3
reloj = 1
WaitUs 14
'************
'AHORA A POR LOS DATOS
If ind_grupo = 0 Then dato_temp = dato_0
If ind_grupo = 1 Then dato_temp = dato_1
If ind_grupo = 2 Then dato_temp = 255 'Todos los bits a 1, no lo usamos
If ind_grupo = 3 Then dato_temp = dato_3
If ind_grupo = 4 Then dato_temp = dato_4
If ind_grupo = 5 Then dato_temp = dato_5
If ind_grupo = 6 Then dato_temp = 255
If ind_grupo = 7 Then dato_temp = 255
If ind_grupo = 8 Then dato_temp = dato_8
If ind_grupo = 9 Then dato_temp = 255
If ind_grupo = 10 Then dato_temp = dato_10
If ind_grupo = 11 Then dato_temp = 255
If ind_grupo = 12 Then dato_temp = 255
If ind_grupo = 13 Then dato_temp = 255
If ind_grupo = 14 Then dato_temp = 255
If ind_grupo = 15 Then dato_temp = 255
While reloj = 1
reloj = PORTB.0
Wend 'podemos enviar el dato
PORTA.3 = dato_temp.0
reloj = 1
WaitUs 14
'************
While reloj = 1
reloj = PORTB.0
Wend 'podemos enviar el dato
PORTA.3 = dato_temp.1
reloj = 1
WaitUs 14
'************
While reloj = 1
reloj = PORTB.0
Wend 'podemos enviar el dato
PORTA.3 = dato_temp.2
reloj = 1
WaitUs 14
'************
While reloj = 1
reloj = PORTB.0
Wend 'podemos enviar el dato
PORTA.3 = dato_temp.3
reloj = 1
WaitUs 14
'************
While reloj = 1
reloj = PORTB.0
Wend 'podemos enviar el dato
PORTA.3 = dato_temp.4
reloj = 1
WaitUs 14
'************
While reloj = 1
reloj = PORTB.0
Wend 'podemos enviar el dato
PORTA.3 = dato_temp.5
reloj = 1
WaitUs 14
'************
While reloj = 1
reloj = PORTB.0
Wend 'podemos enviar el dato
PORTA.3 = dato_temp.6
reloj = 1
WaitUs 14
'************
While reloj = 1
reloj = PORTB.0
Wend 'podemos enviar el dato
PORTA.3 = dato_temp.7
reloj = 1
WaitUs 14
'************
Next ind_grupo 'Pasamos al siguiente grupo a enviar
Goto loop 'Volvemos al principio para poder escanear de nuevo el joy en reenviar el chorizo de nuevo
End
*********************************************
FINALMENTE, EL RELOJ:

Pues anda, lo de siempre, a intentar hacer funcionar el chisme.
Saludinos:joystick.rar