What can you not do with the arduino? Well the truth is, if you go to the trouble of reconfiguring, not much.
I've been using AVRs for many years in various projects and recently bought an arduino for some rapid interface development.
You should understand that the arduino is just a normal AVR, with an amount of the configuration simplified. So you can effectively reconfigure most things beyond what the makers of arduino ever intended you to, to access chip features. The problem with that is, you'll get to a point where the arduino libraries become more a hinderance than a positive.
The difference between arduino and using an AVR with straight GCC isn't coding complexity, at the end of the day it's all GCC. It's when you go to straight GCC, you actually need to read the datasheet and learn how the uC works and is configured. This is the same for any other uC, PIC/TI etc.
It's got nothing to do with one way or the other being "proper" or not. It's just how much do you want to abstract yourself away from the hardware of the uC.
But I guess a few things I find fundamentally more difficult to do with Arduino vs straight GCC:
- Fully customise timers to my application (as arduino wants them for other things.)
- Calculate and optimise time critical routines, in AVRstudio with its simulator you can step through code and look at the number of cycles to complete a routine.
- In line assembly, simply for the reason above. If I'm using assembly it's usually for a small time critical part of the code like an interrupt service routine, here time tracking I think is critical.
- Simulation of all the registers. AVRstudio has a cool simulator for the 8-bit AVRs where you can see all the peripheral registers step by step.
- and finally of the things off the top of my head, the ability to use a in-circuit debugger. In this case I use the AVRDRAGON, it's cheap and works well.