I always use the internal oscillator that pics have as I have never found the need to run anything at higher frequency than 8 MHz (which is the fastest the pics I use tend to be able to go). Are there any reasons, beyond going above 8 MHz, that mean I should use an external oscillator? It just seems like one more thing to go wrong to me but I'd be interested to hear what others do.
As others have said, accurate frequency and frequency stability are reasons to use a external ceramic resonator or crystal. A resonator is several times more accurate than the internal R-C oscillator and good enough for UART communication. A crystal is much more accurate, and necessary if you are doing some other types of communication like CAN, USB, or ethernet.
Another reason for a external crystal is choice of frequency. Crystals come in a wide range of frequencies whereas the internal oscillator is usually one frequency with maybe a choice of 4x PLL enabled. Some newer 24 bit core PICs have both a multiplier and divider in the clock chain so you can hit a wide choice of frequencies from the single internal oscillator frequency.
There are of course various applications that inherently require accurate frequency or timing other than communications. Time is the property in electronics that we can measure most accurately cheaply, so sometimes the problem is transformed into one of measuring time or producing pulses with accurate timing.
Then there are applications which require some long term synchronization with other blocks. A 1% oscillator would be off by over 14 minutes per day if used as the basis for a real time clock. Accurate long term time may also be needed without having to know real time. For example, suppose you want a bunch of low power devices to wake up once every hour to exchange data for a few seconds and then go back to sleep. A 50ppm crystal (very easy to get) will be off no more than 180ms in a hour. A 1% R-C oscillator could be off by 36 seconds though. That would add significant on-time and therefore power requirements to the devices that only needed to communicate for a couple of seconds every hour.
Precision. Internal clocks are not precise, can be affected by noise.
Temperature independent precision. Typical oscillators can vary wildly. Specialty temperature compensating oscillators can be needed in low or high temp applications, or if temperature varies wildly.
Speed. Internal oscillators may not reach the highest speed of the IC. External ones can be needed for that.
Voltage. The speed of an internal timer may be dependent on the voltage it is being run at.
Multiple clocks are needed. Some applications want to share an oscillator.
Special applications where the internal clock may not be easily used. Dividing the internal clock might be harder than throwing a cheap 31 kHz watch crystal at it, for time keeping applications.
Off the top of my head, the ATMEGA 328 the arduino uses requires an external crystal at 5V for its max speed. The lily pad version runs at 8 MHz, on the internal oscillator because it's limited to that at 3.3v. The MSP430 Value Line launchpad is limited to 10 MHZ at 3V, 8 at 2.5V.
Frequency stability will be higher with an external one. So if you have a application that really depends on the mcu freq, then you may need to use a external one.
But most modern mcu:s has a quite stable internal osc, therefore I think this used to be a bigger question a couple of years ago. Also there is more and more ways to trim the internal one, and compensate for temperature drift (etc etc).
On the other hand there is other ways to make sure that you are synchronized, in some countries the freq stability in the power net is 50Hz ±0.01Hz and other places like Sweden actually has ±0.001Hz and I have seen projects using this to keep things in sync. And then you are no longer as dependent on the mcu freq and you can use the internal one. But this is a little bit of topic :)
I have actually come across a scenario where 1% was not good enough for UART.
If any of you guys have heard of the Teensy++ v1.0 microcontroller dev board, it has a terribly sensitive UART. I had my host baud set at 115200, and it set at 115200 and for the longest time could not figure out why it wasn't reading the data correctly. Turns out my host was sending closer to 114300 baud. ( 115200 - 114300 ) / 115200 = ~0.9% error. I tried it with two different MCU's and they worked fine.
Point is: regardless of your application, if greater accuracy of clock frequency is a benefit, you should use an external resonator, crystal, or even oscillator if you chip doesn't have the necessary driving circuitry.
P.S. I wonder if anyone has any insights as to what low level design choice they made on the UART hardware that makes it so sensitive?