TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
26 de Julio de 2014, 00:05:33

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
346189 Mensajes en 38842 Temas por 40404 Usuarios
Último usuario: terror del llano
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Microcontroladores PIC
| |-+  * PROYECTOS * (Moderadores: J1M, jfh900, MGLSOFT, Modulay, Sasián, LABmouse)
| | |-+  Problemas de sincronia? midi con 16F84
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Marcar como favorito Imprimir
Autor Tema: Problemas de sincronia? midi con 16F84  (Leído 3459 veces)
4ltrvsm0
Visitante
« : 04 de Junio de 2008, 13:29:21 »

Hola a todos!

Soy nuevo en el foro, así que primero me presentaré.
Me gusta la electrónica desde que era un enanillo, y hace unos años decidí involucrarme más aprendiendo sobre electrónica digital. En programación de PIC no soy ningún experto, sino más bien un aprendiz, pero hasta ahora mis modestos proyectos me habían funcionado a la primera o si acaso con pequeñas depuraciones sin mucha importancia.

Mi proyecto es el siguiente:

Soy técnico de sonido, y tengo en mi estudio multitud de aparatos MIDI. Existe un software llamado TOTAL RECALL, pero los que lo conozcan sabrán la poca facilidad que se tiene para implementar hojas de nuevos dispositivos (tanto por el soft en sí como por la poca información que dan las marcas sobre sus dispositivos con puertos MIDI).
Lo que quiero hacer, es poder enviar órdenes MIDI desde un 16F84, pero no cualquier orden: el comando de cambio de programa (y próximamente el de cambio de controlador, pero eso es otro cantar).

Sé que el 16F84 no es el más indicado por no tener puerto serie, pero, es para mí el más valorado, sobre todo por la multitud de veces que lo he usado. Tengo también 16f876, pero no quiero emplearlo.

Bien, después de mi cabezonería con este micro, diré que he escrito una rutina que hace las veces de puerto serie correctamente configurado para trabajar a 31,25kbaudios (es decir, una orden durará 32uS).

Sé que el midi utiliza un bit start (siempre cero), los ocho de mensaje, y un bit-stop. Conozco la sintaxis MIDI porque es parte de mi trabajo, aunque no el más frecuente (pero hay que saber programar MIDI). Aunque eso no quita que se me haya podido pasar algún detalle... claro.

El problema es: cargué mi programa al 16F84, sobre la protoboard, con cristal de 4Mhz y el cable MIDI a mi aparato (concretamente usé un TC Electronics G-Major en primer lugar), y funcionó, cambió de programa. Volví a dar la orden y volvió a cambiar, pero a otro programa distinto (dando la misma orden el PIC). Después de eso no volvió a funcionar.

El pic no está dañado (comprobado como veinte veces), el cable tampoco y la unidad tampoco (probado con otros dispositivos MIDI y funciona perfectamente).

He probado de todo y nada, no he vuelto a conseguir (ni siquiera con el mismo código y montaje) que me haga caso, no detecta órdenes MIDI cuando se las doy con el PIC.

El protocolo MIDI recibe órdenes en binario natural (los 1 son 1 y los 0 son 0, al contrario que el RS-232). Por lo que mi montaje fue de RA0 ---> RX del MIDI. Y así funcionó, y no ha vuelto a hacerlo.
He probado con inversor 7404, con inversión por mi firmware, con un 2N2222, tal como todos recomiendan, etc.

Y NADA DE NADA.

Alguien puede decirme algo? Estoy completamente ofuscado.

Mi código:





