TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: adri_mele en 08 de Marzo de 2014, 21:06:16
-
Hola, desearía ayuda para programar el PIC 16F84A en el programa MPLAB IDE, y es que es un proyecto que tengo que hacer, pero estamos todos bastantes perdidos en clase y necesitamos entregar el proyecto pasado mañana. No pido que lo hagan, pero si que me den unas pautas por las cuales guiarme. El problema es este:
;Diseñar un circuito electrónico con microcontrolador PIC 16F84A, donde en el puerto B se conectan 7 pulsadores que
corresponden a las 7 notas de la escala musical, DO=RB0, RE=RB1, MI=RB2, FA=RB3, SOL=RB4, LA=RB5, SI=RB6. Al activar
cualquiera de los pulsadores, en el pin RA0 del puerto A se debe generar la nota correspondiente al pulsador activado.
Si se activan varios pulsadores a la vez, en la salida se debe generar la frecuencia correspondiente al pulsador cuyo
número de orden sea mayor, por ejemplo, si se pulsan a la vez RB4 y RB6 de debe generar la frecuencia correspondiente
al pulsador que está conectado al pin RB6. (Do=261Hz, Re=293Hz, Mi=329Hz, Fa=349Hz, Sol=393Hz, La=440Hz y Si=493Hz).
Tengo el repertorio de instrucciones del PIC, y tengo los Hz de cada nota pasadas a 'ms' por la fórmula Temporización = Tcm x Prescaler x (256 - Carga TMR0). Pero mi problema es que me pierdo a la hora de configurar cada nota para que suene, llamar a las subrutinas y todo eso... Tengo configurado esto, pero me temo que va mal:
;ZONA DE CÓDIGOS*******************************************************************************************************
ORG 0
bsf STATUS,RP0
movlw b'01111111'
movwf TRISB
movlw b'11110'
movwf TRISA
movlw b'00000010'
movwf OPTION_REG
bcf STATUS,RP0
Principal
btfsc PORTB,6
call Nota_SI
btfsc PORTB,5
call Nota_LA
btfsc PORTB,4
call Nota_SOL
btfsc PORTB,3
call Nota_FA
btfsc PORTB,2
call Nota_MI
btfsc PORTB,1
call Nota_RE
btfsc PORTB,0
call Nota_DO
goto Principal
Nota_SI movlw TMR0_SI
movwf PORTA
goto Fin
Nota_LA movlw TMR0_LA
movwf PORTA
goto Fin
Nota_SOL movlw TMR0_SOL
movwf PORTA
goto Fin
Nota_FA movlw TMR0_FA
movwf PORTA
goto Fin
Nota_MI movlw TMR0_MI
movwf PORTA
goto Fin
Nota_RE movlw TMR0_RE
movwf PORTA
goto Fin
Nota_DO movlw TMR0_DO
movwf PORTA
Cualquier ayuda me vendrá de lujo! -.-'
Gracias y un saludo foreros! ;)
-
La verdad no he corrido tu programa pero asi como tienes ordenados los pulsadores resuelves el problema de que suene la nota correspondiente al pin mayor.
ahoraa en cuanto a la llamada de funciones cuando usas un call te llevara a una rutina y esta debe de terminar con un "return" para que regrese a donde te quedaste cuabdo la llamaste, ya que si lo dejas asi llenaras la pila de memoria y terminara por fallarte tu programa,
y en tu programa no generas ninguna frecuencia, lo que estas haciendo es mover un valor al puerto A
Saludos
-
Lo que te comenta dolphin son cuestiones básicas de la programación en ASM, quizas es conveniente que hagas un programilla mas simple para entender como funciona la llamada a subrutina.
Con respecto a generar las notas, o sea la frecuencia en el RA0 creo que deberias trabajar con interrupciones por el timer, si no manejas bien el tema de subrutinas, cuando implementes las interrupciones se te va a complicar un poco.
-
Adri bienvenido al foro.
Como bien te dicen los compañeros no estas generando ninguna frecuencia, no terminas las subrutinas con "return" por lo que se te perdera el programa, ademas las subrutinas solo cargan el TIMER0 con un valor y despues lo pasas al PORTA??? No tiene ningun sentido.
Lo mejor es que empieces por este curso de asm, aqui:
http://www.todopic.com.ar/foros/index.php?topic=24720.0