Está en la página 1de 3

APÉNDICE A: CÓDIGO DE MICROCONTROLADOR

;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----- -----
;----- Universidad de las Américas Puebla -----
;----- Departamente de Ing. Electrónica -----
;----- TESIS -----
;----- Primavera 2006 -----
;----- Luis R. Martinez Nunez ID. 118639 -----
;----- -----
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----- -----
;----- Este es un programa que convierte una señal analogica a -----
;----- una señal digital y agrega componente de protocolo MIDI. -----
;----- -----
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------

list p=16F877a ; list directive to define processor


#include <p16F877a.inc> ; processor specific variable definitions

;----------------------------------------------------------------------------
;----- ----- ----- ----- DECLARACION DE VARIABLES ----- ----- ----- -------
;----------------------------------------------------------------------------

WTEMP EQU 0X20


STATEMP EQU 0X21
CONVERSION EQU 0X22
RETRASO1 EQU 0X23
RETRASO2 EQU 0X24
ANTERIOR EQU 0X25
TEMPORAL EQU 0X26

;----------------------------------------------------------------------------
;----- ----- ----- ----- VECTOR DE INTERRUPCION ----- ----- ----- -------
;----------------------------------------------------------------------------

ORG 0X00
NOP
NOP
GOTO INICIALIZA
; ORG 0X04
; GOTO ISR

;----------------------------------------------------------------------------
;----- ----- ----- ----- INICIALIZACION DE VARIABLES ----- ----- ---- -------
;----------------------------------------------------------------------------

ORG 0X50
INICIALIZA

;-------------- LIMPIA REGISTROS

CLRF ADRESH
CLRF ADRESL
CLRF STATUS
CLRF WTEMP
CLRF STATEMP
CLRF CONVERSION
CLRF ANTERIOR
CLRF TEMPORAL
CLRF RETRASO1
CLRF RETRASO2
CLRF PORTA
CLRF PORTC
CLRF PORTD

;-------------- CONFIGURACION DE PUERTOS

BSF STATUS, RP0 ; Selecciona Banco1


CLRF TRISA
MOVLW 0X01 ; Un pin de Entrada en PuertoA
MOVWF TRISA
CLRF TRISC ; PuertoC de Salida = Pin TX salida
CLRF TRISD ; PuertoD de Salida (TEMPORAL)
BCF STATUS, RP0 ; Selecciona Banco0

;-------------- TRANSMISION CON USART

108
BSF STATUS, RP0 ; Selecciona Banco1
; BSF TXSTA, BRGH ; High-Speed
MOVLW 0X27
MOVWF SPBRG ; Velocidad = 31.250Kbps, Fosc = 20MHz
MOVLW 0X26
MOVWF TXSTA ; 8 bits, TXEN ON, Asincrona, BGRH = 1
BCF STATUS, RP0 ; Selecciona Banco0
BSF RCSTA, SPEN ; Habilita los pines para transmision

;-------------- CONFIGURACION ADC

BSF STATUS, RP0 ; Selecciona Banco1


CLRF ADCON1 ; Entradas A/D todas analogicas
BCF STATUS, RP0 ; Selecciona Banco0
MOVLW 0x41 ; Reloj/8, Canal 0, DONE, A/D On
MOVWF ADCON0

;-------------- COMIENZA CONVERSION

BSF ADCON0, 0 ; Activa convertidor


CALL OFFSET1 ; Tacq
CALL ACQ_TIME
BSF ADCON0, GO ; Inicia conversion despues de Tacq desde ADCON0,ON

;-------------- CONFIGURACION DE INTERRUPCIONES

CLRF INTCON ; Limpia interrupciones


CLRF PIR1 ; Limpia banderas
; BSF STATUS, RP0 ; Selecciona Banco1
; BSF PIE1, ADIE ; Habilita interrupciones
; BCF STATUS, RP0 ; Selecciona Banco0
BCF PIR1, ADIF ; Limpia interrupt flag
; BSF INTCON, PEIE ; Habilita interrupciones de perifericos
; BSF INTCON, GIE ; Habilita interrupciones
; BSF RCSTA, CREN ; Habilita los pines para transmision

