Estoy de acuerdo con Joby: Arduino es genial, pero siempre me siento sofocado por el marco con el que me rodean. Pasaría a usar C directo en su Arduino y construiría una gran cantidad de la funcionalidad de la biblioteca que proporcionaron desde cero. Por lo general, prefiero la profundidad antes que la amplitud: no solo comience en otra familia de microcontroladores utilizando más marcos proporcionados. Aprenda un poco más sobre cómo implementar algunas de estas funciones usted mismo.
Comience con un programa que funcione y reemplace las llamadas de la biblioteca Arduino con sus propias versiones, una función a la vez. Aprenderá mucho sobre los registros de control, el tiempo, las operaciones de bits, etc., si aún no lo ha hecho. Lea la hoja de datos ATMega328 en profundidad: todo lo que necesita está ahí.
Pruebe con un IDE diferente, como AVR Studio o Code :: Blocks. Aprenda la cadena de herramientas GCC. Pruebe técnicas de codificación más avanzadas: pruebas unitarias, cobertura, creación de perfiles, verificación de pelusas / férulas. Pon un RTOS en el Arduino.
Un programador / controlador combinado no es un signo de debilidad, es solo una elección de diseño. La única 'debilidad' que podría surgir es la falta de depuración en circuito. Compre un AVR Dragon y lo lamirá por $ 50.