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 STATEMP CONVERSION RETRASO1 RETRASO2 ANTERIOR TEMPORAL EQU EQU EQU EQU EQU EQU EQU 0X20 0X21 0X22 0X23 0X24 0X25 0X26 ;---------------------------------------------------------------------------;----- ----- ----- ----VECTOR DE INTERRUPCION ----- ----- ----- ------;---------------------------------------------------------------------------- ; ; ORG NOP NOP GOTO ORG GOTO 0X00 INICIALIZA 0X04 ISR ;---------------------------------------------------------------------------;----- ----- ----- ----- INICIALIZACION DE VARIABLES ----- ----- ---- ------;---------------------------------------------------------------------------ORG INICIALIZA 0X50 ;-------------- LIMPIA REGISTROS CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF ADRESH ADRESL STATUS WTEMP STATEMP CONVERSION ANTERIOR TEMPORAL RETRASO1 RETRASO2 PORTA PORTC PORTD ;-------------- CONFIGURACION DE PUERTOS BSF CLRF MOVLW MOVWF CLRF CLRF BCF STATUS, RP0 TRISA 0X01 TRISA TRISC TRISD STATUS, RP0 ; Selecciona Banco1 ; Un pin de Entrada en PuertoA ; PuertoC de Salida = Pin TX salida ; PuertoD de Salida (TEMPORAL) ; Selecciona Banco0 ;-------------- TRANSMISION CON USART 108 ; BSF BSF MOVLW MOVWF MOVLW MOVWF BCF BSF STATUS, RP0 TXSTA, BRGH 0X27 SPBRG 0X26 TXSTA STATUS, RP0 RCSTA, SPEN ; Selecciona Banco1 ; High-Speed ; Velocidad = 31.250Kbps, Fosc = 20MHz ; 8 bits, TXEN ON, Asincrona, BGRH = 1 ; Selecciona Banco0 ; Habilita los pines para transmision ;-------------- CONFIGURACION ADC BSF CLRF BCF MOVLW MOVWF STATUS, RP0 ADCON1 STATUS, RP0 0x41 ADCON0 ; ; ; ; Selecciona Banco1 Entradas A/D todas analogicas Selecciona Banco0 Reloj/8, Canal 0, DONE, A/D On ;-------------- COMIENZA CONVERSION BSF CALL CALL BSF ADCON0, 0 OFFSET1 ACQ_TIME ADCON0, GO ; Activa convertidor ; Tacq ; Inicia conversion despues de Tacq desde ADCON0,ON ;-------------- CONFIGURACION DE INTERRUPCIONES ; ; ; ; ; ; CLRF CLRF BSF BSF BCF BCF BSF BSF BSF INTCON PIR1 STATUS, RP0 PIE1, ADIE STATUS, RP0 PIR1, ADIF INTCON, PEIE INTCON, GIE RCSTA, CREN ; ; ; ; ; ; ; ; ; Limpia interrupciones Limpia banderas Selecciona Banco1 Habilita interrupciones Selecciona Banco0 Limpia interrupt flag Habilita interrupciones de perifericos Habilita interrupciones Habilita los pines para transmision ;---------------------------------------------------------------------------;---------------------------------------------------------------------------;----- ----- ----- ----M A I N ----- ----- ----- ----- ----;---------------------------------------------------------------------------;---------------------------------------------------------------------------MAIN NOP CALL NOP NOP GOTO NOP TRANSMITE MAIN ----------------------------------------------------------------------------;----- ----- ----- ----- ----SUBRUTINAS ----- ----- ----- ------------;---------------------------------------------------------------------------TRANSMITE BTFSS GOTO BCF COMF MOVF MOVWF MOVWF RRF BCF MOVF MOVWF ;CONTENSION MOVF SUBWF BTFSC GOTO NOP PIR1, ADIF TRANSMITE PIR1, ADIF ADRESH, 1 ADRESH, W CONVERSION TEMPORAL CONVERSION, 1 CONVERSION, 7 CONVERSION, W PORTD ; Checa si ya termino la conversion A/D ; Limpia bandera de fin de conversion A/D ; ; ; ; ; Mueve la conversion al WREG Mueve la conversion a CONVERSION Mueve la conversion a TEMPORAL Rota a la derecha para rango de 0-127 Apaga el MSB de CONVERSION que viene de carry ; Muestra la conversion en el PuertoD (TEMPORAL) TEMPORAL, W ANTERIOR STATUS, Z TACQ ; Mueve la conversion al WREG 0xB0 TXREG LIBRE STATUS, RP0 ; Mueve Controlador Canal 0 al TXREG para transmision ; Salta si esta apagado Zero (son iguales no envia) y polea ; se cicla ;CC MOVLW MOVWF CALL BCF ; Identifica cuando se termina de transmitir por USART ; Selecciona Banco0 despues de LIBRE 109 MOVLW MOVWF CALL BCF 0x12 TXREG LIBRE STATUS, RP0 ; ; ; ; Mueve Numero de Controlador al TXREG para transmision 0x01 Modulation Wheel Llama a LIBRE para transmitir el valor Selecciona Banco0 despues de LIBRE MOVF MOVWF CALL BCF CONVERSION, W TXREG LIBRE STATUS, RP0 ; ; ; ; Recupera valor de CONVERSION para Transmitirlo Mueve la conversion a TXREG para ser transmitida Identifica cuando se termina de transmitir por USART Selecciona Banco0 despues de LIBRE CALL CALL OFFSET2 ACQ_TIME ; Delay MOVF MOVWF CALL CALL BSF RETURN TEMPORAL, W ANTERIOR OFFSET1 ACQ_TIME ADCON0, GO ; Mueve la conversion al WREG ; La conversion ya es "anterior" ; Tacq BSF BTFSC RETURN GOTO STATUS, RP0 TXSTA, TRMT ; Selecciona Banco1 ; Salta si esta apagado TRMT (aun hay transmision) y polea MOVLW MOVWF MOVLW MOVWF RETURN 0X16 RETRASO1 0X01 RETRASO2 ; Define valores para registros de retardo ; 20us de retraso para carga de capacitor de ADC MOVLW MOVWF MOVLW MOVWF RETURN 0XFF RETRASO1 0XF4 RETRASO2 ; Define valores para registros de retardo ; 50ms de retraso para NOTE ON / NOTE OFF MIDI RETRASO1 ACQ_TIME RETRASO2 ACQ_TIME ; Ciclo de decremento de registros de retardo TACQ ; Reinicia conversion despues de Tacq LIBRE LIBRE OFFSET1 OFFSET2 ACQ_TIME NOP DECFSZ GOTO DECFSZ GOTO RETURN END 110