;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----- ----- ----- ----- M A I N ----- ----- ----- ----- -----
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------

MAIN
NOP
CALL TRANSMITE
NOP
NOP
GOTO MAIN
NOP

-----------------------------------------------------------------------------
;----- ----- ----- ----- ----- SUBRUTINAS ----- ----- ----- -------------
;----------------------------------------------------------------------------

TRANSMITE
BTFSS PIR1, ADIF ; Checa si ya termino la conversion A/D
GOTO TRANSMITE
BCF PIR1, ADIF ; Limpia bandera de fin de conversion A/D
COMF ADRESH, 1
MOVF ADRESH, W ; Mueve la conversion al WREG
MOVWF CONVERSION ; Mueve la conversion a CONVERSION
MOVWF TEMPORAL ; Mueve la conversion a TEMPORAL
RRF CONVERSION, 1 ; Rota a la derecha para rango de 0-127
BCF CONVERSION, 7 ; Apaga el MSB de CONVERSION que viene de carry
MOVF CONVERSION, W
MOVWF PORTD ; Muestra la conversion en el PuertoD (TEMPORAL)

;CONTENSION
MOVF TEMPORAL, W ; Mueve la conversion al WREG
SUBWF ANTERIOR
BTFSC STATUS, Z ; Salta si esta apagado Zero (son iguales no envia) y polea
GOTO TACQ ; se cicla
NOP

;CC
MOVLW 0xB0 ; Mueve Controlador Canal 0 al TXREG para transmision
MOVWF TXREG
CALL LIBRE ; Identifica cuando se termina de transmitir por USART
BCF STATUS, RP0 ; Selecciona Banco0 despues de LIBRE

109
MOVLW 0x12 ; Mueve Numero de Controlador al TXREG para transmision
MOVWF TXREG ; 0x01 Modulation Wheel
CALL LIBRE ; Llama a LIBRE para transmitir el valor
BCF STATUS, RP0 ; Selecciona Banco0 despues de LIBRE

MOVF CONVERSION, W ; Recupera valor de CONVERSION para Transmitirlo


MOVWF TXREG ; Mueve la conversion a TXREG para ser transmitida
CALL LIBRE ; Identifica cuando se termina de transmitir por USART
BCF STATUS, RP0 ; Selecciona Banco0 despues de LIBRE

CALL OFFSET2 ; Delay


CALL ACQ_TIME

TACQ
MOVF TEMPORAL, W ; Mueve la conversion al WREG
MOVWF ANTERIOR ; La conversion ya es "anterior"
CALL OFFSET1 ; Tacq
CALL ACQ_TIME
BSF ADCON0, GO ; Reinicia conversion despues de Tacq
RETURN

LIBRE
BSF STATUS, RP0 ; Selecciona Banco1
BTFSC TXSTA, TRMT ; Salta si esta apagado TRMT (aun hay transmision) y polea
RETURN
GOTO LIBRE

OFFSET1
MOVLW 0X16 ; Define valores para registros de retardo
MOVWF RETRASO1 ; 20us de retraso para carga de capacitor de ADC
MOVLW 0X01
MOVWF RETRASO2
RETURN

OFFSET2
MOVLW 0XFF ; Define valores para registros de retardo
MOVWF RETRASO1 ; 50ms de retraso para NOTE ON / NOTE OFF MIDI
MOVLW 0XF4
MOVWF RETRASO2
RETURN

ACQ_TIME
NOP
DECFSZ RETRASO1 ; Ciclo de decremento de registros de retardo
GOTO ACQ_TIME
DECFSZ RETRASO2
GOTO ACQ_TIME
RETURN

END

110

También podría gustarte