Eu concordo com Joby - o Arduino é ótimo, mas sempre me sinto sufocado pela estrutura que me rodeia. Eu usaria o C direto no seu Arduino e criaria muitas das funcionalidades da biblioteca que eles forneciam do zero. Geralmente, prefiro a profundidade antes da amplitude - não comece apenas em outra família de microcontroladores usando estruturas fornecidas. Aprenda um pouco mais sobre como implementar algumas dessas funções você mesmo.
Comece com um programa de trabalho e substitua as chamadas da biblioteca do Arduino pelas suas próprias versões, uma função de cada vez. Você aprenderá muito sobre os registros de controle, tempo, operações de bits, etc., se ainda não o tiver. Leia a folha de dados do ATMega328 em detalhes - tudo o que você precisa está lá.
Experimente um IDE diferente como o AVR Studio ou o Code :: Blocks. Aprenda a cadeia de ferramentas do GCC. Experimente técnicas de codificação mais avançadas - testes de unidade, cobertura, criação de perfil, verificação de fiapos / talas. Coloque um RTOS no Arduino.
Um programador / controlador combinado não é um sinal de fraqueza - é apenas uma opção de design. A única "fraqueza" que poderia surgir é a falta de depuração no circuito. Compre um dragão AVR e você terá isso por US $ 50.