Webserver basic for CDU

Dependencies:   mbed

Fork of EasyWebCR by Igor Skochinsky

Committer:
igorsk
Date:
Fri Jan 29 21:46:31 2010 +0000
Revision:
0:12b53511e212

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
igorsk 0:12b53511e212 1 /******************************************************************
igorsk 0:12b53511e212 2 ***** *****
igorsk 0:12b53511e212 3 ***** Name: easyweb.c *****
igorsk 0:12b53511e212 4 ***** Ver.: 1.0 *****
igorsk 0:12b53511e212 5 ***** Date: 07/05/2001 *****
igorsk 0:12b53511e212 6 ***** Auth: Andreas Dannenberg *****
igorsk 0:12b53511e212 7 ***** HTWK Leipzig *****
igorsk 0:12b53511e212 8 ***** university of applied sciences *****
igorsk 0:12b53511e212 9 ***** Germany *****
igorsk 0:12b53511e212 10 ***** adannenb@et.htwk-leipzig.de *****
igorsk 0:12b53511e212 11 ***** Func: implements a dynamic HTTP-server by using *****
igorsk 0:12b53511e212 12 ***** the easyWEB-API *****
igorsk 0:12b53511e212 13 ***** Rem.: In IAR-C, use linker option *****
igorsk 0:12b53511e212 14 ***** "-e_medium_write=_formatted_write" *****
igorsk 0:12b53511e212 15 ***** *****
igorsk 0:12b53511e212 16 ******************************************************************/
igorsk 0:12b53511e212 17
igorsk 0:12b53511e212 18 // Modifications by Code Red Technologies for NXP LPC1768
igorsk 0:12b53511e212 19
igorsk 0:12b53511e212 20 // CodeRed - removed header for MSP430 microcontroller
igorsk 0:12b53511e212 21 //#include "msp430x14x.h"
igorsk 0:12b53511e212 22
igorsk 0:12b53511e212 23 #include "mbed.h"
igorsk 0:12b53511e212 24
igorsk 0:12b53511e212 25 #include "stdlib.h"
igorsk 0:12b53511e212 26 #include "stdio.h"
igorsk 0:12b53511e212 27 #include "string.h"
igorsk 0:12b53511e212 28
igorsk 0:12b53511e212 29 #include "easyweb.h"
igorsk 0:12b53511e212 30
igorsk 0:12b53511e212 31 // CodeRed - removed header for original ethernet controller
igorsk 0:12b53511e212 32 //#include "cs8900.c" // ethernet packet driver
igorsk 0:12b53511e212 33
igorsk 0:12b53511e212 34 //CodeRed - added for LPC ethernet controller
igorsk 0:12b53511e212 35 #include "ethmac.h"
igorsk 0:12b53511e212 36
igorsk 0:12b53511e212 37 // CodeRed - include .h rather than .c file
igorsk 0:12b53511e212 38 // #include "tcpip.c" // easyWEB TCP/IP stack
igorsk 0:12b53511e212 39 #include "tcpip.h" // easyWEB TCP/IP stack
igorsk 0:12b53511e212 40
igorsk 0:12b53511e212 41 // CodeRed - added NXP LPC register definitions header
igorsk 0:12b53511e212 42 // CodeRed - include renamed .h rather than .c file
igorsk 0:12b53511e212 43 // #include "webside.c" // webside for our HTTP server (HTML)
igorsk 0:12b53511e212 44 #include "webside.h" // webside for our HTTP server (HTML)
igorsk 0:12b53511e212 45
igorsk 0:12b53511e212 46
igorsk 0:12b53511e212 47
igorsk 0:12b53511e212 48 // CodeRed - added for use in dynamic side of web page
igorsk 0:12b53511e212 49 unsigned int aaPagecounter=0;
igorsk 0:12b53511e212 50 unsigned int adcValue = 0;
igorsk 0:12b53511e212 51
igorsk 0:12b53511e212 52 int main (void)
igorsk 0:12b53511e212 53 {
igorsk 0:12b53511e212 54 // CodeRed - removed init functions as not required for LPC1776
igorsk 0:12b53511e212 55 // InitOsc();
igorsk 0:12b53511e212 56 // InitPorts();
igorsk 0:12b53511e212 57
igorsk 0:12b53511e212 58
igorsk 0:12b53511e212 59 // CodeRed - added info message
igorsk 0:12b53511e212 60 printf("Setting up TCP/IP with IP address: ");
igorsk 0:12b53511e212 61 printf("%d.%d.%d.%d\n",MYIP_1,MYIP_2,MYIP_3,MYIP_4);
igorsk 0:12b53511e212 62
igorsk 0:12b53511e212 63 TCPLowLevelInit();
igorsk 0:12b53511e212 64
igorsk 0:12b53511e212 65 /*
igorsk 0:12b53511e212 66 *(unsigned char *)RemoteIP = 24; // uncomment those lines to get the
igorsk 0:12b53511e212 67 *((unsigned char *)RemoteIP + 1) = 8; // quote of the day from a real
igorsk 0:12b53511e212 68 *((unsigned char *)RemoteIP + 2) = 69; // internet server! (gateway must be
igorsk 0:12b53511e212 69 *((unsigned char *)RemoteIP + 3) = 7; // set to your LAN-router)
igorsk 0:12b53511e212 70
igorsk 0:12b53511e212 71 TCPLocalPort = 2025;
igorsk 0:12b53511e212 72 TCPRemotePort = TCP_PORT_QOTD;
igorsk 0:12b53511e212 73
igorsk 0:12b53511e212 74 TCPActiveOpen();
igorsk 0:12b53511e212 75
igorsk 0:12b53511e212 76 while (SocketStatus & SOCK_ACTIVE) // read the quote from memory
igorsk 0:12b53511e212 77 { // by using the hardware-debugger
igorsk 0:12b53511e212 78 DoNetworkStuff();
igorsk 0:12b53511e212 79 }
igorsk 0:12b53511e212 80 */
igorsk 0:12b53511e212 81
igorsk 0:12b53511e212 82 HTTPStatus = 0; // clear HTTP-server's flag register
igorsk 0:12b53511e212 83
igorsk 0:12b53511e212 84 TCPLocalPort = TCP_PORT_HTTP; // set port we want to listen to
igorsk 0:12b53511e212 85
igorsk 0:12b53511e212 86 // CodeRed - added info message
igorsk 0:12b53511e212 87 printf("Webserver started\n");
igorsk 0:12b53511e212 88
igorsk 0:12b53511e212 89 while (1) // repeat forever
igorsk 0:12b53511e212 90 {
igorsk 0:12b53511e212 91 if (!(SocketStatus & SOCK_ACTIVE)) TCPPassiveOpen(); // listen for incoming TCP-connection
igorsk 0:12b53511e212 92 DoNetworkStuff(); // handle network and easyWEB-stack
igorsk 0:12b53511e212 93 // events
igorsk 0:12b53511e212 94 HTTPServer();
igorsk 0:12b53511e212 95 }
igorsk 0:12b53511e212 96 }
igorsk 0:12b53511e212 97
igorsk 0:12b53511e212 98 // This function implements a very simple dynamic HTTP-server.
igorsk 0:12b53511e212 99 // It waits until connected, then sends a HTTP-header and the
igorsk 0:12b53511e212 100 // HTML-code stored in memory. Before sending, it replaces
igorsk 0:12b53511e212 101 // some special strings with dynamic values.
igorsk 0:12b53511e212 102 // NOTE: For strings crossing page boundaries, replacing will
igorsk 0:12b53511e212 103 // not work. In this case, simply add some extra lines
igorsk 0:12b53511e212 104 // (e.g. CR and LFs) to the HTML-code.
igorsk 0:12b53511e212 105
igorsk 0:12b53511e212 106 void HTTPServer(void)
igorsk 0:12b53511e212 107 {
igorsk 0:12b53511e212 108 if (SocketStatus & SOCK_CONNECTED) // check if somebody has connected to our TCP
igorsk 0:12b53511e212 109 {
igorsk 0:12b53511e212 110 if (SocketStatus & SOCK_DATA_AVAILABLE) // check if remote TCP sent data
igorsk 0:12b53511e212 111 TCPReleaseRxBuffer(); // and throw it away
igorsk 0:12b53511e212 112
igorsk 0:12b53511e212 113 if (SocketStatus & SOCK_TX_BUF_RELEASED) // check if buffer is free for TX
igorsk 0:12b53511e212 114 {
igorsk 0:12b53511e212 115 if (!(HTTPStatus & HTTP_SEND_PAGE)) // init byte-counter and pointer to webside
igorsk 0:12b53511e212 116 { // if called the 1st time
igorsk 0:12b53511e212 117 HTTPBytesToSend = sizeof(WebSide) - 1; // get HTML length, ignore trailing zero
igorsk 0:12b53511e212 118 PWebSide = (unsigned char *)WebSide; // pointer to HTML-code
igorsk 0:12b53511e212 119 }
igorsk 0:12b53511e212 120
igorsk 0:12b53511e212 121 if (HTTPBytesToSend > MAX_TCP_TX_DATA_SIZE) // transmit a segment of MAX_SIZE
igorsk 0:12b53511e212 122 {
igorsk 0:12b53511e212 123 if (!(HTTPStatus & HTTP_SEND_PAGE)) // 1st time, include HTTP-header
igorsk 0:12b53511e212 124 {
igorsk 0:12b53511e212 125 memcpy(TCP_TX_BUF, GetResponse, sizeof(GetResponse) - 1);
igorsk 0:12b53511e212 126 memcpy(TCP_TX_BUF + sizeof(GetResponse) - 1, PWebSide, MAX_TCP_TX_DATA_SIZE - sizeof(GetResponse) + 1);
igorsk 0:12b53511e212 127 HTTPBytesToSend -= MAX_TCP_TX_DATA_SIZE - sizeof(GetResponse) + 1;
igorsk 0:12b53511e212 128 PWebSide += MAX_TCP_TX_DATA_SIZE - sizeof(GetResponse) + 1;
igorsk 0:12b53511e212 129 }
igorsk 0:12b53511e212 130 else
igorsk 0:12b53511e212 131 {
igorsk 0:12b53511e212 132 memcpy(TCP_TX_BUF, PWebSide, MAX_TCP_TX_DATA_SIZE);
igorsk 0:12b53511e212 133 HTTPBytesToSend -= MAX_TCP_TX_DATA_SIZE;
igorsk 0:12b53511e212 134 PWebSide += MAX_TCP_TX_DATA_SIZE;
igorsk 0:12b53511e212 135 }
igorsk 0:12b53511e212 136
igorsk 0:12b53511e212 137 TCPTxDataCount = MAX_TCP_TX_DATA_SIZE; // bytes to xfer
igorsk 0:12b53511e212 138 InsertDynamicValues(); // exchange some strings...
igorsk 0:12b53511e212 139 TCPTransmitTxBuffer(); // xfer buffer
igorsk 0:12b53511e212 140 }
igorsk 0:12b53511e212 141 else if (HTTPBytesToSend) // transmit leftover bytes
igorsk 0:12b53511e212 142 {
igorsk 0:12b53511e212 143 memcpy(TCP_TX_BUF, PWebSide, HTTPBytesToSend);
igorsk 0:12b53511e212 144 TCPTxDataCount = HTTPBytesToSend; // bytes to xfer
igorsk 0:12b53511e212 145 InsertDynamicValues(); // exchange some strings...
igorsk 0:12b53511e212 146 TCPTransmitTxBuffer(); // send last segment
igorsk 0:12b53511e212 147 TCPClose(); // and close connection
igorsk 0:12b53511e212 148 HTTPBytesToSend = 0; // all data sent
igorsk 0:12b53511e212 149 }
igorsk 0:12b53511e212 150
igorsk 0:12b53511e212 151 HTTPStatus |= HTTP_SEND_PAGE; // ok, 1st loop executed
igorsk 0:12b53511e212 152 }
igorsk 0:12b53511e212 153 }
igorsk 0:12b53511e212 154 else
igorsk 0:12b53511e212 155 HTTPStatus &= ~HTTP_SEND_PAGE; // reset help-flag if not connected
igorsk 0:12b53511e212 156 }
igorsk 0:12b53511e212 157
igorsk 0:12b53511e212 158
igorsk 0:12b53511e212 159
igorsk 0:12b53511e212 160
igorsk 0:12b53511e212 161 // Code Red - GetAD7Val function replaced
igorsk 0:12b53511e212 162 // Rather than using the AD convertor, in this version we simply increment
igorsk 0:12b53511e212 163 // a counter the function is called, wrapping at 1024.
igorsk 0:12b53511e212 164 volatile unsigned int aaScrollbar = 400;
igorsk 0:12b53511e212 165
igorsk 0:12b53511e212 166 unsigned int GetAD7Val(void)
igorsk 0:12b53511e212 167 {
igorsk 0:12b53511e212 168 aaScrollbar = (aaScrollbar +16) % 1024;
igorsk 0:12b53511e212 169 adcValue = (aaScrollbar / 10) * 1000/1024;
igorsk 0:12b53511e212 170 return aaScrollbar;
igorsk 0:12b53511e212 171 }
igorsk 0:12b53511e212 172
igorsk 0:12b53511e212 173 // Code Red - Original MSP430 version of GetAD7Val() removed
igorsk 0:12b53511e212 174 /*
igorsk 0:12b53511e212 175 // samples and returns the AD-converter value of channel 7
igorsk 0:12b53511e212 176 // (associated with Port P6.7)
igorsk 0:12b53511e212 177
igorsk 0:12b53511e212 178 unsigned int GetAD7Val(void)
igorsk 0:12b53511e212 179 {
igorsk 0:12b53511e212 180 ADC12CTL0 = ADC12ON | SHT0_15 | REF2_5V | REFON; // ADC on, int. ref. on (2,5 V),
igorsk 0:12b53511e212 181 // single channel single conversion
igorsk 0:12b53511e212 182 ADC12CTL1 = ADC12SSEL_2 | ADC12DIV_7 | CSTARTADD_0 | SHP;// MCLK / 8 = 1 MHz
igorsk 0:12b53511e212 183
igorsk 0:12b53511e212 184 ADC12MCTL0 = SREF_1 | INCH_7; // int. ref., channel 7
igorsk 0:12b53511e212 185
igorsk 0:12b53511e212 186 ADC12CTL0 |= ENC; // enable conversion
igorsk 0:12b53511e212 187 ADC12CTL0 |= ADC12SC; // sample & convert
igorsk 0:12b53511e212 188
igorsk 0:12b53511e212 189 while (ADC12CTL0 & ADC12SC); // wait until conversion is complete
igorsk 0:12b53511e212 190
igorsk 0:12b53511e212 191 ADC12CTL0 &= ~ENC; // disable conversion
igorsk 0:12b53511e212 192
igorsk 0:12b53511e212 193 return ADC12MEM0 / 41; // scale 12 bit value to 0..100%
igorsk 0:12b53511e212 194 }
igorsk 0:12b53511e212 195
igorsk 0:12b53511e212 196 // End of Original MSP430 version of GetAD7Val()
igorsk 0:12b53511e212 197 */
igorsk 0:12b53511e212 198
igorsk 0:12b53511e212 199
igorsk 0:12b53511e212 200 // Code Red - Original GetTempVal() removed
igorsk 0:12b53511e212 201 // Function no longer used
igorsk 0:12b53511e212 202 /*
igorsk 0:12b53511e212 203 // samples and returns AD-converter value of channel 10
igorsk 0:12b53511e212 204 // (MSP430's internal temperature reference diode)
igorsk 0:12b53511e212 205 // NOTE: to get a more exact value, 8-times oversampling is used
igorsk 0:12b53511e212 206
igorsk 0:12b53511e212 207 unsigned int GetTempVal(void)
igorsk 0:12b53511e212 208 {
igorsk 0:12b53511e212 209 unsigned long ReturnValue;
igorsk 0:12b53511e212 210
igorsk 0:12b53511e212 211 ADC12CTL0 = ADC12ON | SHT0_15 | MSH | REFON; // ADC on, int. ref. on (1,5 V),
igorsk 0:12b53511e212 212 // multiple sample & conversion
igorsk 0:12b53511e212 213 ADC12CTL1 = ADC12SSEL_2 | ADC12DIV_7 | CSTARTADD_0 | CONSEQ_1 | SHP; // MCLK / 8 = 1 MHz
igorsk 0:12b53511e212 214
igorsk 0:12b53511e212 215 ADC12MCTL0 = SREF_1 | INCH_10; // int. ref., channel 10
igorsk 0:12b53511e212 216 ADC12MCTL1 = SREF_1 | INCH_10; // int. ref., channel 10
igorsk 0:12b53511e212 217 ADC12MCTL2 = SREF_1 | INCH_10; // int. ref., channel 10
igorsk 0:12b53511e212 218 ADC12MCTL3 = SREF_1 | INCH_10; // int. ref., channel 10
igorsk 0:12b53511e212 219 ADC12MCTL4 = SREF_1 | INCH_10; // int. ref., channel 10
igorsk 0:12b53511e212 220 ADC12MCTL5 = SREF_1 | INCH_10; // int. ref., channel 10
igorsk 0:12b53511e212 221 ADC12MCTL6 = SREF_1 | INCH_10; // int. ref., channel 10
igorsk 0:12b53511e212 222 ADC12MCTL7 = EOS | SREF_1 | INCH_10; // int. ref., channel 10, last seg.
igorsk 0:12b53511e212 223
igorsk 0:12b53511e212 224 ADC12CTL0 |= ENC; // enable conversion
igorsk 0:12b53511e212 225 ADC12CTL0 |= ADC12SC; // sample & convert
igorsk 0:12b53511e212 226
igorsk 0:12b53511e212 227 while (ADC12CTL0 & ADC12SC); // wait until conversion is complete
igorsk 0:12b53511e212 228
igorsk 0:12b53511e212 229 ADC12CTL0 &= ~ENC; // disable conversion
igorsk 0:12b53511e212 230
igorsk 0:12b53511e212 231 ReturnValue = ADC12MEM0; // sum up values...
igorsk 0:12b53511e212 232 ReturnValue += ADC12MEM1;
igorsk 0:12b53511e212 233 ReturnValue += ADC12MEM2;
igorsk 0:12b53511e212 234 ReturnValue += ADC12MEM3;
igorsk 0:12b53511e212 235 ReturnValue += ADC12MEM4;
igorsk 0:12b53511e212 236 ReturnValue += ADC12MEM5;
igorsk 0:12b53511e212 237 ReturnValue += ADC12MEM6;
igorsk 0:12b53511e212 238 ReturnValue += ADC12MEM7;
igorsk 0:12b53511e212 239
igorsk 0:12b53511e212 240 ReturnValue >>= 3; // ... and divide by 8
igorsk 0:12b53511e212 241
igorsk 0:12b53511e212 242 if (ReturnValue < 2886) ReturnValue = 2886; // lower bound (0% = 20�C)
igorsk 0:12b53511e212 243 ReturnValue = (ReturnValue - 2886) / 2.43; // convert AD-value to a temperature from
igorsk 0:12b53511e212 244 // 20�C...45�C represented by a value
igorsk 0:12b53511e212 245 // of 0...100%
igorsk 0:12b53511e212 246 if (ReturnValue > 100) ReturnValue = 100; // upper bound (100% = 45�C)
igorsk 0:12b53511e212 247
igorsk 0:12b53511e212 248 return ReturnValue;
igorsk 0:12b53511e212 249 }
igorsk 0:12b53511e212 250 // End of Original MSP430 version of GetTempVal()
igorsk 0:12b53511e212 251 */
igorsk 0:12b53511e212 252
igorsk 0:12b53511e212 253
igorsk 0:12b53511e212 254 // searches the TX-buffer for special strings and replaces them
igorsk 0:12b53511e212 255 // with dynamic values (AD-converter results)
igorsk 0:12b53511e212 256
igorsk 0:12b53511e212 257 // Code Red - new version of InsertDynamicValues()
igorsk 0:12b53511e212 258 void InsertDynamicValues(void)
igorsk 0:12b53511e212 259 {
igorsk 0:12b53511e212 260 unsigned char *Key;
igorsk 0:12b53511e212 261 char NewKey[6];
igorsk 0:12b53511e212 262 unsigned int i;
igorsk 0:12b53511e212 263
igorsk 0:12b53511e212 264 if (TCPTxDataCount < 4) return; // there can't be any special string
igorsk 0:12b53511e212 265
igorsk 0:12b53511e212 266 Key = TCP_TX_BUF;
igorsk 0:12b53511e212 267
igorsk 0:12b53511e212 268 for (i = 0; i < (TCPTxDataCount - 3); i++)
igorsk 0:12b53511e212 269 {
igorsk 0:12b53511e212 270 if (*Key == 'A')
igorsk 0:12b53511e212 271 if (*(Key + 1) == 'D')
igorsk 0:12b53511e212 272 if (*(Key + 3) == '%')
igorsk 0:12b53511e212 273 switch (*(Key + 2))
igorsk 0:12b53511e212 274 {
igorsk 0:12b53511e212 275 case '8' : // "AD8%"?
igorsk 0:12b53511e212 276 {
igorsk 0:12b53511e212 277 sprintf(NewKey, "%04d", GetAD7Val()); // insert pseudo-ADconverter value
igorsk 0:12b53511e212 278 memcpy(Key, NewKey, 4);
igorsk 0:12b53511e212 279 break;
igorsk 0:12b53511e212 280 }
igorsk 0:12b53511e212 281 case '7' : // "AD7%"?
igorsk 0:12b53511e212 282 {
igorsk 0:12b53511e212 283 sprintf(NewKey, "%3u", adcValue); // copy saved value from previous read
igorsk 0:12b53511e212 284 memcpy(Key, NewKey, 3);
igorsk 0:12b53511e212 285 break;
igorsk 0:12b53511e212 286 }
igorsk 0:12b53511e212 287 case '1' : // "AD1%"?
igorsk 0:12b53511e212 288 {
igorsk 0:12b53511e212 289 sprintf(NewKey, "%4u", ++aaPagecounter); // increment and insert page counter
igorsk 0:12b53511e212 290 memcpy(Key, NewKey, 4);
igorsk 0:12b53511e212 291 // *(Key + 3) = ' ';
igorsk 0:12b53511e212 292 break;
igorsk 0:12b53511e212 293 }
igorsk 0:12b53511e212 294 }
igorsk 0:12b53511e212 295 Key++;
igorsk 0:12b53511e212 296 }
igorsk 0:12b53511e212 297 }
igorsk 0:12b53511e212 298
igorsk 0:12b53511e212 299
igorsk 0:12b53511e212 300 // Code Red - commented out original InsertDynamicValues()
igorsk 0:12b53511e212 301 /*
igorsk 0:12b53511e212 302 void InsertDynamicValues(void)
igorsk 0:12b53511e212 303 {
igorsk 0:12b53511e212 304 unsigned char *Key;
igorsk 0:12b53511e212 305 unsigned char NewKey[5];
igorsk 0:12b53511e212 306 unsigned int i;
igorsk 0:12b53511e212 307
igorsk 0:12b53511e212 308 if (TCPTxDataCount < 4) return; // there can't be any special string
igorsk 0:12b53511e212 309
igorsk 0:12b53511e212 310 Key = TCP_TX_BUF;
igorsk 0:12b53511e212 311
igorsk 0:12b53511e212 312 for (i = 0; i < (TCPTxDataCount - 3); i++)
igorsk 0:12b53511e212 313 {
igorsk 0:12b53511e212 314 if (*Key == 'A')
igorsk 0:12b53511e212 315 if (*(Key + 1) == 'D')
igorsk 0:12b53511e212 316 if (*(Key + 3) == '%')
igorsk 0:12b53511e212 317 switch (*(Key + 2))
igorsk 0:12b53511e212 318 {
igorsk 0:12b53511e212 319 case '7' : // "AD7%"?
igorsk 0:12b53511e212 320 {
igorsk 0:12b53511e212 321 sprintf(NewKey, "%3u", GetAD7Val()); // insert AD converter value
igorsk 0:12b53511e212 322 memcpy(Key, NewKey, 3); // channel 7 (P6.7)
igorsk 0:12b53511e212 323 break;
igorsk 0:12b53511e212 324 }
igorsk 0:12b53511e212 325 case 'A' : // "ADA%"?
igorsk 0:12b53511e212 326 {
igorsk 0:12b53511e212 327 sprintf(NewKey, "%3u", GetTempVal()); // insert AD converter value
igorsk 0:12b53511e212 328 memcpy(Key, NewKey, 3); // channel 10 (temp.-diode)
igorsk 0:12b53511e212 329 break;
igorsk 0:12b53511e212 330 }
igorsk 0:12b53511e212 331 }
igorsk 0:12b53511e212 332 Key++;
igorsk 0:12b53511e212 333 }
igorsk 0:12b53511e212 334 }
igorsk 0:12b53511e212 335
igorsk 0:12b53511e212 336 // Code Red - End of original InsertDynamicValues ()
igorsk 0:12b53511e212 337 */
igorsk 0:12b53511e212 338
igorsk 0:12b53511e212 339 // Code Red - Deleted InitOsc() and InitPorts() as not required
igorsk 0:12b53511e212 340 // by LPC 1776
igorsk 0:12b53511e212 341
igorsk 0:12b53511e212 342 /*
igorsk 0:12b53511e212 343 // enables the 8MHz crystal on XT1 and use
igorsk 0:12b53511e212 344 // it as MCLK
igorsk 0:12b53511e212 345
igorsk 0:12b53511e212 346 void InitOsc(void)
igorsk 0:12b53511e212 347 {
igorsk 0:12b53511e212 348 WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
igorsk 0:12b53511e212 349
igorsk 0:12b53511e212 350 BCSCTL1 |= XTS; // XT1 as high-frequency
igorsk 0:12b53511e212 351 _BIC_SR(OSCOFF); // turn on XT1 oscillator
igorsk 0:12b53511e212 352
igorsk 0:12b53511e212 353 do // wait in loop until crystal is stable
igorsk 0:12b53511e212 354 IFG1 &= ~OFIFG;
igorsk 0:12b53511e212 355 while (IFG1 & OFIFG);
igorsk 0:12b53511e212 356
igorsk 0:12b53511e212 357 BCSCTL1 |= DIVA0; // ACLK = XT1 / 2
igorsk 0:12b53511e212 358 BCSCTL1 &= ~DIVA1;
igorsk 0:12b53511e212 359
igorsk 0:12b53511e212 360 IE1 &= ~WDTIE; // disable WDT int.
igorsk 0:12b53511e212 361 IFG1 &= ~WDTIFG; // clear WDT int. flag
igorsk 0:12b53511e212 362
igorsk 0:12b53511e212 363 WDTCTL = WDTPW | WDTTMSEL | WDTCNTCL | WDTSSEL | WDTIS1; // use WDT as timer, flag each
igorsk 0:12b53511e212 364 // 512 pulses from ACLK
igorsk 0:12b53511e212 365
igorsk 0:12b53511e212 366 while (!(IFG1 & WDTIFG)); // count 1024 pulses from XT1 (until XT1's
igorsk 0:12b53511e212 367 // amplitude is OK)
igorsk 0:12b53511e212 368
igorsk 0:12b53511e212 369 IFG1 &= ~OFIFG; // clear osc. fault int. flag
igorsk 0:12b53511e212 370 BCSCTL2 = SELM0 | SELM1; // set XT1 as MCLK
igorsk 0:12b53511e212 371 }
igorsk 0:12b53511e212 372
igorsk 0:12b53511e212 373 void InitPorts(void)
igorsk 0:12b53511e212 374 {
igorsk 0:12b53511e212 375 P1SEL = 0; // switch all unused ports to output
igorsk 0:12b53511e212 376 P1OUT = 0; // (rem.: ports 3 & 5 are set in "cs8900.c")
igorsk 0:12b53511e212 377 P1DIR = 0xFF;
igorsk 0:12b53511e212 378
igorsk 0:12b53511e212 379 P2SEL = 0;
igorsk 0:12b53511e212 380 P2OUT = 0;
igorsk 0:12b53511e212 381 P2DIR = 0xFF;
igorsk 0:12b53511e212 382
igorsk 0:12b53511e212 383 P4SEL = 0;
igorsk 0:12b53511e212 384 P4OUT = 0;
igorsk 0:12b53511e212 385 P4DIR = 0xFF;
igorsk 0:12b53511e212 386
igorsk 0:12b53511e212 387 P6SEL = 0x80; // use P6.7 for the ADC module
igorsk 0:12b53511e212 388 P6OUT = 0;
igorsk 0:12b53511e212 389 P6DIR = 0x7F; // all output except P6.7
igorsk 0:12b53511e212 390 }
igorsk 0:12b53511e212 391
igorsk 0:12b53511e212 392 */