ESPERA   CLRF   MEMORIA         ;
      CLRW            ;   PUESTO DE PRUEBA: CANAL2 (INTERFAZ), MIDI=1
      MOVLW   b'11000001'   ; Esto luego habra que sacarlo de la EEPROM, pero de momento
      CLRF   MEMORIA         ; lo cargo manualmente desde aqui.
      MOVWF   MEMORIA      ;

      CALL   MIDI_S         ; Llama a la rutina de envio (se envia el byte cargado en MEMORIA)

      CALL   DELAY_BOTON      ; Todo este tiempo de espera es porque a algunos aparatos MIDI
      CALL   DELAY_BOTON      ; les cuesta tiempo la orden de cambio de programa (por ejemplo,
      CALL   DELAY_BOTON      ; behringer tiene un tiempo enorme para esto, asi como TC lo tiene
      CALL   DELAY_BOTON      ; muy bajo).
      CALL   DELAY_BOTON
      CALL   DELAY_BOTON
      CALL   DELAY_BOTON
      CALL   DELAY_BOTON
      
      
      CLRW   
      MOVLW   b'11000110'   ; PUESTO DE PRUEBA CANAL 7 (INTERFAZ), MIDI=6
      CLRF   MEMORIA
      MOVWF   MEMORIA

      CALL   MIDI_S         ;Hace otra transmision diferente (otro numero de programa)

      CALL   DELAY_BOTON
      CALL   DELAY_BOTON
      CALL   DELAY_BOTON
      CALL   DELAY_BOTON
      CALL   DELAY_BOTON
      CALL   DELAY_BOTON
      CALL   DELAY_BOTON
      CALL   DELAY_BOTON
      
      GOTO   ESPERA

;
;   FIN DE CODIGO PARA PROBAR
;





;============================================
;      DELAY
;============================================
;
;   Produce una demora de 260 ms.
;============================================

DELAY_BOTON   CLRW
         CLRF   CONTADOR2
         CLRF   CONTADOR
         MOVLW   h'FF'         ; Coloca el valor 255 en el contador.
         MOVWF   CONTADOR2

RESTA2      DECFSZ   CONTADOR2,F   ; Resta y salta si = 0.
         GOTO   NO_FIN      ; Si no ha terminado sigue.
         GOTO   SI_FIN      ; Si ha terminado, va al return de rutina.

NO_FIN      MOVLW   h'FF'         ; Coloca el valor 255 en el contador.
         MOVWF   CONTADOR      

RESTA      NOP
         DECFSZ   CONTADOR,F   ; Resta y salta si = 0.
         GOTO   RESTA      ; Repite el bucle hasta terminar la cuenta.
         GOTO   RESTA2
SI_FIN      RETURN            ; Termina la subrutina de delay.

;============================================
;      FIN RUTINA DELAYS
;============================================




;================================================
;    Manera de hacer un envio:
;================================================
;
; Se pone en W el byte a enviar y se hace
; una llamada CALL MIDI_S, que envia el byte
; por RA0 con sincronia.
;
;================================================

;================================================
;             RUTINA PRINCIPAL                     |
;================================================   
;                                          |
; EnvÌa por transmision serie el contenido                     |
; del registro MEMORIA, un banco temporal al                  |
; que se ha de copiar previamente el valor                     |
; binario a enviar almacenado en la eeprom.                  |
; Ello con la temporizacion necesaria para                     |
; la comprension por dispositivos MIDI.                     |
;                                          |
;================================================


MIDI_S   MOVWF   MEMORIA      ; Coloca el valor de W en el registro memoria para trabajar
      BANCO0            ; Cambia a banco0 para hacer cambios en el estado de RA0
      
      BCF      PORTA,0      ; Pone RA0 a nivel bajo, por si estubiera alto de antes.
      CALL   DELAY_BOTON      ; He introducido esto, por si el tiempo de cero no fuera suficiente, ya que si viene de un uno, no hay 32uS de diferencia.
      
      CLRF   CARRY         ; Borra el contenido que hubiera en el registro CARRY.
      MOVLW   d'9'         ; Carga el contador de envios realizados con el valor 8.
      MOVWF   CARRY


CORRER   DECFSZ   CARRY      ; Decrementa el contador de bits enviados y salta si = 0.
      GOTO   SIGUE      ; Aun no ha enviado ocho bits, por lo que sigue enviando.
      GOTO   TERMINA      ; Ya ha enviado ocho veces, asi que termina.


