+ int i=1000;
+ char *choice=(char *) 0x200; //First word of RAM.
+ #ifdef __MSP430_HAS_PORT8__
+ P8SEL = 0; // disable XT2 on P8.7/8
+ #endif
+
+ if(CALBC1_16MHZ!=0xFF){
+ //Info is intact, use it.
+ BCSCTL1 = CALBC1_16MHZ;
+ DCOCTL = CALDCO_16MHZ;
+ }else{
+ /*
+ Info is missing, guess at a good value.
+
+ For now, the choice doesn't jump backward after a successful
+ connection. For that reason, keep this list as small as possible.
+ Future revisions will subtract one from choice[0] after a successful
+ connection, keeping choice[1] as the target.
+ */
+
+ #define CHOICES 4
+ DCOCTL = 0x00; //clear DCO
+ switch(choice[0]++%CHOICES){
+ default:
+ case 0:
+ BCSCTL1 = 0x8f; //CALBC1_16MHZ at 0x10f9
+ DCOCTL = 0x83; //CALDCO_16MHZ at 0x10f8
+ break;
+ case 1:
+ BCSCTL1 = 0x8f;
+ DCOCTL = 0x95;
+ break;
+ case 2:
+ BCSCTL1 = 0x8f;
+ DCOCTL = 0x6c;
+ break;
+ case 3:
+ BCSCTL1 = 0x8e;
+ DCOCTL = 0xdc;
+ break;
+ }
+ }
+
+ //Minor delay.
+ while(i--);