Anda di halaman 1dari 9

Proyecto: Afinador digital microprocesado

Proyecto de Microprocesadores I del CENT57 AFINADOR DIGITAL MICROPROCESADO Alumnos: Damian O. Macarrein Gastn M. Murphy Ao 2002

Introduccin
Este afinador digital esta diseado para la medicin de frecuencia de las seis cuerdas de la guitarra (que van desde los 164Hz a los 660Hz). Como se ve en la figura el corazn de este afinador digital es el microcontrolador PIC16F84, en el cual se encuentra todo el software, es decir el programa en s. Externamente cuenta con 21 leds, 7 de los leds son para el lado izquierda del led central, que es cuando esta desafinado y otros 7 leds son para la derecha del led central, que es cuando la cuerda esta pasada. Adems hay 6 leds para las cuerdas y un led de ok, que es para saber cuando esta afinada la cuerda que seleccion. Cuenta tambin con e/s que son RB1, 2,3,4,5,6,7 (en este caso las usamos como salidas) donde colocamos resistencias de 330? , para limitar la corriente hacia los leds. Existen tres pulsadores, de los cuales usamos dos, uno para correr la cuerda a la derecha y otro viceversa. Para el clock del PIC se conecta un cristal de 4Mhz, con dos capacitores a masa para el ruido.

Gaston M. Murphy Damian O. Macarrein


Proyecto de Microprocesadores I del CENT57 Ao 2002

Proyecto: Afinador digital microprocesado

Como lo indica la figura cuando el afinador esta sin seal se encienden los leds de los estremos. La entrada RB0 se usa para el ingreso de la seal a medir. Y la entrada RB3, esta conectada con los tres pulsadores los cuales cuando accionamos alguno de ellos se cierra el circuito e ingresa el pulso proveniente del pulsador. Para ingresar la seal al PIC previamente debemos adaptar la seal proveniente de la guitarra con el siguiente circuito:

Gaston M. Murphy Damian O. Macarrein


Proyecto de Microprocesadores I del CENT57 Ao 2002

Proyecto: Afinador digital microprocesado

Con este circuito en la etapa amplificadora, le damos ganancia al micrfono y tambin eliminamos el ruido de lnea(50Hz), que no es deseable. En la etapa siguiente seleccionamos una banda de frecuencia en la que vamos a trabajar, ya que las frecuencias de la guitarra van desde los 164 a los 660HZ, la frecuencia de corte para el pasa bajos es de 700Hz y para el pasa altos es de 120Hz. La ultima etapa es un comparador de precisin el cual acta como detector de niveles de voltaje, entregando una onda cuadrada con un nivel de salida con magnitudes hasta los 40v, en nuestro caso con 5v ya ingresamos al PIC que es de tecnologa TTL.

Desarrollo:
El programa bsicamente se maneja mediante interrupciones, es decir internamente cuando llega una interrupcin se ejecuta otras partes del programa, funciona asincrnicamente. Las interrupciones pueden provenir desde la entrada de seal(RB0) o por timer(TRM0) Cuenta con una macro que no es lo mismo que la subrutina, y que en este caso sirve para el recupero de todos registros en interrupciones. Tambin hay una subrutina que se llama GET_TIEMPO_DE _MUESTREO, donde llamamos al tiempo de muestreo. Adentro de esta subrutina se encuentran los valores de cada cuerda(expresada en periodo cada cuerda), cuando la base de tiempo de una cuerda coincide con los 100 pulsos del contador de muestreo, genera una interrupcin de timer(TRM0). Cuenta con un multiplexado y lectura de los pulsadores, tambin el armado de la memoria de leds, los cuales mostrar en el multiplexado. El programa principal esta dado por la programacin de los puertos, del registro OPTION, y del INTCON, y el reseteo de la entrada de seal, en primer lugar. En segundo lugar inicializamos las variables y ponemos los distintos contadores en cero. Despus esta el programa de interrupcin el cual se fija si llego una nueva interrupcin y tambin de donde provino. Si es del timer entonces el contador de milisegundos se incrementa para despus de algunos clculos multiplexarlo. Si la vino de RB0 es por que llego un flanco entonces se incrementa otro contador, si el calculo es exacto es porque la cuerda que seleccion esta afinada entonces se enciende el led de ok, sino va a depender si la frecuencia que esta entrando es mayor o menor al valor correcto. Esto se da para cada cuerda. El programa termina con el recupero de los registros a travs de la macro.