SIGUE   NOP               ; Ya que en el goto del que procedemos lleva un anticipo en este caso
      BTFSC   MEMORIA,7   ; Si el bit actual es cero va a PON_CERO
      GOTO   PON_UNO      ; pero si es uno, no salta y va a PON_UNO.
      GOTO   PON_CERO


PON_UNO   NOP                Ya que en el goto del que procedemos lleva un anticipo en este caso.
      CLRF   CONTADOR      ; Borra por si hubiera algo de antes.
;===============DELAY=============
       MOVLW   d'6'         ; Coloca el valor 5 en el contador.
      MOVWF   CONTADOR      
BUCLE   DECFSZ   CONTADOR,F   ; resta y salta si = 0.
      GOTO   BUCLE      ; repite el bucle hasta terminar la cuenta.
      NOP
;===============DELAY=============
      BSF      PORTA,0      ; Pone un 1 en RA0.
      RLF      MEMORIA,F   ; Rota el contenido del byte MEMORIA hacia la izquierda, y lo almacena en el propio registro.
      GOTO   CORRER      ; Repite la tarea para enviar el siguiente bit en caso de que proceda.


PON_CERO CLRF   CONTADOR      ; Borra por si hubiera algo de antes.
;===============DELAY=============
       MOVLW   d'6'         ; Coloca el valor 5 en el contador.
      MOVwF   CONTADOR      
BUCLE_   DECFSZ   CONTADOR,F   ; resta y salta si = 0.
      GOTO   BUCLE_      ; repite el bucle hasta terminar la cuenta.
      NOP               ;  En caso de continua o falta de sincronia, puede probarse a ser cambiado por "BCF   PORTA,0"   a ver si mejora.                  
;===============DELAY=============
      BCF      PORTA,0      ; Pone un 0 en RA0.
      RLF      MEMORIA,F   ; Rota el contenido del byte MEMORIA hacia la izquierda, y lo almacena en el propio registro.
      GOTO   CORRER      ; Repite la tarea para enviar el siguiente bit en caso de que proceda.



;===============DELAY FINAL=======
                     ; Ahora ponemos un delay para que si el ultimo bit enviado es uno no se corte antes de tiempo.
TERMINA   MOVLW   d'8'         ; Coloca el valor 5 en el contador.
      MOVWF   CONTADOR      
BUCLE1   DECFSZ   CONTADOR,F   ; resta y salta si = 0.
      GOTO   BUCLE1      ; repite el bucle hasta terminar la cuenta.
      BSF      PORTA,0      ; Envia el STOP BIT, que siempre es 1.
;====================
; DELAY PARA STOP-BIT
;====================
       MOVLW   d'10'         ; Coloca el valor 5 en el contador.
      MOVwF   CONTADOR      
BUCLE__   DECFSZ   CONTADOR,F   ; resta y salta si = 0.
      GOTO   BUCLE__      ; repite el bucle hasta terminar la cuenta.
      NOP
      BCF      PORTA,0      ; Termina el STOP-BIT, asi que volvemos a dejar RA0 en estado bajo.
;====================
; DELAY PARA STOP-BIT
;====================
      NOP
      CLRF   MEMORIA         ; Borra el registro temporal MEMORIA.
      RETURN            ; Vuelve al programa, donde esperara una nueva orden de envio.

;================================================
;            FIN DE LA RUTINA
;================================================


      END               ; Fin del programa.

« Última modificación: 04 de Junio de 2008, 13:47:18 por 4ltrvsm0 » En línea
4ltrvsm0
Visitante
« Respuesta #1 : 07 de Junio de 2008, 11:15:51 »

Ninguna idea al respecto?

Al menos algún entendido puede decirme si la rutina de envío está bien temporizada? Yo creo que sí pero claro... como no funciona? xD

