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 2 visitas.| 3408557 Visitas (desde Dic. 2011), hoy: 280 Visitas 698 Pag. Vistas , ultimos 36 dias: 10109 Visitas. 43984 Pag. Vistas. Tu IP: 18.191.223.123
Que ando curioseando:
AutosuficienciaCosas de casaElectronicaEn InternetInformáticaMundo MisticoSin categoríaSociedadTe lo recomiendo

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

Escribe un comentario

Tu comentario