Programa:
;-------------------------------------------------------------; ; AFINADOR DIGITAL MICROPROCESADO ; MICROPROCESADORES I - CENT57 ; Murphy Macarrein ; ;-------------------------------------------------------------#INCLUDE"P16F84.INC" LIST p=16F84, r=dec, f=INHX8M __CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC

Gaston M. Murphy Damian O. Macarrein


Proyecto de Microprocesadores I del CENT57 Ao 2002

Proyecto: Afinador digital microprocesado

CONTMU CONTULT CONTMS COL FLAGS MCOL1 MCOL2 MCOL3 CUERDA ctemp CONT_H CONT_L _w_temp _status_temp

EQU EQU EQU EQU EQU EQU EQU EQU EQU equ equ equ equ equ

10h 11h 12H 13h 14H 15H 16H 17H 18H 19h 1Ah 1Bh 1Ch 1Dh

;contador de muestras ;ultimo contador ;contador de milisegundos ;cont de multiplexado (columnas) ;diferentes banderas (ver abajo) ;valores de los leds en cada columna ;valores de los leds en cada columna ;valores de los leds en cada columna ;cuerda seleccionada actual (1 a 6) ;contador temporal

; Algunas definiciones utiles: #define CALC_OK FLAGS,0 #define OVERFLOW FLAGS,1 #define TIEMPO_MUX FLAGS,2 #define BOTON1 FLAGS,3 #define BOTON2 FLAGS,4 #define BOTON3 FLAGS,5 #define LADOIZQ FLAGS,6 #define TIEMPO_BOTON FLAGS,7

; indica que no hay mas seal en la ent.

; leds de la izquierda

;-------------------------------------------------------------; MACROS ;-------------------------------------------------------------PushAll macro ; salvo todos los registros en interrupcion movwf _w_temp swapf STATUS,w movwf _status_temp endm PopAll macro swapf movwf swapf swapf endm ; recupero todos los registros en interrupcion _status_temp,w STATUS _w_temp,f _w_temp,w

;-------------------------------------------------------------; VECTOR DE RESET ;-------------------------------------------------------------ORG 0 GOTO START ;-------------------------------------------------------------; VECTOR DE INTERRUPCION ;-------------------------------------------------------------ORG 4 GOTO INTERRUPCION

;-------------------------------------------------------------; SUBRUTINAS ;-------------------------------------------------------------GET_TIEMPO_DE_MUESTREO: MOVF CUERDA,W ADDWF PCL,F NOP RETLW 0XE4 RETLW 0XF7

;el tiempo depende de la cuerda actual ; ; no vale ; cuerda 1 ; cuerda 2

Gaston M. Murphy Damian O. Macarrein


Proyecto de Microprocesadores I del CENT57 Ao 2002

Proyecto: Afinador digital microprocesado

RETLW RETLW RETLW RETLW

0XEE 0XDE 0XCC 0XA7

; ; ; ;

cuerda cuerda cuerda cuerda

3 4 5 6

;-------------------------------------------------------------; MULTIPLEXADO Y LECTURA DE LOS PULSADORES ;-------------------------------------------------------------MUX: CLRF PORTA ; APAGO TODOS LOS LEDS MOVF COL,W ; SIGUIENTE COLUMNA ADDWF PCL,F GOTO COL1 ;COL=0 GOTO COL2 ;COL=1 GOTO COL3 ;COL=2 COL1: MOVF MCOL1,W ;saco la col 1 al puerto MOVWF PORTB ;saco la col 1 al puerto MOVLW 1 ;activo la columna 1 MOVWF PORTA ;activo la columna 1 BTFSC PORTA,3 ;memorizo el bit de entrada del teclado BSF BOTON1 ;se pulso! (lo borra el timer c/500ms) GOTO FIN_MUX ; COL2: MOVF MCOL2,W ;saco la col 2 al puerto MOVWF PORTB ;saco la col 2 al puerto MOVLW 2 ;activo la columna 2 MOVWF PORTA ;activo la columna 2 BTFSC PORTA,3 BSF BOTON2 GOTO FIN_MUX COL3: MOVF MCOL3,W ;saco la col 3 al puerto MOVWF PORTB ;saco la col 3 al puerto MOVLW 4 ;activo la columna 3 MOVWF PORTA ;activo la columna 3 BTFSC PORTA,3 BSF BOTON3 FIN_MUX: INCF COL,F ; siguiente columna MOVF COL,W XORLW 3 ; vale 3 ? BTFSC STATUS,Z ; " CLRF COL ; si, vale 3 lo hago 0. BCF TIEMPO_MUX ; preparo el proximo multiplexado RETURN ;-------------------------------------------------------------; ARMA LOS LEDS QUE MOSTRARA EL MULTIPLEXADO ;-------------------------------------------------------------ARMA_MEM_LEDS: ; primero borro todo: movlw 0xff movwf MCOL1 movwf MCOL2 movwf MCOL3 ; si OVERFLOW = 1 significa que no hay mas seal, ; enciendo los dos leds de las puntas: btfss OVERFLOW goto xxx bcf MCOL1,7 bcf MCOL2,7 xxx BSF LADOIZQ ; preparo flag ; cuantas muestras conte? MOVF CONTULT,W XORLW 100 ; valor exacto ?

