I've used AVR's for about 7 years, and I admit, some of the peripherals drove me batty the first time I tried to get them working. However, the datasheet was a great resource and everything was very well explained.
I started a new job a few weeks ago and we use PICs there. I try to keep an open mind about things so that I don't become a fanboy without reason. I honestly looked forward to trying out a PIC.
The first PIC I used was a 16 bit one and it had some really nice hardware features actually. Most of the peripherals were pin mappable, so you could put the UARTs, SPI, I2C, on just about any pin. It also has a really useful very low current source (0.55uA) which we used to make capacitve touch switches. Here's the problem...
THE DATASHEET SUCKS!!!!!
Code examples... WRONG!!! FLAT WRONG!!! THEY DONT WORK!!!
Register descriptions.... DO NOT EXIST!!! Ok, I enable IPMI by setting that bit to 1. WTF'ing hel is IPMI???
Peripheral descriptions.... INCOMPLETE!!! Ok, the CTMU can be set to trigger an ADC conversion. Nice, exactly what I need. HOW THE F DO I DO IT!!! I SET THE BITS IN THE CTMU AND THE ADC BUT IT WONT TRIGGER!!!
Ok, so lets move on to the next project, this one uses an older PIC12. Oh crap, our $900 compiler doesn't support it and the boss is out. Thats ok, I can write it in assembly.
WTF!!?? ONE WORKING REGISTER! OMG I need to do half a dozen shifts in and out of RAM to do 16 bit math now!
BANK SWITCHING!!! Oh crap, so now half the time I want to write to a register I'm in the WRONG BANK! Even worse, registers that are used together are in DIFFERENT BANKS so I HAVE to bank switch and waste time CONSTANTLY!
Oh well, next project. Another 16 bit PIC. Oh this is nice, a highly configurable internal clock. Oh shit... highly configurable internal clock = really confusing datasheet. Oh well, I'll make an excel spreadsheet. CRAP... their examples are wrong again. CRAP CRAP its not working, oh, I have to write to the registers in a certain order to adjust the clock frequency. Hmm... whats that order.... (15 min later) oh finally, there it is. What does it say to do.... step 1, perform the unlock high byte routine. step 2, write the new data to the high by... WTF!? WTF IS THE "UNLOCK HIGH BYTE ROUTINE!!!" WTF IS IT? WTF WTF WTF IS IIIIIIITTTTT!!!" Its NOT in the datasheet, its NOT in the compiler documentation. I had to download code example after code example until I found someone that did it WITHOUT using their built in compiler routines.
Next project. Wow, this one uses a lot of UARTs. Not a problem, our compiler can handle it (<--- sarcasm). Our elevendy billion dollar compiler, that supports this chip, DOESN'T HAVE MOST OF THE UART CONTROLLING REGISTERS DEFINED! Not only that, but the registers for enabling interrupts for uarts 3 and 4 WERE DEFINED INCORRECTLY!!!! So I spent an hour first determining WHAT was defined, and then dividing that into defined correctly and incorrectly. I spent the next 90 minutes updating the header files to define the controls for UARTs 3 and 4.
Ohhhh... lets move on to the PIC simulator. Is there some kind of rule that you can't define a static variable initialized to something other than 0? I don't know, but if there is a rule against it, the compiler doesn't generate a warning. What it does generate though is NO DEBUG INFORMATION FOR ANY FUNCTION COMPILED AFTER A STATIC VARIABLE IS INITIALIZED WHEN IT IS DEFINED! For example, say I have 3 .c files in my project. main.c, led.c, and uart.c. Lets say in led.c I have 3 functions and function 2 has a line "static Uint8 state = 1;". Now, lets say that the compiler compiles main first, then led, then uart. I will be able to step through code in main, I will be able to step through code in the first and second functions of led but not the third, and I will NOT be able to step through ANY functions in uart! If I move function 2 in led so that it is at the end of the file, then I can step through all of main and led, but still not uart! If I remove led from the project and then add it back in, it gets compiled last, so I can step through everything.
HOLY CRAP it took me nearly a DAY to figure out that initializing a static variable when it is defined KILLS DEBUG INFO WITHOUT WARNING!