Saludos y gracias.
En línea
Nocturno
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
Cuba Cuba

Mensajes: 16902



WWW
« Respuesta #2 : 07 de Junio de 2008, 11:47:57 »

Si te ha funcionado alguna vez y luego nunca más, yo intuyo que el problema va a ser en la conexión, más que en el código. Si ese firmware ha demostrado alguna vez que funciona, debería estar bien escrito.
Has hablado de que en MIDI los 0 son 0 y los 1 son 1 pero, ¿qué rango de tensiones se manejan?, ¿son niveles TTL de 0 a 5V?

Lo digo porque podría ocurrir que alguna sobretensión o alguna adaptación de masas haya fundido esos pines de tu PIC. ¿Has probado con otro PIC?.

Por lo que he visto en algunos esquemas que hay por ahí, las entradas del PIC suelen optoaislarse, así que eso me hace sospechar aún más.





Por cierto, doy por hecho que las masas del PIC y del MIDI estaban unidas, ¿verdad?
En línea

Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ
Javicho
Colaborador
PIC24F
*****
Desconectado Desconectado

Peru Peru

Mensajes: 570


« Respuesta #3 : 07 de Junio de 2008, 11:54:44 »

Usa el Stopwatch con Breakpoints del MPLAB para que ajustes bien tus temporizaciones que en tu caso es importantisimo.

Javicho.
En línea
juno303
Colaborador
PIC16
*****
Desconectado Desconectado

Mensajes: 103


« Respuesta #4 : 08 de Junio de 2008, 05:24:32 »

hola, hace un tiempo probe lo del midi, me hice un controlador midi, funciono muy bien, pero despues de muchos intentos, te recomendaria que uses el 876, pero igual debe funcionar con el 84, el problema que proablemente estes teniendo es electrico, segun lo que lei, el protocolo midi es un lazo de corriente, y no de tension, por lo tanto debes usar el 7405, que tiene salida a colector abierto, aqui hay un documento muy interesante: www.rayavida.com/thesis.com, ahi sale un circuito con el 7405, el mismo use, y no tuve ningun problema. SUERTE !
En línea
4ltrvsm0
Visitante
« Respuesta #5 : 08 de Junio de 2008, 08:25:26 »

En primer lugar muchas gracias a todos los que me habéis respondido.

Por partes:

- No uso optoacoplador ni nada por el estilo porque solo utilizo una sallida del pic para el MIDI IN de mi aparato (es decir, que no voy a recibir en el pic nada, solo quiero enviar señales).

- Las masas de ambos están conectadas.

- El cable funciona porque lo he vuelto a probar conectándole la clavija din-5 que le quité y rula, además el polímetro dice también que está ok. (Así que no debería ser el problema).

- El cronómetro del MPLAB es justo el que he usado, y según él, la temporización es exacta.

- Mi conexionado es justo como indicas, Nocturno, de la salida a una R de 220 ohm y de ahí al pin de datos. Al mismo tiempo el GND del cable al GND de mi protoboard y el VCC del MIDI a mis +5 de PIC.

- He probado con otro PIC igual y nada. Además, he probado otros programas míos en esos PICS y funcionan sin problemas.

Una duda: los condensadores que utilizo para el oscilador son cerámicos y están marcados con la nomenclatura: 22P, son grises y con una marca negra en la cabeza. Son del valor 22pF? Nunca me aclaro con los malditos condensadores... Por qué les pondrán tanta parafernalia.

Respecto a lo que comentas, juno303, voy a mirar lo del 7405 a ver qué saco de ello.

De nuevo muchas gracias a todos.

EDITO: Así es como lo conecto:




Respecto a lo del 7405, tengo un 7404, que es lo mismo prácticamente (creo), un inversor. Lo he probado también y nada. Probé 16F84 + 7404 y también 16F84 + 7404 + 2N2222 y tampoco hubo manera. De la única forma que ruló fue con el montaje que indico arriba.