Gaston M. Murphy Damian O. Macarrein


Proyecto de Microprocesadores I del CENT57 Ao 2002

Proyecto: Afinador digital microprocesado

BTFSC GOTO MOVF SUBLW BTFSC GOTO BCF MOVLW SUBWF SIGO ; ; ; ;

STATUS,Z ledOKon CONTULT,W 100 STATUS,C SIGO LADOIZQ 100 CONTULT,W

; SI. prendo LED de OK ; NO. ; son mas de 100? (CONTULT-100) ; ; ; ; SI, el resultado es positivo NO, dio negativo. hago la resta al reves: hago la resta al reves:

el valor de W es la diferencia de muestras entre 100 (el valor exacto) y el valor calculado. LADOIZQ es el signo. recorro el valor diferencia de izq a derecha y el 1er 1 que encuentro es el led que voy a encendeder.

; guardo w para poder testearlo: movwf ctemp btfsc ctemp,7 goto led7on btfsc ctemp,6 goto led7on btfsc ctemp,5 goto led6on btfsc ctemp,4 goto led5on btfsc ctemp,3 goto led4on btfsc ctemp,2 goto led3on btfsc ctemp,1 goto led2on btfsc ctemp,0 goto led1on ; si ctemp estaba todo en 0, prendo el led 7: ; (no puede valer 0!!!) led7on btfsc bcf btfss bcf goto led6on btfsc bcf btfss bcf goto led5on btfsc bcf btfss bcf goto led4on btfsc bcf btfss bcf goto led3on btfsc bcf btfss bcf goto LADOIZQ MCOL2,7 LADOIZQ MCOL1,7 aml1 LADOIZQ MCOL2,6 LADOIZQ MCOL1,6 aml1 LADOIZQ MCOL2,5 LADOIZQ MCOL1,5 aml1 LADOIZQ MCOL2,4 LADOIZQ MCOL1,4 aml1 LADOIZQ MCOL2,3 LADOIZQ MCOL1,3 aml1

led2on btfsc LADOIZQ bcf MCOL2,2

Gaston M. Murphy Damian O. Macarrein


Proyecto de Microprocesadores I del CENT57 Ao 2002

Proyecto: Afinador digital microprocesado

btfss LADOIZQ bcf MCOL1,2 goto aml1 led1on btfsc bcf btfss bcf goto ledOKon bcf LADOIZQ MCOL2,1 LADOIZQ MCOL1,1 aml1

MCOL3,1

; led de OK

aml1

fts:

; enciendo el led de la cuerda actual: ; (bits 7:2 de MCOL3) ; como CUERDA vale de 1 a 6, multiplico por 2: bcf STATUS,C ; multiplico CUERDA x 2 rlf CUERDA,w ; " addwf PCL,f ; tabla de saltos (salta de a 2) nop ; (no se usa) nop bcf MCOL3,2 ; cuerda 1 goto fts bcf MCOL3,3 ; cuerda 2 goto fts bcf MCOL3,4 ; cuerda 3 goto fts bcf MCOL3,5 ; cuerda 4 goto fts bcf MCOL3,6 ; cuerda 5 goto fts bcf MCOL3,7 ; cuerda 6 ;-------BCF CALC_OK ; termine el proceso. RETURN

;-------------------------------------------------------------; los botones cambian el funcionamiento del sistema ;-------------------------------------------------------------VER_BOTONES ; cada 500ms puedo ver los botones: ; btfss TIEMPO_BOTON ;es hora de ver boton? ; return ;no. ; bcf TIEMPO_BOTON ;lo borro btfsc call btfsc call btfsc call RETURN BOTON1 boton1_click BOTON2 boton2_click BOTON3 boton3_click

;------------------------------------; el boton 1 mueve a la der. boton1_click ; cambio de cuerda decfsz CUERDA,F ; sig. cuerda, es 0 ? goto fin_b1 ; no. movlw 6 ; si, poner cuerda en 6 movwf CUERDA ; borro el flag para no detectarlo mas, por lo menos hasta los ; prox 500ms. fin_b1 bcf BOTON1 RETURN ;------------------------------------; el boton 2 mueve a la izq. boton2_click

