-I/O pins: Control de Led 16X2
-Interrupciones: Internas y externas (Aqui no se me ocurre en que aplicarlas)
-ADC: leer algunos sensores y modificar los estados de los puertos I/O, en función de algún valor deseado, ejemplo
-Generación de PWM: Controlar la velocidad de un motor CC, Motor a pasos y un servo
-Comunicación Serie UART: Comunicación Serie con la PC usando Putty
-Comunicación SPI: Controlar lector SD
Pienso que la idea es que sepas usar el modulo, asi que iria a algo mas simple y no complicandola con la electronica, Me refiero a que aunque no sea tan visible como el motor podrias simplificarlo para que sea mas simple. Entonces mis ideas van a apuntar a eso.
I/O pins - Simple, leds + botones para leer/escribir el puerto, no tiene ningun secreto y que seguramente ya lo hiciste, hacer aunque sea 1 entrada y 2 salida ya tendrias una idea de como manejar los puertos. Leer un boton, preocuparse por el rebote del boton. Suponete algo bien simple, cada ves que presionas una salida se alterna, es decir pasa de 1 a 0. Y verificar que sea lo que hagas, ejemplo tener presionado el boton no cambie el comportamiento que deberia tener. Tambien al MISMO tiempo deberias tener otra salida que cambie cada medio segundo por ejemplo.
Timer - Usar un timer para que cambie el estado de una salida, calcular el valor que debe tener el timer para lograrlo, verificar que el tiempo sea el correcto. Cuando calcules seguramente vas a darte cuenta que tenes que recargar el Timer cada ves que inicia.
Interrupciones - Aca tenemos 2 casos:
- Externas, podemos usar el mismo ejemplo que el de I/O, y usamos RB0, esta entrada para el boton permita que sea por flanco, lo cual primero te llevaria a usar la interrupcion para hacer la misma operacion que antes ( cambiar el estado de la salida del primer led ) mientras que en tu funcion principal solo cambias continuamente el del 2do led, para que veas como se simplifica la operacion.
Tambien en las externas, deberias usar RB4 a RB7 , ya que estas son distintas a la del RB0, estas son por nivel, es decir que si la entrada cambia, sea a 1 o a 0, ya entraria a la interrupcion.
- Internas, Podemos retomar el ejemplo del Timer, nomas que esta ves nuestro while del main no va a tener nada y todo va a realizarse desde la interrupcion.
ADC - Podes usar sensores, pero tambien podrias usar un potenciometro, un terminal a los 5V, el otro terminal al GND y el punto medio con una pequeña resistencia de 1K en serie al pin del PIC. Como mostrar el resultado, lo mas simple es usar leds. Suponete que el ADC te de como resultado 10 bits, lo rotas unas cuentas veces, por ejemplo 6 veces y usas los 4 bits de mayor peso para ponerlos en alguna salida.
CCP Compare - Volver a realizar el ejemplo del Timer, solo que esta ves vas a intentar usar el CCP para que compare con el TMR1, vas a notar que si lo configuras correctamente, el CCP resetea por si solo el Timer1. Lo cual la interrupcion se simplifica y el error se reduce aun mas.
PWM - Usar 2 botones que al presionar auemnte o disminuya 10% del duty por ejemplo. Ya para este momento sabrias como usar las entradas. Como salida un led. De esa forma podes verlo y jugar con ello. Si luego queres ir mas adelante podrias usar un motor CC, recorda que la velocidad del motor DC depende de la carga.
PLUS: Los motores paso a paso los vas a manejar con un driver el cual le podes dar pulsos o si lo controlas un poco mas directo usarias una tabla y las I/O. Un servo es una buena idea para usar el PWM, tambien podria llegar el momento en que necesites hacer un PWM por software, debido a que muchas veces la frecuencia del oscilador hace que no puedas crear PWM de frecuencias bajas.
UART - Creo que es la mejor forma, si podes conseguirte un conversor TTL-USB se simplifica aun mas.
SPI - El lector SD tendrias que complicarte en la forma de inicializacion de la SD, por eso nombre usar un shift-register, como un 74xx595, que podes controlarlo con el SPI y podes ver la salida con leds, si usas un Timer por ejemplo podrias hacer que cada cierto tiempo cambie la salida, aunque sea incrementando el valor de una variable y enviando esa variable. Y es un integrado que no cuesta demasiado. Al Timer lo podes haces por interrupcion o en el main, eso queda a tu criterio.
--------------------------------------------------------
Nota: ahora que me acuerdo aprovecho aquí para plantear una duda que tengo, hasta ahora en los programas que he realizado, yo solo declaro en mi código los bits de configuración con los que voy a trabajar y los que se usar, hasta el momento son los que definen el modo de trabajo y el prescaler, pero, ¿que pasa con los demás, están des-habilitados por defecto?, o ¿debería yo indicarlos en mi fichero, e indicar que estarán des-habilitados?.
El MPLAB X, tiene un generador de bits de configuración ( En la parte de abajo creo que dice Configuration bits), el cual seleccionas desde una lista y presionas generar el cual te da el codigo para que copies y pegues. Como sugerencia deberías siempre definir todos los bits de configuración. Y si no te aparece en Windows sino me equivoco esta, esta dentro de otra opcion mas.
Despues si queres complicarte con cosas mas grandes lo haces, pero creo que de nada sirve complicarse con varias cosas que no estas acostumbrado, a solo complicarte la vida con una sola. Por eso mis ejemplos como ya dije buscan simplificar la forma de hacerlo, por mas que sean "repetitivos" o que no sean de gran satisfaccion verlos funcionar, pero tenes una salida la cual podes ver y que actue en consecuencia.