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
Tuitear 4.649 Veces leído 0 comentarios |
12 enero 2012 en Electronica | tags: Circuitos electrónicos, Electronica |