Commodore manía foro

Commodore 64 => Programación => Mensaje iniciado por: riq en Diciembre 26, 2016, 07:26:44

Título: UniJoystiCle + mouse/paddles
Publicado por: riq en Diciembre 26, 2016, 07:26:44
Voy poniendo aca info que fuimos discutiendo con @Maniako

- Descripción de como funciona el mouse 1351:
http://www.zimmers.net/anonftp/pub/cbm/documents/projects/interfaces/mouse/Mouse.html
(similar a los que sugirió @pastbytes en el otro hilo)

- Emulador de paddles de Leif Loomquist:
https://github.com/LeifBloomquist/JoystickEmulator/blob/master/Arduino/PaddleEmulator/PaddleEmulator.ino

(ya me dió el Ok para que usemos su código en caso que lo necesitemos... lo vi y creo que es lo que necesitamos más/menos algunas cosillas).


Y aca, estuvo haciendo pruebas con el osciloscopio con los pot-x / pot-y del joy#1 de una C128D NTSC:

(https://s20.postimg.org/jua54euop/New_File3.png) (https://postimg.org/image/jua54euop/)

Tiene un período de 500ms. La documentación dice que el período es de "512 CPU cycles" lo cual es coherente ya que en NTSC un CPU cycle es 1.022727hz


512 /  1.02272 = 500.625... lo cual es muy parecido a 500us.

Debería hacer la prueba en un PAL, pero en teoría el período debería de ser de:
512 / 0.985248 =  519.666 us... o sea unos 20 ms más lento, y es algo a tener en cuenta cuando se emula el mouse... pero según lo leido no debería afectar mucho.

Lo bueno, también, es que ambos POTs (pox y poty) estan sincronizados, y no me extrañaría que los 4 pots (x,y del joy#1 y #2) este también sincronizados. y eso simplificaría el código y circuito un poco.


Bueno, esto es solo el comienzo, invito al que quiera a contribuir/participar/probar/etc...

La idea es hacer que el unijoysticle soporte mouse/paddles/etc.
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: riq en Diciembre 26, 2016, 15:46:58
Probado en 3 máquinas más:

C64C PAL: Período de 520us.  Max V: 1.5V
(https://s20.postimg.org/ns207k6vt/DS1_Z_Quick_Print2.png) (https://postimg.org/image/ns207k6vt/)

C64 Drean: Período de 500us. Max V: 150mv
(https://s20.postimg.org/ihx1g9mmx/DS1_Z_Quick_Print4.png) (https://postimg.org/image/ihx1g9mmx/)

C64 NTSC: Período de 500us. Max V: 150mv
(https://s20.postimg.org/3n8g23d21/DS1_Z_Quick_Print5.png) (https://postimg.org/image/3n8g23d21/)


La C64C PAL, que es "C", tiene el mismo voltage que la c128d ntsc. Va de 0 a 1.5V aprox.
Pero la C64 NTSC y la Drean van de 0 a 150mv. No creo que sea un problema (bah... yo que se), pero es para tener en cuenta cuando se lea.

La otra cosa que noté, es que en las 4 máquinas que probe, no tengo ningun valor del puerto 2. No creo que las 4 máquinas justo tenga roto los dos pots del puerto 2. Y probé cambiando los cables y demás, y no hubo caso.
Por lo que me llevaría a pensar que no es posible usar un mouse 1351 (pero si paddles) en el puerto 2.
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: josepzin en Diciembre 26, 2016, 16:56:16
Según creo desde el puerto 1 se sacan los dos spinners/paddles, o al menos eso recuerdo de cuando estuve mirando el tema.

A ver si estoy haciendo el sinver :P
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: josepzin en Diciembre 26, 2016, 17:06:58
Efectivamente, he dicho una tontería :P

https://www.c64-wiki.com/index.php/Control_Port

Pero no sé porqué pensaba que desde el P1 se podía sacar los dos spinners.
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: riq en Diciembre 26, 2016, 17:48:12
Efectivamente, he dicho una tontería :P

no, el que dijo un tontería fui yo parece.
tengo que habilitar el port #2 para que use el mouse.


 $DC00/56320/CIA1+0:   Data Port A (Keyboard, Joystick, Paddles)

   +----------+---------------------------------------------------+
   | Bits 7-0 |   Write Keyboard Column Values for Keyboard Scan  |
   | Bits 7-6 |   Paddles on: 01 = Port A, 10 = Port B       

por default, esta habilitado el port #1

mañana sigo probando... no se que pasará si uso "%11"... supongo que habilitará ambos ports. y si hago %00 supongo que apagará ambos ports.
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: pastbytes en Diciembre 26, 2016, 18:28:04
Esa habilitacion va directo a los 4016/4066 (nunca me acuerdo cual de los dos usa) para seleccionar entre los dos puertos de joystick, el SID solo lee 2 potenciometros, si vos activas los dos a la vez supongo que leeras una mezcla de todo porque van a estar dos potenciometros en paralelo descargando el capacitor, pero ya no tiene que ver con el SID, es un circuito externo.
Recomiendan esperar un tiempo desde que cambias de puerto hasta que empezas a hacer una lectura.
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: riq en Diciembre 27, 2016, 23:10:55
@pastbytes gracias. buen dato. claro, ahora me va cerrando un poco más la info que fui leyendo.

seguí haciendo pruebas, y al menos, los POTs del joystick se "activan" (reciben voltage para la sincronización) con los bits 6-7 del $DC00.

Con un valor de 64 (joy 1 activado se ve):
(https://s20.postimg.org/b0sfesmhl/DS1_Z_Quick_Print12.png) (https://postimg.org/image/b0sfesmhl/)

Con un valor de 128 (joy 2 activado se ve):
(https://s20.postimg.org/b22d87obd/DS1_Z_Quick_Print13.png) (https://postimg.org/image/b22d87obd/)

Con un valor de 0 (ambos joys desactivados):
(https://s20.postimg.org/bg3p7t8ex/DS1_Z_Quick_Print14.png) (https://postimg.org/image/bg3p7t8ex/)

Con un valor de 192 (ambos joys activados):
(https://s20.postimg.org/wykauuc49/DS1_Z_Quick_Print11.png) (https://postimg.org/image/wykauuc49/)

como hice las pruebas en BASIC, se ve también los POTs de abajo (joy #1) estan prendidos casi todo el tiempo. lo más probable es que el BASIC lo prenda para la lectura del teclado o yo que se.

Amarillo/celeste: POTX/POTY joy #2
Rosa/Azul: POTX/POTY joy #1


¿y que saco de todo esto?
- que el SYNC (falling) puede ser de 150mv a 0v ó de 1.5V a 0v
- que me tengo que colgar tanto el joy#1 y joy#2 para la sync ya que no se de que puerto puede venir.
- pero solo de un pot: ó POTX ó POTY pero no hace falta ambos.
- que en PAL el período es 20us más largo que en NTSC/Drean. Aunque no debería afectar mucho esto.

Título: Re:UniJoystiCle + mouse/paddles
Publicado por: pastbytes en Diciembre 27, 2016, 23:18:56
En realidad si podes saber de que puerto viene, mirando las lineas que activan las llaves, lo que pasa es que esta todo compartido, las 16 lineas de lectura del teclado, 8 de salida (en el puerto 2 de joystick) y las 8 de entrada (en el puerto 1) cambian todo el tiempo, y las señales para activar las llaves de los potenciometros cambian al menos 50/60 veces por segundo cada vez que se lee el teclado.
Pero supongo que te referis a que externamente (para el unijoysticle) no podes saber cual puerto esta seleccionado, pero en realidad si vas a emular deberias hacerlo tal como lo haria un mouse o paddle en la realidad, empezar a contar apenas recibe el pulso de sincronizacion, no interesa si el pulso no es valido, se supone que el soft ya sabe que sale basura por el puerto cuando lee el teclado, asi que no va a tomar como valido lo que el unijoysticle envia, y te va a dejar pasar el pulso como corresponde antes de pedirte una lectura valida.
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: riq en Diciembre 27, 2016, 23:40:41
Pero supongo que te referis a que externamente (para el unijoysticle) no podes saber cual puerto esta seleccionado, pero en realidad si vas a emular deberias hacerlo tal como lo haria un mouse o paddle en la realidad, empezar a contar apenas recibe el pulso de sincronizacion, no interesa si el pulso no es valido, se supone que el soft ya sabe que sale basura por el puerto cuando lee el teclado, asi que no va a tomar como valido lo que el unijoysticle envia, y te va a dejar pasar el pulso como corresponde antes de pedirte una lectura valida.

si, eso mismo. ni bien reciba el pulso de sync (ya sea del puerto 1 ó 2), conecto los 5V con los distintos POTs durante los nano-segundos que sean necesarios para poder simular el valor correcto.
y en caso que no tenga ningún pulso de sync, no pasa nada, ya que entonces la c64 no estaría esperando nada por los POTs.

Título: Re:UniJoystiCle + mouse/paddles
Publicado por: riq en Enero 03, 2017, 03:25:16
progreso:
(https://s20.postimg.org/w32ind4gp/DS1_Z_Quick_Print2.png) (https://postimg.org/image/w32ind4gp/)


que significa eso?

amarillo: la señal enviada por la c64
celeste: el MCU subiendo/bajando un GPIO de acuerdo a la señal de la c64.

estan sincronizadas como ven y eso es bueno... tengo suficiente CPU como para poder sincronizarlas. Lo que tengo que hacer, es depende de cierto valor, alargar o achicar la señal de "arriba".

pero por ahora no estoy haciendo nada con el WiFi... no se si cuando me ponga a parsear paquetes no tenga suficiente CPU.

en ese caso tendré que saltearme algunos frames... todavía tengo que hacer muuuuchas pruebas más.

estoy usando el ESP32 que tiene dos cores... asi que veré si es posible parsear los paquetes en un core, y en el otro manejar los GPIOs que van a la c64.


código:
https://github.com/ricardoquesada/unijoysticle/blob/master/firmware/esp32/main/main.c

estoy usando la API de Espressif directamente, y no la Arduino porque:

- la API Ardunio para ESP32 no funciona bien
- quiero estar lo más cerca posible del "metal" para poder sincronizar bien la cosa.

Y la otra cosa, es que antes había dicho que la c128/c64pal median 1.5v y las c64 NTSC/Drean median 150mv... bueno, lo más probable es que haya tenido mal las sondas / osciloscopio. seguro que alguna estaba en 10x y el otro en 1x o viceversa ya que estuve tocandolos mientras media.
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: riq en Enero 04, 2017, 23:09:23
progreso:

https://youtu.be/DCLmAfhAoH4


puedo controlar al menos un pot por wifi sin que se desincronice... bueno, lo que tengo que hacer es enviar varios paquetes para ver que sucede.

pero es un progreso interesante... al menos pareciera que es factible hacerlo con el esp32.

Título: Re:UniJoystiCle + mouse/paddles
Publicado por: riq en Enero 06, 2017, 00:50:30
hice la prueba conectando todo en la c64, y midiendo el valor del POT desde la c64 y puede tener un valor estable entre 68 y 255.

pero no pude leer valores entre 0 y 68 ya que la interrupción Raising me llega unos ciclos tarde.
La solución es usar Falling (como el ejemplo de Leif Bloomquist). Pero el problema es que la interrupción "Falling" tiene un bug al parecer (o yo estoy usando mal la API) y se dispara tanto en Raising como Falling.

La cosa es que no puedo seguir hasta que no se arregle este bug (o encuentre un workaround) que lo documenté aca:
https://github.com/espressif/esp-idf/issues/199

ah... otra cosa... perdí algunos paquetes UDP. no es bueno eso. tengo que revisar el código.
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: danytoon en Enero 06, 2017, 21:37:42
Riq estás leyendo en Lemon lo que ha hecho este tipo?

http://www.lemon64.com/forum/viewtopic.php?t=63027&highlight=
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: riq en Enero 06, 2017, 23:00:37
no lo había visto.  no vi mucha documentación técnica, pero parece bueno lo que hace.
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: riq en Enero 07, 2017, 18:34:10
le agregué un inversor lógico (un 7404) entre la señal del POT y la entrada al ESP32. Lo hice pensando en:

- Si la señal "falling" no anda, entonces la invierto y leo la señal "rising".
- Como "beneficio" adicional convierte la señal analógica del POT en una digital.

la cosa es que al agregarle el 7404 ahora puedo leer tanto la "falling" como la "rising" sin problemas. Lo que es buenisimo! (asi que el ESP32 tiene un bug al detectar el "falling" de la señal del POT). Pero si la señal es más o menos cuadrado ("digital"), no hay problemas.

asi que ahora todo funciona como quería, salvo que por alguna extraña razón no puedo hacer el condensador del POT cargue cuando quiero... según el osciloscopio estoy haciendo todo bien.
Peroobviamente estoy haciendo mal. hice esta prueba anoche, asi que puede haber puesto algun cable mal o algo.

Título: Re:UniJoystiCle + mouse/paddles
Publicado por: Maniako en Enero 09, 2017, 09:16:07
No conseguí estabilidad alguna haciendo lo mismo que tú.
No tenia problemas a la hora de detectar la señal usando un pull-up que el propio commodore ponia a down en cada ciclo.

Al aplicar el tiempo de carga en la patilla, no sé por qué razón, el commodore seguía leyendo prácticamente todo o nada.
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: riq en Enero 09, 2017, 17:43:50
Al aplicar el tiempo de carga en la patilla, no sé por qué razón, el commodore seguía leyendo prácticamente todo o nada.

Es lo que me esta pasando ahora que estoy usando un 7404 en el medio... lo cual no tiene sentido... Ahora rediseñé un poco como debería conectarse el circuito, conectando las tierras de la c64 y del esp32 y ahora la interrupción se dispara siempre en "raising" y "falling" sin importar que le diga que solo lo haga en raising o falling o ambas... algo mal estoy haciendo, pero creo que debe haber algún temilla con el esp32.

quizas quemé el Sid... yo que se. tengo que seguir haciendo pruebas.
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: Maniako en Enero 09, 2017, 18:32:35

quizas quemé el Sid... yo que se. tengo que seguir haciendo pruebas.

Si solo trabajas con 5V es imposible estropearlo a no ser que cortocircuites los 5V a masa directamente, pero freiras el 7805 u otra cosa , no el SID.


Título: Re:UniJoystiCle + mouse/paddles
Publicado por: pastbytes en Enero 09, 2017, 19:23:09
Yo a fines de los 80s me puse a experimentar con las entradas de potenciometro y seguramente excedi el voltaje permitido porque le mande audio (en esa epoca no tenia herramientas para medir la amplitud de una onda de audio), el tema es que un dia dejo de leer los potenciometros, y despues descubri que por el otro puerto si leia bien, asi que en todo caso ya sabes que lo primero que quemas son los 4066.
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: riq en Enero 09, 2017, 19:58:14
despues descubri que por el otro puerto si leia bien, asi que en todo caso ya sabes que lo primero que quemas son los 4066.

excelente dato. si, creo que lee de uno bien, y no del otro.  la prendo, lee del pot-x y no del pot-y... la vuelvo a prender y al reves.
asi que seguro quemé el 4066.  gracias! (aliviado que no quemé el sid!).



Título: Re:UniJoystiCle + mouse/paddles
Publicado por: riq en Enero 13, 2017, 19:23:36
hice este pequeño circuito anoche y pude hacer que la interrupción de GPIO se genera en "falling"... seeee! (en este caso era "raising" ya que la señal esta invertida por el 7404).

(https://s20.postimg.org/ikwjdtq6x/IMG_5633.jpg) (https://postimg.org/image/ikwjdtq6x/)

pero luego lo modifiqué un poco para simplicarlo, no funcinó, y traté de armarlo otra vez y no me anduvo :(
bueno la cosa es que lo más probable es que al ESP32 le llegue la señal con ruido.

puede ser que sean los cables, el mismo osciloscopio que genere ruido, o alguna otra cosa.
voy a seguir con más pruebas la semana que viene.

@Maniako
que transistor estas usando vos? me gustaría probar con tu diseño para ver si me llega la señal un poco más limpia. gracias!
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: Maniako en Enero 13, 2017, 19:29:41
.
@Maniako
que transistor estas usando vos? me gustaría probar con tu diseño para ver si me llega la señal un poco más limpia. gracias!

Un PNP .
Te lo pasó por watsapp.
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: Maniako en Enero 13, 2017, 20:42:55
He mirado el croquis.
¿Cuando inyectas los 5v en el puerto analógico X , desconectas la interrupción para ignorar mas llamadas mientras se ejecuta o el micro ignora más llamadas hasta que termina el bloque de código inyector de señal?.

No he usado mucho ese método y desconozco su funcionamiento.

También está el tema de si al cortar la señal de 5v, el micro hace un pulldown. Si lo hace, te descargará el condensador del c64 si no hay un diodo para evitarlo.
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: riq en Enero 13, 2017, 23:48:19
creo que funciona más o menos así:

las GPIOs tiene soporte de interrupciones de hardware (interrupciones en el sentido de la c64... sucede algo en el hardware y te llaman a un callback).

las interrupciones que tiene la GPIO son 3:
  - subida (raising)... cuando la señal va de Vil a Vih (de 5v a 0v en un Arduino)
  - bajada (falling)... cuando la señal va de Vih a Vil (de 0v a 5v en un Arduino)
  - ó ambas

en verdad tienen cierto margen... creo que es algo así como que pasan del 80% de Vih  a 20% de Vih... no estoy seguro bien cuales son esos valores.

Entonces cuando te llaman a tu callback tenes que hacer lo que tengas que hacer lo más rápido posible.
El período es de ~500us, asi que tenes que hacer lo que tengas que hacer en menos de ~500us.

La idea es hacer algo así:

- escuchar en la interrupción de Falling
- Y en el callback de Falling hacer esto:
   - delay(~200us)... que es cuando la señal esta baja. cuando se acaba el delay, es cuando se empieza a cargar el condensador. este valor lo tenes que calcular vos con un osciloscopio para que sea exacto.
   - delay( variable )... Aca tenes que hacer un delay del valor que quieras que tenga el POT
   - levantar el GPIO (a 5v).
   - un delay de unos 20us
   - bajar el GPIO (a 0v).

este algoritmo me funcionó bien a mi, super estable... pero como solo me disparaba interrupciones de Raising, solo podia cambiar valores de 65 a 255 (el delay fijo del principio lo tuve que sacar, claro esta).

El algoritmo que usa Leif Bloomquist es el siguiente:

interrupt_callback:
   - bajar el GPIO (0v)
   - delay( ~200us)
   - delay( variable )
   - subir el GPIO (5v)

y conecta el POT-x a una linea con el Arduino con un pull-up.

Título: Re:UniJoystiCle + mouse/paddles
Publicado por: riq en Enero 24, 2017, 03:04:44
usando el circuito que me pasó @Maniako logro que me llegue una señal limpia al ESP32 y así poder hacer lo que necesitaba (todavía falta mucho... pero es un gran progreso).
Gracias Maniako!

https://www.youtube.com/watch?v=_5h3ouflAc0


Que puedo hacer:

- escribo en el pot Y de manera estable
- pero solo entre 2 y 224...

tengo que ver como hacer para llegar a los demás valores.

No tuve problemas de red... pero supongo que tendré algunos problemillas en el futuro.

EDIT: En el video menciono a Canseco, pero es Maniako el que me dió el circuito.
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: danytoon en Enero 24, 2017, 05:36:58
Me siento mal viniendo aquí y no entendiendo nada de lo que decís, con la trabajera que se nota que os estáis dando...
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: Maniako en Enero 24, 2017, 13:13:42
WOW!! Qué estabilidad!!!
Para leer 0 deberias poner una resistencia pulldown de 10k entre el pin analogico y masa . Puede que de más valor funcione igual, conecta un potenciómetro de100k+ la resistencia de10k en serie y ajustalo hasta conseguir el valor real que necesita.
Lo de que no llegue a 255 es extraño. Deberia ser cuestión de más tiempo de carga.

Tú puedes llamarme como quieras, me dá igual XD. Con el trabajo que os pegáis algunos foreros , os habeis ganado ese derecho.

Seguiré intentandolo sobre PWM.
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: Maniako en Enero 24, 2017, 13:14:20
Me siento mal viniendo aquí y no entendiendo nada de lo que decís, con la trabajera que se nota que os estáis dando...

Así me siento yo en el hilo del wassap XDXDXD
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: riq en Enero 24, 2017, 15:56:58
Me siento mal viniendo aquí y no entendiendo nada de lo que decís

es como todo, una vez que uno lo entiende se da cuenta que no era dificil o complejo.

WOW!! Qué estabilidad!!!
Para leer 0 deberias poner una resistencia pulldown de 10k entre el pin analogico y masa . Puede que de más valor funcione igual, conecta un potenciómetro de100k+ la resistencia de10k en serie y ajustalo hasta conseguir el valor real que necesita.
Lo de que no llegue a 255 es extraño. Deberia ser cuestión de más tiempo de carga.

Le hice unas pequeñas modificaciones al circuito que me pasaste... no creo que cambie nada pero te cuento lo que hice por si acaso. Reemplacé:

- la resistencia de 16k por una de 15k
- la de 2k la reemplacé por otra de 2.2k

Los cambié porque no tenía esos valores.


Luego pruebo con su sugerencias y te cuento. Gracias (y perdón por la confusión de nombres).

Esto es lo que hice:

(https://s20.postimg.org/cjw4w1mft/IMG_5677.jpg) (https://postimg.org/image/cjw4w1mft/)
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: riq en Enero 25, 2017, 08:27:36
Don @Maniako ,

¿se te ocurre algún circuito similar al que me diste, pero sin que se altere el voltaje/corriente del Pot x?

Me refiero a que si bien el circuito que me diste funciona muy bien, lo que me sucede es que me esta modificando el voltaje/corriente del Pot X. Si bien estoy usando el Pot X para leer, lo necesito para escribir también.

Asi como esta el circuito, el Pot X tiene un valor de 0 (o 1 o 2) no importa lo que haga ya que lo carga muy rápido por la cantidad de voltaje/corriente que hay.

No se si poniendo alguna resistencia más, o algún diodo entre el Pot x y la base el transistor o alguna otra cosa para impedir que se altere.

gracias!
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: josepzin en Febrero 11, 2017, 16:28:35
Montaje y pequeña review del The UniJoystiCle™ de @arananet

http://arananet-net.kinja.com/review-del-the-unijoysticle-1792207554

https://www.youtube.com/watch?v=J2aTPtsnLQc
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: arananet en Febrero 14, 2017, 07:53:16
Gracias por compartirlo máquina!
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: josepzin en Enero 31, 2019, 19:49:50
@riq está de vuelta :P

Unijoysticle v2 - Preview

https://www.youtube.com/watch?v=y8Rvg70O650 (https://www.youtube.com/watch?v=y8Rvg70O650)
Título: Re:UniJoystiCle + mouse/paddles
Publicado por: josepzin en Abril 05, 2019, 12:41:36
:D :D

https://www.youtube.com/watch?v=tUBH8EF5hr0 (https://www.youtube.com/watch?v=tUBH8EF5hr0)