Juno303: podrías mostrar el esquema de conexionado que utilizaste tú? El 876 tiene salida para transmisión serie o implementaste tú la rutina por software como he hecho yo?
« Última modificación: 08 de Junio de 2008, 09:35:38 por 4ltrvsm0 » En línea
Leon Pic
Colaborador
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 3379


Cumuloninbus


WWW
« Respuesta #6 : 08 de Junio de 2008, 09:46:35 »

Hola 4ltrvsm0.

¿Qué porcentaje +/- soporta la temporización el MIDI? Esto es importante porque el cronómetro del mplab, hace la simulación con 4Mhz puros, pero en la práctica, esto no es así. Y si el cristal o los condensadores junto a el están malos, la oscilación será mas o menos que 4Mhz.

Si tienes un osciloscopio, mide la frecuencia que entrega el cristal y haz la prueba con el mplab haber si están en el margen correcto. O más facil, cambia los dos condensadores por unos nuevos y el cristal también.

Como consejo, colocale un condensador de 100nf lo mas cerca posible al pic. Y colocale una resistencia al MCLR para que no fluya toda la corriente por el mismo. Fijate en este link circuito reset
En línea

Él dijo: "destruyan a la Iglesia y yo la levantaré en tres días". Con esto definió que la Iglesia, somos nosotros; el cuerpo y alma, y no el edificio o templo.
-"Ámense los unos a los otros como yo los he amado" Nuestro Señor Dios hecho hombre: Jesús.
-Él, fue a la cruz, pagó nuestro pecado con un dolor increible siendo inocente de lo que lo acusaban, para salvarnos.

-Mi propio Foro de Meteorología
www.meteorologiafacil.com.ar/foros/index.php

-Web
www.meteorologiafacil.com.ar
juno303
Colaborador
PIC16
*****
Desconectado Desconectado

Mensajes: 103


« Respuesta #7 : 11 de Junio de 2008, 01:43:41 »

"El protocolo midi es una lazo de corriente de 5ma, circulacion de corriente es nivel logico 0.

En línea
4ltrvsm0
Visitante
« Respuesta #8 : 16 de Junio de 2008, 18:09:08 »

Gracias por seguir ayudando.

El cristal y los condensadores son completamente nuevos y me funcionan en otras aplicaciones (que no necesito una cronometración precisa).

Está montado en una protoboard sin cables, de forma directa al micro (el set de oscilador + condensadores).
He probado también conectando el MCLR a V a través de una resistencia de 4k y me dio el mismo resultado. (Aunque no he probado con ese esquema de R + C + R).

No se cual es la tolerancia de velocidad de transmisión en MIDI. Alguien lo sabe por aquí?


EDITO: El 16f628 es el que nombran en todos lados para aplicaciones MIDI, pero a diferencia del 16f84 incorpora un módulo USART interno, lo que facilita mucho el trabajo de implementar esta tarea por firmware. Me gustaría usar el 16f84.

EDITO2: juno303, según ese último e interesante gráfico, confirma mi diagrama de conexionado y mi teoría de datos midi? Es decir, de mi salida al MIDI-IN a través de 220ohm y poniendo a 1 cuando quiero que reciba un 1 y viceversa? Es que a ver si estoy partiendo de cosas equivocadas...
« Última modificación: 16 de Junio de 2008, 18:25:39 por 4ltrvsm0 » En línea
4ltrvsm0
Visitante
« Respuesta #9 : 17 de Junio de 2008, 15:03:46 »

Hola, indagando en mi Cubase he visto una cosa.

Según su tabla de asignación MIDI, para cambio de programa se emplean dos bytes! no uno!

Así por ejemplo, programé manualmente que hiciera un cambio de programa al prog 60 y los bytes que sacó fueron:  c0  3c

en binario es:   11000000   00111100

