MIDI con 16F628 o 16f84
Ejemplo MIDI con PIC
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.
Fuente:http://www.todopic.com.ar/foros/index.php?topic=22028.0
|
|
![]() | 12 enero 2012 en Electronica | tags: Circuitos electrónicos, Electronica |









![midi628shl[1]](http://www.pesadillo.com/pesadillo/wp-content/uploads/2012/10/midi628shl1.gif)
![midiportzz9[1]](http://www.pesadillo.com/pesadillo/wp-content/uploads/2012/10/midiportzz91.gif)












