MIDI con 16F628 o 16f84
Ejemplo MIDI con PIC
![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)
2 | CLRW ; PUESTO DE PRUEBA: CANAL2 (INTERFAZ), MIDI=1 |
3 | MOVLW b '11000001' ; Esto luego habra que sacarlo de la EEPROM, pero de momento |
4 | CLRF MEMORIA ; lo cargo manualmente desde aqui. |
7 | CALL MIDI_S ; Llama a la rutina de envio (se envia el byte cargado en MEMORIA) |
9 | CALL DELAY_BOTON ; Todo este tiempo de espera es porque a algunos aparatos MIDI |
10 | CALL DELAY_BOTON ; les cuesta tiempo la orden de cambio de programa (por ejemplo, |
11 | CALL DELAY_BOTON ; behringer tiene un tiempo enorme para esto, asi como TC lo tiene |
12 | CALL DELAY_BOTON ; muy bajo). |
19 | MOVLW b '11000110' ; PUESTO DE PRUEBA CANAL 7 (INTERFAZ), MIDI=6 |
23 | CALL MIDI_S ;Hace otra transmision diferente (otro numero de programa) |
37 | ; FIN DE CODIGO PARA PROBAR |
40 | ;============================================ |
42 | ;============================================ |
44 | ; Produce una demora de 260 ms. |
45 | ;============================================ |
50 | MOVLW h 'FF' ; Coloca el valor 255 en el contador. |
53 | RESTA2 DECFSZ CONTADOR2,F ; Resta y salta si = 0. |
54 | GOTO NO_FIN ; Si no ha terminado sigue. |
55 | GOTO SI_FIN ; Si ha terminado, va al return de rutina. |
57 | NO_FIN MOVLW h 'FF' ; Coloca el valor 255 en el contador. |
61 | DECFSZ CONTADOR,F ; Resta y salta si = 0. |
62 | GOTO RESTA ; Repite el bucle hasta terminar la cuenta. |
64 | SI_FIN RETURN ; Termina la subrutina de delay. |
66 | ;============================================ |
68 | ;============================================ |
70 | ;================================================ |
71 | ; Manera de hacer un envio: |
72 | ;================================================ |
74 | ; Se pone en W el byte a enviar y se hace |
75 | ; una llamada CALL MIDI_S, que envia el byte |
76 | ; por RA0 con sincronia. |
78 | ;================================================ |
80 | ;================================================ |
82 | ;================================================ |
84 | ; EnvÌa por transmision serie el contenido | |
85 | ; del registro MEMORIA, un banco temporal al | |
86 | ; que se ha de copiar previamente el valor | |
87 | ; binario a enviar almacenado en la eeprom. | |
88 | ; Ello con la temporizacion necesaria para | |
89 | ; la comprension por dispositivos MIDI. | |
91 | ;================================================ |
93 | MIDI_S MOVWF MEMORIA ; Coloca el valor de W en el registro memoria para trabajar |
94 | BANCO0 ; Cambia a banco0 para hacer cambios en el estado de RA0 |
96 | BCF PORTA,0 ; Pone RA0 a nivel bajo, por si estubiera alto de antes. |
97 | 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. |
99 | CLRF CARRY ; Borra el contenido que hubiera en el registro CARRY. |
100 | MOVLW d '9' ; Carga el contador de envios realizados con el valor 8. |
103 | CORRER DECFSZ CARRY ; Decrementa el contador de bits enviados y salta si = 0. |
104 | GOTO SIGUE ; Aun no ha enviado ocho bits, por lo que sigue enviando. |
105 | GOTO TERMINA ; Ya ha enviado ocho veces, asi que termina. |
107 | SIGUE NOP ; Ya que en el goto del que procedemos lleva un anticipo en este caso |
108 | BTFSC MEMORIA,7 ; Si el bit actual es cero va a PON_CERO |
109 | GOTO PON_UNO ; pero si es uno, no salta y va a PON_UNO. |
112 | PON_UNO NOP Ya que en el goto del que procedemos lleva un anticipo en este caso. |
113 | CLRF CONTADOR ; Borra por si hubiera algo de antes. |
114 | ;===============DELAY============= |
115 | MOVLW d '6' ; Coloca el valor 5 en el contador. |
117 | BUCLE DECFSZ CONTADOR,F ; resta y salta si = 0. |
118 | GOTO BUCLE ; repite el bucle hasta terminar la cuenta. |
120 | ;===============DELAY============= |
121 | BSF PORTA,0 ; Pone un 1 en RA0. |
122 | RLF MEMORIA,F ; Rota el contenido del byte MEMORIA hacia la izquierda, y lo almacena en el propio registro. |
123 | GOTO CORRER ; Repite la tarea para enviar el siguiente bit en caso de que proceda. |
125 | PON_CERO CLRF CONTADOR ; Borra por si hubiera algo de antes. |
126 | ;===============DELAY============= |
127 | MOVLW d '6' ; Coloca el valor 5 en el contador. |
129 | BUCLE_ DECFSZ CONTADOR,F ; resta y salta si = 0. |
130 | GOTO BUCLE_ ; repite el bucle hasta terminar la cuenta. |
131 | NOP ; En caso de continua o falta de sincronia, puede probarse a ser cambiado por "BCF PORTA,0" a ver si mejora. |
132 | ;===============DELAY============= |
133 | BCF PORTA,0 ; Pone un 0 en RA0. |
134 | RLF MEMORIA,F ; Rota el contenido del byte MEMORIA hacia la izquierda, y lo almacena en el propio registro. |
135 | GOTO CORRER ; Repite la tarea para enviar el siguiente bit en caso de que proceda. |
137 | ;===============DELAY FINAL======= |
138 | ; Ahora ponemos un delay para que si el ultimo bit enviado es uno no se corte antes de tiempo. |
139 | TERMINA MOVLW d '8' ; Coloca el valor 5 en el contador. |
141 | BUCLE1 DECFSZ CONTADOR,F ; resta y salta si = 0. |
142 | GOTO BUCLE1 ; repite el bucle hasta terminar la cuenta. |
143 | BSF PORTA,0 ; Envia el STOP BIT, que siempre es 1. |
147 | MOVLW d '10' ; Coloca el valor 5 en el contador. |
149 | BUCLE__ DECFSZ CONTADOR,F ; resta y salta si = 0. |
150 | GOTO BUCLE__ ; repite el bucle hasta terminar la cuenta. |
152 | BCF PORTA,0 ; Termina el STOP-BIT, asi que volvemos a dejar RA0 en estado bajo. |
157 | CLRF MEMORIA ; Borra el registro temporal MEMORIA. |
158 | RETURN ; Vuelve al programa, donde esperara una nueva orden de envio. |
160 | ;================================================ |
162 | ;================================================ |
164 | END ; Fin del programa. |
Fuente:http://www.todopic.com.ar/foros/index.php?topic=22028.0
4.722 Veces leído 0 comentarios |