La verdad es que Cubase no se equivoca xD, así que intuyo que tengo un error de base. La verdad es que no es fácil encontrar la información necesaria para descifrar midi al completo, y eso que tuve que estudiarlo xD.

Bueno, pues voy a rehacer el código y os cuento qué ocurre!

Saludos!
En línea
4ltrvsm0
Visitante
« Respuesta #10 : 18 de Junio de 2008, 17:19:56 »

He conseguido transmitir información, aunque no puede decirse que sea... inteligible.

Enviando uno, dos o tres bytes, no importa cuantos. Pero lo que si importa es haber puesto un 7404 (inversor).

He leído el código de Tom Scarff ( http://tomscarff.tripod.com/midi_analyser/midi_messages.htm ) y hace lo mismo que yo en base; rota el byte, compara y envía, temporiza, decrementa el contador y repite si no ha terminado. Además coincido con él en los tiempos de envío.

El problema está en que no detecta lo que yo envío sino que el entiende otras cosas.

He conectado mi PIC al MIDI-In de mi tarjeta y he grabado en cubase, para ver qué es lo que entiende.

Pues por ejemplo: si envío   (0) 11000000 (1) (0) 00001111 (1)      Los puestos entre paréntesis son bit-start y stop respectivamente.

El reconoce de ahí:   (0) 00000111 (1)

El protocolo MIDI establece que si algo no se entiende, se omite y punto. Así que de entre todo eso que yo envío el solo saca un byte, que no es ninguno de los enviados.

He revisado y revisado el código. He acelerado ligeramente los tiempos, los he ralentizado un poco, los he dejado en lo normal. Y nada, siempre hace lo mismo (aunque varíe un microsegundo más rápido o más lento).

No sé qué más me queda ya por comprobar.

Por cierto, los condensadores que dije, son los suyos o no? Pone en ellos 22P. Son de 22pF o me he equivocado?

Lo del condensador de 100 nF te refieres a que sustituya los del oscilador por dos de 100nF o al circuito de Reset?

Saludos,... sigo en la brecha!
En línea
Modulay
Moderador Local
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 2652



« Respuesta #11 : 18 de Junio de 2008, 18:10:04 »

Te vendrá mejor que uses un monitor midi como midi-ox para monitorizar el tráfico,en vez de usar el secuenciador.Y mientras sigues peleando para que funcione te recomiendo que intentes mandar mensajes de un byte,como RESET,ACTIVE SENSING,etc...siempre será más facil hacer llegar correctamente un byte que tres.
No se si esto te servirá de mucha ayuda ya que tu caso es diferente,pero yo tuve problemas de tiempos que,en mi caso,estaban causados por una mala elección del cristal para obtener los 31250 baudios en la usart del micro.Tuve que deshechar un cristal de 12 MHz y sustituirlo por uno de 20,ya que los baudios reales que se obtenían con el de 12 distaban bastante de los 31250 teóricos...
Aparte de la que está en la línea TX del micro (RA0 en tu caso),yo tengo otra resistencia de 220 ohm entre los 5V de la alimentación y el pin del conector DIN (no se si será el pin 2 o el 4...en la imagen se ve)



Como ya te han comentado,te va a ahorrar muchos tormentos el que uses un micro con usart,ya que no tendrás que estar pendiente de temporizaciones.
Y no hay que intercalar inversor ninguno,el midi rula con lógica natural (los 1 son 1 y los 0 son 0)
En línea
Modulay
Moderador Local
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 2652



« Respuesta #12 : 18 de Junio de 2008, 18:19:58 »

El condensador de 100n que te comenta Leon_pic es el de bypass,y no puede faltar.Debe ir entre Vcc y masa, lo más cerca posible de la pata Vcc del micro.
La resistencia de la pata MCLR tampoco la obvies,más de un problema me ha traído descuidar el circuito de reset
En línea
TODOPIC
   

 En línea
Páginas: [1] Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines XHTML 1.0 válido! CSS válido!
Página creada en 0.062 segundos con 24 consultas.
anything