Desde 1994 en la Red. La pagina de los aficionados a la electronica, informatica y otras curiosidades de la vida. No dudes en visitarnos.
Ahora 1 visitas.| 3537775 Visitas (desde Dic. 2011), hoy: 337 Visitas 842 Pag. Vistas , ultimos 36 dias: 13700 Visitas. 32233 Pag. Vistas. Tu IP: 3.15.31.36
Que ando curioseando:
AutosuficienciaCosas de casaElectronicaEn InternetInformáticaMundo MisticoSin categoríaSociedadTe lo recomiendo

MIDI con 16F628 o 16f84

Ejemplo MIDI con PIC

1ESPERA   CLRF   MEMORIA         ;
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.
5      MOVWF   MEMORIA      ;
6 
7      CALL   MIDI_S         ; Llama a la rutina de envio (se envia el byte cargado en MEMORIA)
8 
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).
13      CALL   DELAY_BOTON
14      CALL   DELAY_BOTON
15      CALL   DELAY_BOTON
16      CALL   DELAY_BOTON
17 
18      CLRW
19      MOVLW   b'11000110'   ; PUESTO DE PRUEBA CANAL 7 (INTERFAZ), MIDI=6
20      CLRF   MEMORIA
21      MOVWF   MEMORIA
22 
23      CALL   MIDI_S         ;Hace otra transmision diferente (otro numero de programa)
24 
25      CALL   DELAY_BOTON
26      CALL   DELAY_BOTON
27      CALL   DELAY_BOTON
28      CALL   DELAY_BOTON
29      CALL   DELAY_BOTON
30      CALL   DELAY_BOTON
31      CALL   DELAY_BOTON
32      CALL   DELAY_BOTON
33 
34      GOTO   ESPERA
35 
36;
37;   FIN DE CODIGO PARA PROBAR
38;
39 
40;============================================
41;      DELAY
42;============================================
43;
44;   Produce una demora de 260 ms.
45;============================================
46 
47DELAY_BOTON   CLRW
48         CLRF   CONTADOR2
49         CLRF   CONTADOR
50         MOVLW   h'FF'         ; Coloca el valor 255 en el contador.
51         MOVWF   CONTADOR2
52 
53RESTA2      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.
56 
57NO_FIN      MOVLW   h'FF'         ; Coloca el valor 255 en el contador.
58         MOVWF   CONTADOR
59 
60RESTA      NOP
61         DECFSZ   CONTADOR,F   ; Resta y salta si = 0.
62         GOTO   RESTA      ; Repite el bucle hasta terminar la cuenta.
63         GOTO   RESTA2
64SI_FIN      RETURN            ; Termina la subrutina de delay.
65 
66;============================================
67;      FIN RUTINA DELAYS
68;============================================
69 
70;================================================
71;    Manera de hacer un envio:
72;================================================
73;
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.
77;
78;================================================
79 
80;================================================
81;             RUTINA PRINCIPAL                     |
82;================================================
83;                                          |
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.                     |
90;                                          |
91;================================================
92 
93MIDI_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
95 
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.
98 
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.
101      MOVWF   CARRY
102 
103CORRER   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.
106 
107SIGUE   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.
110      GOTO   PON_CERO
111 
112PON_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.
116      MOVWF   CONTADOR
117BUCLE   DECFSZ   CONTADOR,F   ; resta y salta si = 0.
118      GOTO   BUCLE      ; repite el bucle hasta terminar la cuenta.
119      NOP
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.
124 
125PON_CERO CLRF   CONTADOR      ; Borra por si hubiera algo de antes.
126;===============DELAY=============
127       MOVLW   d'6'         ; Coloca el valor 5 en el contador.
128      MOVwF   CONTADOR
129BUCLE_   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.
136 
137;===============DELAY FINAL=======
138                     ; Ahora ponemos un delay para que si el ultimo bit enviado es uno no se corte antes de tiempo.
139TERMINA   MOVLW   d'8'         ; Coloca el valor 5 en el contador.
140      MOVWF   CONTADOR
141BUCLE1   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.
144;====================
145; DELAY PARA STOP-BIT
146;====================
147       MOVLW   d'10'         ; Coloca el valor 5 en el contador.
148      MOVwF   CONTADOR
149BUCLE__   DECFSZ   CONTADOR,F   ; resta y salta si = 0.
150      GOTO   BUCLE__      ; repite el bucle hasta terminar la cuenta.
151      NOP
152      BCF      PORTA,0      ; Termina el STOP-BIT, asi que volvemos a dejar RA0 en estado bajo.
153;====================
154; DELAY PARA STOP-BIT
155;====================
156      NOP
157      CLRF   MEMORIA         ; Borra el registro temporal MEMORIA.
158      RETURN            ; Vuelve al programa, donde esperara una nueva orden de envio.
159 
160;================================================
161;            FIN DE LA RUTINA
162;================================================
163 
164      END               ; Fin del programa.

Fuente:http://www.todopic.com.ar/foros/index.php?topic=22028.0

Escribe un comentario

Tu comentario