Gaston M. Murphy Damian O. Macarrein


Proyecto de Microprocesadores I del CENT57 Ao 2002

Proyecto: Afinador digital microprocesado

incf movf xorlw BTFSS goto movlw movwf fin_b2 bcf RETURN

CUERDA,F CUERDA,w 7 STATUS,Z fin_b2 1 CUERDA BOTON2

; ; ; ; ; ;

sig. cuerda, es 7 ? " " " no. si, poner cuerda en 1

boton3_click ; ...proceso del boton 3... bcf BOTON3 RETURN ;-------------------------------------------------------------; Programa Principal ;-------------------------------------------------------------START: BSF STATUS,RP0 MOVLW B'00001000' MOVWF TRISA MOVLW B'00000001' MOVWF TRISB MOVLW B'01001000' MOVWF OPTION_REG MOVLW B'10110000' MOVWF INTCON BCF STATUS,RP0 ; SIN PRESCALER

; USO INT DE TMR0 Y RB0

; inicializo variables CLRF MOVLW MOVWF CLRF movlw movwf movwf movlw MOVWF CLRF CLRF CLRF CLRF CLRF BCF CALL iLOOP: ; BTFSC CALL BTFSC CALL CALL GOTO FLAGS 6 CUERDA COL 0xff MCOL1 MCOL2 0x7f ; (LED de cuerda 6 ON) MCOL3 CONT_H CONT_L CONTMU CONTULT CONTMS OVERFLOW GET_TIEMPO_DE_MUESTREO CALC_OK ARMA_MEM_LEDS TIEMPO_MUX MUX VER_BOTONES iLOOP ; ; ; ; ; puedo cambiar los leds? si. es tiempo de multiplexar? si. acciones de los botones

;-------------------------------------------------------------; Programa de Interrupcion ; - cada n microseg se interrumpe ; - pero n depende de la cuerda ;-------------------------------------------------------------INTERRUPCION: PushAll ; salvo los registrtos BTFSC INTCON,INTF ; de donde proviene la interrupcion? GOTO RB0INT ; de RB0 (flanco activo de entrada)

Gaston M. Murphy Damian O. Macarrein


Proyecto de Microprocesadores I del CENT57 Ao 2002

Proyecto: Afinador digital microprocesado

; proceso la interrupcion de timer: ; (1) - contador del multiplexado ; del TIMER INCF CONTMS,F ; cuento milisegundos para el multiplexado MOVF CONTMS,W XORLW .10 ; de 1.5 ms a 6.1 ms BTFSS STATUS,Z goto s0 BSF TIEMPO_MUX ; es tiempo de multiplexar! clrf CONTMS s0: ; (2) - se cumplio los 500ms aprox.? ; CONT_H y CONT_L tiene que valer 4F00 ; y solo miramos CONT_H=4F ; entonces, el cont va de 0 a 4F00 (20224), o sea, ; min=303,360 ms max= 1233,664 ms incfsz CONT_L,f goto sigo_aca incf CONT_H,f movf CONT_H,w ; vale 4f? xorlw 0x4F ; " btfss STATUS,Z ; " goto sigo_aca ; no. bsf TIEMPO_BOTON ; si, ya se cumplieron los 500ms clrf CONT_H clrf CONT_L ; (3) - contador de muestreo sigo_aca INCF CONTMU,F ; otra muestra mas... INCFSZ CONTMU,W ; hay mas de FF? GOTO FIN_INT ; no. BSF OVERFLOW ; si, error de overflow. seteo el bit de error GOTO FIN_INT ; proceso la interrupcion de RB0 -> entrada de frec. a medir ; (llego un flanco) RB0INT: ; guardo el ultimo valor medido: MOVF CONTMU,W MOVWF CONTULT ; reseteo contadores: BCF OVERFLOW CLRF CONTMU ; indico mediante el flag CALC_OK que ya esta calculado: ; (hay disponible un valor de medicion para mostrar en ; los leds.) BSF CALC_OK FIN_INT: ; cargo el timer con el valor q' depende la cuerda actual ; y lo inicializo: CALL GET_TIEMPO_DE_MUESTREO MOVWF TMR0 BCF INTCON,T0IF BCF INTCON,INTF PopAll ; RECUPERAR REGISTROS RETFIE ;-------------------------------------------------------------; FIN ;-------------------------------------------------------------END

Gaston M. Murphy Damian O. Macarrein


Proyecto de Microprocesadores I del CENT57 Ao 2002

Anda mungkin juga menyukai